<?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>Rico Mariani's Performance Tidbits</title><link>http://blogs.msdn.com/b/ricom/</link><description>Implying no warranties and conferring no rights: &amp;quot;AS IS&amp;quot; since 1988</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><item><title>Coding in Marble</title><link>http://blogs.msdn.com/b/ricom/archive/2012/02/02/coding-in-marble.aspx</link><pubDate>Fri, 03 Feb 2012 03:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10263508</guid><dc:creator>ricom</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10263508</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2012/02/02/coding-in-marble.aspx#comments</comments><description>&lt;p&gt;I wish I could remember where I first read it because perhaps it deserves attribution.&amp;nbsp; But many years ago I read about the two world views of physicists and they resonated with me.&amp;nbsp; One world view is that prescibed by things like &lt;a href="http://en.wikipedia.org/wiki/General_relativity"&gt;General Relativity&lt;/a&gt;&amp;nbsp;and &lt;a href="http://en.wikipedia.org/wiki/Maxwell%27s_equations"&gt;Maxwell's Equations&lt;/a&gt;.&amp;nbsp; These have, in some sense a great mathematical beauty to them.&amp;nbsp; This is the "the universe is made out of marble" viewpoint.&amp;nbsp; Nice clean fields.&amp;nbsp; Very solid.&amp;nbsp; Then there's the other perspective, this is the perspective you have in systems like &lt;a href="http://en.wikipedia.org/wiki/Quantum_electrodynamics"&gt;Quantum Electrodynamics&lt;/a&gt;.&amp;nbsp; There are lots of particles flying all over the place and probabilities.&amp;nbsp; Lots of statistics.&amp;nbsp; The universe is a messy organic place.&amp;nbsp; It might have been tempting to take those people and lock them away or something but darn it if they didn't keep getting great results.&amp;nbsp; So Marble and Wood.&amp;nbsp; The highly regular vs. messier put powerful.&amp;nbsp; I soon started using this analogy in computer science and that's what I'm writing about today.&lt;/p&gt;
&lt;p&gt;One place this comes up is when programming with &lt;a href="http://en.wikipedia.org/wiki/Promise_(programming)"&gt;promises&lt;/a&gt;, or really any notification system even ad hoc ones.&amp;nbsp; In the case of a promise the situation is that you have some work that needs to be done "later" after some asynchronous operation has completed:&amp;nbsp;&amp;nbsp;let's say that you are waiting for some data and when it arrives you're going to validate and extract some values from it, it doesn't much matter.&amp;nbsp; The natural way to do this with a promise would look something like this:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;p.then( () =&amp;gt; {do your work} )&lt;/p&gt;
&lt;p&gt;or in javascript you might write&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;p.then( function() { do your work } )&lt;/p&gt;
&lt;p&gt;In fact you can keep combining these things, if you have more work that has to be done after the first batch asynchronously completes you might end up writing something like this:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;p.then( () =&amp;gt; {do your work} ).then( () =&amp;gt; {do more work}).then( () =&amp;gt; {even more work});&lt;/p&gt;
&lt;p&gt;Now the next thing that's going to happen is you're going to put this in a loop for your various 'p' read operations that need to happen and presto magico your application is done.&amp;nbsp; And you've fallen into the wood trap.&lt;/p&gt;
&lt;p&gt;The reason that I try to avoid this pattern is that what's happened now is that on every iteration you're creating&amp;nbsp;delegate objects and new promise objects that connect the various stages for each operation.&amp;nbsp; But the thing is they're all the same!&amp;nbsp; Despite the fact that all the objects are being handled identically (typical) we get no savings, we are using the most general dispatch mechanism to dispatch the very same code thereby creating far more garbage than is needed.&amp;nbsp; Of course each one of these promise chains encourages the next guy to keep doing the same thing.&amp;nbsp; You could even add stages that merge, select, batch, whatever you need, more stages, more wood.&lt;/p&gt;
&lt;p&gt;The hallmark of the wood pattern is that the same chain of dependencies/computations is re-represented in data repeatedly --&amp;nbsp;achieving no savings for its sameness.&amp;nbsp; It &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; the most flexible choice, each datum could be handled seperately in a unique fashion but they probably are not.&lt;/p&gt;
&lt;p&gt;How can you make it better?&lt;/p&gt;
&lt;p&gt;Well of course a different pattern alltogther might be the right choice, something that looks more like this:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;datasource.handler += () =&amp;gt; { do your work }&lt;/p&gt;
&lt;p&gt;or maybe&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;w1 = new {worker stage one object }&lt;br /&gt;w2 = new {stage 2 handler};&lt;br /&gt;&lt;br /&gt;datasource.handler += w1;&lt;br /&gt;w1.stage2 += w2;&lt;/p&gt;
&lt;p&gt;Now this isn't as flexible but it is much more economical.&amp;nbsp; With one fell swoop we're saying that they are all going to be handled symmetrically and we do not have allocation cost per datum.&lt;/p&gt;
&lt;p&gt;Even if that kind of refactoring isn't possible just this simple thing might be very helpful.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;var d1 = () =&amp;gt; {do your work};&lt;br /&gt;var d2 = () =&amp;gt; {do more work};&lt;br /&gt;var d3 = () =&amp;gt; {even more work};&lt;br /&gt;&lt;br /&gt;p.then(d1).then(d2).then(d3);&amp;nbsp; // this in your loop&lt;/p&gt;
&lt;p&gt;This second form avoids creating a whole new delegate/closure in each loop iteration so in some sense it's at least partly marblized.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now of course this kind of transform isn't universally possible but if you start by saying "what are the rules for all my data" and then encoding that then you tend to end up in a place where you have low-to-zero overhead costs for each item and you just do the work.&amp;nbsp; If you don't you can easily end up in a place where there most flexible pattern is being used in a very regular way, at great cost.&lt;/p&gt;
&lt;p&gt;I've often admonished people to use the &lt;a href="http://blogs.msdn.com/b/ricom/archive/2004/08/24/219751.aspx"&gt;simplest&amp;nbsp;programming technique &lt;/a&gt;that will do the job to get the best performance.&amp;nbsp; Specifically, don't use virtual methods if non-virtual will do.&amp;nbsp; Don't use interfaces if virtuals will do.&amp;nbsp; Don't use delegates if interfaces will do.&amp;nbsp; This discussion has in some ways been a rehash of that point.&amp;nbsp; But then I always found that grounding a concept in an example is helpful so hopefully you all found it worth the read.&lt;/p&gt;
&lt;p&gt;P.S. I'm putting the "wood" programming technique in a bad light here but it has its place.&amp;nbsp; And that doesn't mean I'm down on "wood" physics.&amp;nbsp; I happen to think QED is every bit as&amp;nbsp;cool as cool as relativity :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10263508" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/design+advice/">design advice</category></item><item><title>Ngen or not?  The rules haven't changed very much since 2004</title><link>http://blogs.msdn.com/b/ricom/archive/2012/01/31/ngen-or-not-the-rules-haven-t-changed-very-much-since-2004.aspx</link><pubDate>Tue, 31 Jan 2012 20:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10262452</guid><dc:creator>ricom</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10262452</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2012/01/31/ngen-or-not-the-rules-haven-t-changed-very-much-since-2004.aspx#comments</comments><description>&lt;p&gt;I still get questions that amount to "should I ngen my &amp;lt;something&amp;gt;" from time to time and the best answer I can give is still "it depends."&amp;nbsp; I wrote this article many years ago, and I'd say it's still pretty accurate: &lt;a href="http://blogs.msdn.com/b/ricom/archive/2004/10/18/244242.aspx"&gt;http://blogs.msdn.com/b/ricom/archive/2004/10/18/244242.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Essentially the situation is this: if you ngen your IL then of course the jit will not have to run but you will have to do more I/O because the compiled code is bigger than the IL.&amp;nbsp; If that I/O is likely to be cached because either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The code is going to be loaded "a goodly amount of time"&amp;nbsp;after ice cold startup and it's commonly used so &lt;a href="http://en.wikipedia.org/wiki/Windows_Vista_I/O_technologies#SuperFetch"&gt;superfetch&lt;/a&gt; is likely to fetch it, or&lt;/li&gt;
&lt;li&gt;The code is in a library shared by many programs and so only one of those programs at most will have to actually read it at full cost&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;then it's likely that ngen will help you overall.&lt;/p&gt;
&lt;p&gt;If that's not the case then ngen isn't likely to help you.&amp;nbsp; But really you need to measure for yourself.&lt;/p&gt;
&lt;p&gt;Remember also that the code generation for ngen'd binaries is going to tend to optimize for maximum sharability which may come at a (typically small) cost in raw speed so that's a factor as well.&lt;/p&gt;
&lt;p&gt;The most common framework DLLs, like mscorlib, system.dll and friends, tend to be get the most benefits from ngen.&amp;nbsp; Single-use application libraries and executables tend to get the least benefit.&lt;/p&gt;
&lt;p&gt;It's really hard to say more than that with any kind of precision.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10262452" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category></item><item><title>Improving .NET Application Performance and Scalability</title><link>http://blogs.msdn.com/b/ricom/archive/2012/01/11/improving-net-application-performance-and-scalability.aspx</link><pubDate>Wed, 11 Jan 2012 22:41:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10255728</guid><dc:creator>ricom</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10255728</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2012/01/11/improving-net-application-performance-and-scalability.aspx#comments</comments><description>&lt;p&gt;This series can still be found here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff649152.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff649152.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While some of the content is stale since it refers specifically to .NET 2.0 I think all of the conceptual content broadly applicable (even beyond managed code systems to software systems generally.)&lt;/p&gt;
&lt;p&gt;If you're looking for it some time in the future&amp;nbsp;you can find it again easily with bing.&amp;nbsp; I doubt that they'll get rid of it entirely for a very long time.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255728" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category></item><item><title>Performance and Design Guidelines for Data Access Layers</title><link>http://blogs.msdn.com/b/ricom/archive/2012/01/10/performance-and-design-guidelines-for-data-access-layers.aspx</link><pubDate>Tue, 10 Jan 2012 21:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10255291</guid><dc:creator>ricom</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10255291</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2012/01/10/performance-and-design-guidelines-for-data-access-layers.aspx#comments</comments><description>&lt;p&gt;Many problems you will face are actually the building data access layer, sometimes thinly disguised, sometimes in your face; it&amp;rsquo;s one of the broad patterns that you see in computer science &amp;ndash; as the clich&amp;eacute; says: it keeps rearing its ugly head.&lt;/p&gt;
&lt;p&gt;Despite this, the same sorts of mistakes tend to be made in the design of such systems so I&amp;rsquo;d like to offer a bit of hard-won advice on how to approach a data access problem. Mostly this is going to be in the form of patterns/anti-patterns but nonetheless I hope it will be useful.&lt;/p&gt;
&lt;p&gt;As always, in the interest of not writing a book, this advice is only approximately correct.&lt;/p&gt;
&lt;p&gt;The main thing that you should remember is that access to the data will take two general shapes.&amp;nbsp; In database parlance you might say some of the work will be &lt;a href="http://en.wikipedia.org/wiki/OLTP"&gt;OLTP&lt;/a&gt;-ish (online transaction processing) and some of the work will be &lt;a href="http://en.wikipedia.org/wiki/OLAP"&gt;OLAP&lt;/a&gt;-ish (online analytical processing).&amp;nbsp;&amp;nbsp; But simply, there&amp;rsquo;s how you update pieces of your data&amp;nbsp;and how your read chunks of it.&amp;nbsp; And they have different needs.&lt;/p&gt;
&lt;p&gt;At present it seems to me that people feel a strong temptation to put an OO interface around the data and expose that to customers.&amp;nbsp; This can be ok as part of the solution if you avoid some pitfalls, so I suggest you follow this advice:&lt;/p&gt;
&lt;p&gt;1. Consider the &lt;a href="http://en.wikipedia.org/wiki/Database_transaction"&gt;unit of work&lt;/a&gt; carefully&lt;/p&gt;
&lt;p&gt;There are likely to be several typical types of updates.&amp;nbsp; Make sure that you fetch enough data so that the typical cases do one batch of reads for necessary data, modify the data locally, and then write back that data in a batch.&amp;nbsp; If you read too much data you incur needless transfer costs, if you read too little data then you make too many round trips to do the whole job.&lt;/p&gt;
&lt;p&gt;You may have noticed that I began with a model where you fetch some data, change it locally, and write it back.&amp;nbsp; This is a fairly obvious thing to do given that you are going to want to do the write-back in probably a single transaction but it&amp;rsquo;s important to do this even if you aren&amp;rsquo;t working in a transacted system.&amp;nbsp; Consider an alternative:&amp;nbsp; if you were to provide some kind of proxy to the data to each client and then RPC each property change back to the server you are in a world of hurt.&amp;nbsp; Now the number of round trips is very high and furthermore it&amp;rsquo;s impossible to write correct code because two people could be changing the very same object at the same time in partial/uncoordinated ways.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This may seem like a silly thing to do but if the authoritative store isn&amp;rsquo;t a database it&amp;rsquo;s all too common for people to forget that the database rules exist for a reason and they probably apply to any kind of store at all.&amp;nbsp; Even if you&amp;rsquo;re using (e.g.) the registry or some other repository you still want to think about unit-of-work and make it so the each normal kind of update is a single operation.&lt;/p&gt;
&lt;p&gt;Whatever you do don&amp;rsquo;t create an API where each field read/write is remoted to get the value.&amp;nbsp; Besides the performance disaster this creates it&amp;rsquo;s impossible to understand what will happen if you several people are doing something like Provider.SomeValue += 1;&lt;/p&gt;
&lt;p&gt;2. Consider your &lt;a href="http://blogs.msdn.com/b/ricom/archive/2004/06/24/165063.aspx"&gt;locking strategy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Implicit in the discussion above is some notion of accepting or rejecting writes because the data has changed out from under you.&amp;nbsp; This is a normal situation and making it clear that it can and does happen and should be handled makes everyone&amp;rsquo;s life simpler.&amp;nbsp; This is another reason why an API like Provider.SomeValue = 1 to do the writes is a disaster.&amp;nbsp; How does it report failure?&amp;nbsp; And if it failed, how much failed?&lt;/p&gt;
&lt;p&gt;You can choose an &lt;a href="http://en.wikipedia.org/wiki/Optimistic_locking"&gt;optimistic locking&lt;/a&gt; strategy or something else but you&amp;rsquo;ll need one.&amp;nbsp; A sure sign that you have it right is that the failure mode is obvious, and the recovery is equally obvious.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I once had a conversation with &lt;a href="http://en.wikipedia.org/wiki/Jim_Gray_(computer_scientist)"&gt;Jim Gray&lt;/a&gt; where I told him how ironic it was to me that the only reason transactions could ever succeed at all in a hot system was that they had the option of failing.&amp;nbsp; Delicious irony that.&lt;/p&gt;
&lt;p&gt;Remember, even data from a proxy isn&amp;rsquo;t really live.&amp;nbsp; It&amp;rsquo;s an illusion.&amp;nbsp; The moment you say &amp;ldquo;var x = provider.X;&amp;rdquo;&amp;nbsp; your &amp;lsquo;x&amp;rsquo; is already potentially stale by the time it&amp;rsquo;s assigned.&amp;nbsp; Potentially stale data is the norm, it&amp;rsquo;s just a question of how stale and how do you recover. That means some kind of &lt;a href="http://blogs.msdn.com/b/ricom/archive/2006/04/24/582643.aspx"&gt;isolation&lt;/a&gt;&amp;nbsp;and locking choice is mandatory.&lt;/p&gt;
&lt;p&gt;3. Don&amp;rsquo;t forget the queries&lt;/p&gt;
&lt;p&gt;Even if you did everything else completely correctly you&amp;rsquo;ve still only built half the system if all you can do is read and modify entities.&amp;nbsp; The OLAP part of your system will want to do bulk reads like &amp;ldquo;find me all the photos for this week&amp;rdquo;.&amp;nbsp; When doing these types of accesses it is vital to take advantage of their read aspect.&amp;nbsp; Do not create transactable objects just bring back the necessary data in a raw form.&amp;nbsp; Simple arrays of primitives are the best choice; they have the smallest overheads.&amp;nbsp; Do not require multiple round-trips to get commonly required data or the fixed cost of the round trip will end up dwarfing the actual work you're trying to do.&lt;/p&gt;
&lt;p&gt;These queries are supposed to represent a snapshot in time according to whatever isolation model your data has (which comes back to the requirements created by your use cases and your unit of work).&amp;nbsp; If you force people to use your object interface to read raw data you will suffer horrible performance and you will likely have logically inconsistent views of your data.&amp;nbsp; Don&amp;rsquo;t do that.&lt;/p&gt;
&lt;p&gt;One of the reasons that systems like &lt;a href="http://blogs.msdn.com/b/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx"&gt;Linq to SQL&lt;/a&gt; were as successful as they were (from various perspectives I think) is that they obeyed these general guidelines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you can get a small amount of data or a large amount of data&lt;/li&gt;
&lt;li&gt;you can get objects or just data&lt;/li&gt;
&lt;li&gt;you can write back data chunks in units of your choice&lt;/li&gt;
&lt;li&gt;the failure mode for read/writes is clear, easy to deal with, and in-your-face (yes, reads can fail, too)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other data layers, while less general no doubt, would do well to follow the same set of rules.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255291" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/design+advice/">design advice</category></item><item><title>Performance Guidelines for Properties</title><link>http://blogs.msdn.com/b/ricom/archive/2011/12/19/performance-guidelines-for-properties.aspx</link><pubDate>Mon, 19 Dec 2011 20:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10249339</guid><dc:creator>ricom</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10249339</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2011/12/19/performance-guidelines-for-properties.aspx#comments</comments><description>&lt;p&gt;I can&amp;rsquo;t say I&amp;rsquo;ve asked the framework guidelines folks about this but I&amp;rsquo;m fairly sure there would be a lot of agreement from the guidelines gurus; so in the spirit of approximately correct advice I give you Rico&amp;rsquo;s Guidelines for Performant Properties.&lt;/p&gt;
&lt;p&gt;I should start by saying I wish more people just used fields instead of committing these terrible sins with their properties.&amp;nbsp; If we had the notion of a type-safe, read-only field the world would be a better place.&amp;nbsp; Alas&amp;hellip;&lt;/p&gt;
&lt;p&gt;So, you&amp;rsquo;re using a property, the most important thing to remember is that it will seem very much like a field in all ways.&amp;nbsp; It looks like a field and feels like a field, people will expect it to perform like a field.&amp;nbsp; So with that in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accessing the property should not allocate any memory; people are going to use this thing in loops walking over whatever data structure you are presenting, they expect that this data is sitting around and being accessed.&lt;/li&gt;
&lt;li&gt;Accessing the property should not &amp;ldquo;synchronize&amp;rdquo; &amp;ndash; if there is any locking to be done it should be done at a higher level than a single field, by the time you&amp;rsquo;ve acquired whatever object has the property on it, it should already be safe to read it.&lt;/li&gt;
&lt;li&gt;Accessing the property should not do any I/O, especially not any network I/O, again see above, by the time you&amp;rsquo;re reading the property the object offering it should have done whatever I/O was needed.&lt;/li&gt;
&lt;li&gt;Accessing the property should not be an operation with complexity greater than O(1) &amp;ndash; that means no loops.&amp;nbsp; At all.&amp;nbsp; You could haggle me as high as O(lg(N)) if we&amp;rsquo;re talking about an property that is an &amp;ldquo;indexer&amp;rdquo; but no higher.&lt;/li&gt;
&lt;li&gt;Accessing the property should not have side-effects (i.e. it's strictly a read operation, it changes nothing)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What you&amp;rsquo;re left with is you can use your object state and the argument (if an indexer) to do a constant-time lookup, or log-time at worst, in an already existing data structure and immediately return the result.&amp;nbsp; That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/brada/archive/2003/10/02/50420.aspx"&gt;Pit of Success&lt;/a&gt; is the only reason you need.&amp;nbsp; In my opinion, patterns more complicated than the above are doomed to fail.&amp;nbsp; If you allow say network access, an RPC or the like, on each property fetch, then you promote things like field-at-a-time access to remote data.&amp;nbsp; Not only is this astonishing to users of the API it is incredibly inefficient.&amp;nbsp; If you follow the rules above you soon realize that you must allow some kind of query to get the data you need and then you can use properties all you like to access that data.&amp;nbsp; That is a much better pattern, it leads to success.&lt;/p&gt;
&lt;p&gt;Remember that if you allow things like I/O or synchronization you can easily get property access times that are measured in milliseconds, this simply will not do.&amp;nbsp; A typical interactive scenario might have a budget of say 100ms for prompt response and it might require access to several dozen properties just to paint the screen properly.&amp;nbsp; This has several issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If property access is say 1 millisecond then accessing 10 properties (not at all crazy) would be 10% of your overall budget &amp;ndash; that&amp;rsquo;s nuts!&lt;/li&gt;
&lt;li&gt;The interactive code must be able to use your properties with confidence, that means they cannot block and should not be subject to large variability, else you get UI that is non-responsive for extended periods of time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Frequent access to properties is very common and therefore must be astonishingly cheap if only to keep a handle on the Joules your program consumes &amp;ndash; an increasingly important metric for modern platforms.&lt;/p&gt;
&lt;p&gt;From a time perspective, I like to see properties that have access time measured in nanoseconds.&amp;nbsp; Let&amp;rsquo;s say 10^-8s.&amp;nbsp; I can reasonably see systems with tricky indexing that might go has high as 10^-7 or even 10^-6.&amp;nbsp; When your time is getting to be 10^-5 or larger, you really need to start thinking about your design.&amp;nbsp; That&amp;rsquo;s too much work to put inside a thing that looks like a field access.&amp;nbsp; Give your users a fighting chance to understand where their costs are and let them query for a batch of results, probably asynchronously and then access them quickly when they arrive.&amp;nbsp; That&amp;rsquo;s going to be a successful pattern.&lt;/p&gt;
&lt;p&gt;It goes without saying that under these conditions, the flexibility to version/replace/subtype virtual-call properties is actually illusory.&amp;nbsp; If you were to try to do something new and costly, or even just very different in a subtype you would likely cause all manner of problems for callers.&amp;nbsp; So while you do get to change things a somewhat, you cannot and must not, use that flexibility to access new and different subsystems or the like inside of a method that is supposed to be as small as a getter.&amp;nbsp; You are necessarily very constrained.&lt;/p&gt;
&lt;p&gt;When I consider all of this I arrive squarely at the conclusion that more fields and fewer properties would be better.&amp;nbsp; Don&amp;rsquo;t hide real work inside a property and don&amp;rsquo;t use them as a synchronization tool.&amp;nbsp; Once you decide that you need a fetch/read pattern you soon find that that reading thing can be very simple/fast indeed and that perhaps fields were just fine after all.&lt;/p&gt;
&lt;p&gt;Something to think about anyway.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10249339" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/design+advice/">design advice</category></item><item><title>Going to Internet Explorer</title><link>http://blogs.msdn.com/b/ricom/archive/2011/11/12/going-to-internet-explorer.aspx</link><pubDate>Sat, 12 Nov 2011 17:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10236482</guid><dc:creator>ricom</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10236482</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2011/11/12/going-to-internet-explorer.aspx#comments</comments><description>&lt;p&gt;Many of you have commented that I've been kind of quiet lately.&amp;nbsp; This was largely a reflection of my job, I was working on an internal team that I could not write much about for the last couple of years.&amp;nbsp; I had a great experience there but that trek is now coming to an end.&amp;nbsp; In a few days I'll be working on Internet Explorer and back in the thick of the public facing products.&amp;nbsp; IE is a very exciting place to be and I'm sure it will be loaded with issues I can write about that will be of general interest without giving away product plans and so forth.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I hope to be writing a lot more&amp;nbsp;in the coming months.&lt;/p&gt;
&lt;p&gt;Thank you for your support over the years :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10236482" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/ramblings/">ramblings</category></item><item><title>Measure!</title><link>http://blogs.msdn.com/b/ricom/archive/2011/09/20/measure.aspx</link><pubDate>Tue, 20 Sep 2011 19:41:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10214228</guid><dc:creator>ricom</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10214228</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2011/09/20/measure.aspx#comments</comments><description>&lt;p&gt;I know I haven't posted for a while; I'm hoping that will change soon.&amp;nbsp; However in the mean time my daughter forwarded me this link because she thought it was cute.&lt;/p&gt;
&lt;p&gt;The thing is, she didn't realize it should be my theme song.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=MMsQYjYlBEo"&gt;http://www.youtube.com/watch?v=MMsQYjYlBEo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's rule #1&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ricom/archive/2003/12/02/40779.aspx"&gt;http://blogs.msdn.com/b/ricom/archive/2003/12/02/40779.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now even Sesame Street agrees!&amp;nbsp; It must be right!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10214228" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/recommendations/">recommendations</category></item><item><title>Less Loosely Coupled Than Meets The Eye</title><link>http://blogs.msdn.com/b/ricom/archive/2010/09/27/less-loosely-coupled-than-meets-the-eye.aspx</link><pubDate>Tue, 28 Sep 2010 04:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10068529</guid><dc:creator>ricom</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10068529</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/09/27/less-loosely-coupled-than-meets-the-eye.aspx#comments</comments><description>&lt;p&gt;I don&amp;rsquo;t know that it is possible to write anything like a unitary software system in a way that is truly loosely coupled.&amp;nbsp;&amp;nbsp; It&amp;rsquo;s not&amp;nbsp;that you can&amp;rsquo;t make boxes and lines that are cleanly separated in all sorts of pretty ways, though that&amp;rsquo;s hard enough.&amp;nbsp; The problem is that even if you manage to do that, what you end up with is actually still pretty tightly coupled.&lt;/p&gt;
&lt;p&gt;What do I mean?&lt;/p&gt;
&lt;p&gt;Well, let me use Visual Studio as an example.&amp;nbsp; It&amp;rsquo;s made up of all kinds of extensions which communicate through formal interfaces.&amp;nbsp; Putting aside the warts and just looking at how it was intended to work it seems pretty good.&amp;nbsp; You can make and replace pieces independently, there is a story for how now features light up; it&amp;rsquo;s all pretty good.&amp;nbsp; Yes, it could be better but let&amp;rsquo;s for the moment idealize what is there.&amp;nbsp; But is it loosely coupled, really?&lt;/p&gt;
&lt;p&gt;Well the answer is heck no.&lt;/p&gt;
&lt;p&gt;These systems all share resources in fundamental ways that actually tie them together pretty tightly.&amp;nbsp; It starts with the address space, each extension can be victimized by the others, and it goes on.&amp;nbsp; In fact every important resource on the machine is subject to direct interference between nominally isolated extensions.&amp;nbsp; Is this avoidable?&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think it is actually.&amp;nbsp; I think unitary software systems are fundamentally tightly coupled when you look at them through a performance lens.&amp;nbsp; And that is why I&amp;rsquo;m so often telling people that they need to look at their overall system and see if, when it&amp;rsquo;s all put together, it has any hope of working the way you want.&amp;nbsp; Two subsystems that both (loosely) use 2/3 of the L2 cache are going to use 4/3 of a cache&amp;hellip; that&amp;rsquo;s not good.&amp;nbsp; There may be no lines between them in the architecture diagram but they are going to destroy each others ability to work.&lt;/p&gt;
&lt;p&gt;So, does that about wrap it up for agile then?&amp;nbsp; Should we just waterfall our way to victory?&lt;/p&gt;
&lt;p&gt;Hardly.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Everything you&amp;rsquo;ve ever read about requirements changing and not over-designing systems that are loosely specified (much less loosely coupled) still applies, but just because you&amp;rsquo;re going agile and you want to keep your flexibility is no reason to not think about what it&amp;rsquo;s all going to look like when you put it all together.&amp;nbsp; Some kind of blend is needed.&lt;/p&gt;
&lt;p&gt;If you do run into problems that loose architecture is going to help you.&amp;nbsp; But waiting until you&amp;rsquo;re done and counting on your agility to save you at the finish line isn&amp;rsquo;t so smart either.&amp;nbsp; Agile development doesn&amp;rsquo;t prohibit you from planning out the parts that need planning and understanding your key constraints.&amp;nbsp; In fact I think it encourages this &amp;ndash; knowing your constraints keeps you honest and lets you make adjustments smartly as you go.&lt;/p&gt;
&lt;p&gt;Performance is never loosely coupled.&amp;nbsp; Don&amp;rsquo;t be fooled by your diagram, the profiler doesn&amp;rsquo;t know where your little boxes and lines are.&amp;nbsp; Trust me :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10068529" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/design+advice/">design advice</category></item><item><title>Debugging Multi-threaded Applications: Some Tidbits</title><link>http://blogs.msdn.com/b/ricom/archive/2010/06/04/debugging-multi-threaded-applications-some-tidbits.aspx</link><pubDate>Fri, 04 Jun 2010 20:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10020220</guid><dc:creator>ricom</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10020220</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/06/04/debugging-multi-threaded-applications-some-tidbits.aspx#comments</comments><description>&lt;p&gt;I was lamenting that we haven't really done terribly much to make multi-threaded debugging easier in say the last decade and I was fortunate enough to be able to have a conversation with Brain Crawford about it.&amp;nbsp;&amp;nbsp; Brian is a long-time friend an colleague, we worked on the VC++ debugger years ago, he's the lead architect for all things debugger these days.&amp;nbsp; Anyway, he gave me this succinct information about VS2010 and was kind enough to allow me to share it with you all.&lt;/p&gt;
&lt;p&gt;In his own words Brian writes:&lt;/p&gt;
&lt;p&gt;While I agree that there is more we could do to make multi-threaded debugging even better, VS 2010 has a number of features that help with multi-threaded debugging for both native and managed code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stepping has affinity with the thread being stepped. Whatever thread is active (has the yellow IP marker next to it in the Threads window) will be stepped and no other threads will complete the step started on that thread. However, by default, breakpoints will fire on any thread, so you can step one thread and hit a breakpoint on another. &lt;/li&gt;
&lt;li&gt;Any time you started execution (step or go) on a thread and execution stops on another thread (e.g. you hit a breakpoint or exception), there will be a small blue marker overlaid on the yellow IP arrow shown in source code to indicate a thread switch occurred.&lt;/li&gt;
&lt;li&gt;Per thread breakpoints can be created by setting a breakpoint and then right clicking on the breakpoint glyph and choosing Filter. In the Filter dialog, you can enter an expression like &amp;ldquo;ThreadId=5&amp;rdquo; to restrict the breakpoint to a particular thread.&lt;/li&gt;
&lt;li&gt;The threads window in VS 2010 has a number of features to help manage multiple threads:
&lt;ul&gt;
&lt;li&gt;Threads can be flagged manually so it&amp;rsquo;s easy to find the subset of threads you&amp;rsquo;re currently working with.&lt;/li&gt;
&lt;li&gt;Threads can be flagged according to just my code or by particular modules.&lt;/li&gt;
&lt;li&gt;Call stacks for each thread can be viewed by hovering over the Location cell or the call stack can viewed inline by expanding the Location cell (so multiple call stacks can be viewed simultaneously).&lt;/li&gt;
&lt;li&gt;Threads can be grouped according to different criteria, such as process, name, category, flag, etc.&lt;/li&gt;
&lt;li&gt;Threads, including the call stacks for each thread, can be searched using the search box in the window. For example, if you&amp;rsquo;re looking for all threads with Foo on the stack, enable Search Call Stack, and type Foo in the Search box.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For multiple threads running the same/similar workload, the new Parallel Stacks view is very useful. While primarily designed for use with the parallel libraries and runtime, it can also be useful for traditional multi-threaded debugging. It consolidates threads with common stacks into a &amp;ldquo;cactus stack&amp;rdquo; view. I don&amp;rsquo;t know the kinds of scenarios you&amp;rsquo;re debugging, but it might be worth checking out. Here&amp;rsquo;s some additional info on this view: &lt;a href="http://msdn.microsoft.com/en-us/library/dd998398.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd998398.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you Brian, and please get a blog soon :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10020220" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/debuggers/">debuggers</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category></item><item><title>A few words about Micro-Benchmarks</title><link>http://blogs.msdn.com/b/ricom/archive/2010/04/26/a-few-words-about-micro-benchmarks.aspx</link><pubDate>Tue, 27 Apr 2010 00:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10002873</guid><dc:creator>ricom</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=10002873</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/04/26/a-few-words-about-micro-benchmarks.aspx#comments</comments><description>&lt;P&gt;It’s been a long time since I included my “this discussion is only approximately correct” disclaimer so I’ll just preface it here.&amp;nbsp; In the interest of space and clarity, this discussion is only approximately correct.&amp;nbsp; OK, now we can move on…&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;I love micro-benchmarks. &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Really.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;I rely on micro-benchmarks to help me understand what is going on in my system on a day to day or even build to build basis.&amp;nbsp; Understanding which micro-benchmarks are really vital is essential to keeping your performance under control.&amp;nbsp; But you have to be careful not to do more than this.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;One thing you should never do is use your micro-benchmarks to drive prioritization of your performance problems.&amp;nbsp; Remember, a micro-benchmark’s mission in life is to magnify some aspect of your programs performance.&amp;nbsp; Because of this anyone can readily generate a micro-benchmark that makes any given issue seem like a major problem.&amp;nbsp; Do not be fooled!&amp;nbsp; Micro-benchmarks in-and-of-themselves tell you almost nothing about what is important.&amp;nbsp; What they help you do is manage and track the important things once you have discovered them with representative workloads.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Once you have established which micro-benchmarks are key performance drivers in your system, you can use this to help you make progress on the large problems more quickly, but you must be careful to re-validate.&amp;nbsp; Seemingly positive-looking changes in the micro-benchmark can easily be negative under your real workload because the micro-benchmark is often much less resource constrained.&amp;nbsp; For instance, you could make a change that doubles your metric at the expense of addition L2 cache usage.&amp;nbsp; That might be a good thing but it could also be a disaster, the collateral damage you would do to the rest of the program could easily erase all those gains.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;So, should you use these quick running scenarios? Yes, but certainly not exclusively. And not as the primary planning tool, but as a planning aid.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10002873" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/design+advice/">design advice</category></item><item><title>My History of Visual Studio (Epilog)</title><link>http://blogs.msdn.com/b/ricom/archive/2010/04/14/my-history-of-visual-studio-epilog.aspx</link><pubDate>Wed, 14 Apr 2010 19:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9996078</guid><dc:creator>ricom</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9996078</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/04/14/my-history-of-visual-studio-epilog.aspx#comments</comments><description>&lt;P&gt;&lt;A href="http://www.microsoft.com/visualstudio/en-us/watch-it-live" mce_href="http://www.microsoft.com/visualstudio/en-us/watch-it-live"&gt;Visual Studio 2010 Launched on Monday&lt;/A&gt;.&amp;nbsp; Wow!&amp;nbsp; It’s HUGE.&amp;nbsp; A major round of congratulations are in order for everyone involved, not just on the Visual Studio team but also on the Frameworks team and the supporting teams and of course the customers whose feedback was so vital to the success of the product.&lt;/P&gt;
&lt;P&gt;I’ve already written a lot about &lt;A href="http://en.wikipedia.org/wiki/Visual_studio#Visual_Studio_2010" mce_href="http://en.wikipedia.org/wiki/Visual_studio#Visual_Studio_2010"&gt;VS2010&lt;/A&gt; previously in &lt;A href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;the series&lt;/A&gt; and I don’t want to go over all that stuff again.&amp;nbsp; In my &lt;A href="http://blogs.msdn.com/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx" mce_href="http://blogs.msdn.com/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx"&gt;last history posting&lt;/A&gt;, back when Beta 2 came out, I covered all the major things that we wanted to get into this version of Visual Studio from an architectural perspective.&amp;nbsp; You could look down &lt;A href="http://blogs.msdn.com/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx" mce_href="http://blogs.msdn.com/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx"&gt;that list&lt;/A&gt; and get a feel for whether or not the release was a success from that perspective. I think key architectural features like a full WPF surface, MEF extensibility, extension management generally, and of course multi-targeting were delivered.&amp;nbsp; General purpose multi-targeting is a huge thing because it means we don’t have to do a VS SKU release for every new target platform that comes out – that was a critical thing for our own sanity.&amp;nbsp; And WPF has certainly (finally?) proved itself as a viable platform for a flagship application.&amp;nbsp; We set out on a multi-release remodeling plan and I think we delivered an excellent first-installment.&lt;/P&gt;
&lt;P&gt;You might be wondering why I was so quiet during the home stretch. I’m afraid my perspective on the VS RC and RTM milestones was an outsider's.&amp;nbsp; The Beta 2 push was my last major hands-on involvement with the product; probably the simplest diagnosis is that I burned myself out at that point.&amp;nbsp; In any case I took a vacation after that Beta with the goal of returning to find a new challenge.&amp;nbsp; I’d been in the Developer Division about 7 years, for the second time, and I like to move around about that often, so it was time.&amp;nbsp; I’d love to take some credit for fixing the daunting memory leaks that were left in Beta 2 but I’m afraid all credit for that goes to my capable colleagues to whom I am forever grateful for taking this particular release across the finish line.&lt;/P&gt;
&lt;P&gt;Some things were lost on the way in the name of getting the necessary stability and basically locking things down.&amp;nbsp; It’s kind of a sad thing when that happens but it’s a necessary thing – they’ll just have to wait for the service release.&amp;nbsp; Nearly ready to go things that just needed a little more bake time are a great thing to have in your pocket at that point, but there are a few especially delightful things that I wanted to mention, sort of unexpectedly delightful, for me anyway.&lt;/P&gt;
&lt;P&gt;We started with an ambitious goal to make a major dent in Visual Studio’s setup experience.&amp;nbsp; A lot of what we wanted to do ended up having to be pared back and I feared we would end up making little progress but in the final analysis I think the setup experience is substantially better.&amp;nbsp; Seeing tweets on how people had successfully installed in less than 30 minutes was very nice.&amp;nbsp; More than I hoped for in the darkest hours.&amp;nbsp; My own experiences during the beta were the best of any VS release I’ve ever installed – and that’s a lot of releases.&lt;/P&gt;
&lt;P&gt;I feared the historical debugging feature, &lt;A href="http://msdn.microsoft.com/en-us/library/dd264915.aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd264915.aspx"&gt;IntelliTrace&lt;/A&gt;, was going to be too bulky to use all the time but that’s not proving to be the case at all.&amp;nbsp; I’m just getting used to having it available all the time and it’s proving to be much more of a game-changer than I ever imagined.&amp;nbsp; I wrote more about the history of that feature previously so I won’t go on other than to give some kudos to those that worked hard to make that feature reality.&lt;/P&gt;
&lt;P&gt;I didn’t think TFS was going to be so universally important but the ease with which &lt;A href="http://blogs.msdn.com/bharry/archive/2009/10/01/tfs-2010-for-sourcesafe-users.aspx" mce_href="http://blogs.msdn.com/bharry/archive/2009/10/01/tfs-2010-for-sourcesafe-users.aspx"&gt;TFS Basic&lt;/A&gt; can be brought online was just staggering.&amp;nbsp; In just a few minutes I configured my own home TFS installation – it’s great to have that kind of quality ALM system so easily available to everyone.&lt;/P&gt;
&lt;P&gt;The rate at which new extensions are appearing in the gallery is incredible.&amp;nbsp; I’m so glad to see &lt;A href="http://visualstudiogallery.msdn.microsoft.com/en-us/" mce_href="http://visualstudiogallery.msdn.microsoft.com/en-us/"&gt;this hub&lt;/A&gt; creating energy for all our customers, but there was one extension in particular that made my day.&amp;nbsp; &lt;A href="http://visualstudiogallery.msdn.microsoft.com/en-us/site/profile?userName=kolomiets" mce_href="http://visualstudiogallery.msdn.microsoft.com/en-us/site/profile?userName=kolomiets"&gt;Dmitry Kolomiets&lt;/A&gt; produced, I think, the first &lt;A href="http://visualstudiogallery.msdn.microsoft.com/en-us/66350dbe-ed01-4120-bea2-5564eff7b0b2" mce_href="http://visualstudiogallery.msdn.microsoft.com/en-us/66350dbe-ed01-4120-bea2-5564eff7b0b2"&gt;Solution Load Manager&lt;/A&gt; extension.&amp;nbsp; Why do I care so much about that particular extension?&amp;nbsp; Well there’s a story there: from very early on in the history of VS2010 I was espousing a philosophy that we could not universally load every project in a solution and achieve our memory goals – many solutions are just too large and it’s entirely normal to not need every project.&amp;nbsp; But there is no reasonable way to manage solutions.&amp;nbsp; Unfortunately there was just not enough time to make this feature a reality – but there was enough time to add the necessary APIs so that a 3rd party could make us load less and manage what was loaded.&amp;nbsp; With that support they could build their own UI to drive the experience.&amp;nbsp; It was hoped that the performance benefits from such a system would motivate the creation of a variety of managers with different policies – potentially tied in to the great refactoring engines engines already out there (e.g. &lt;A href="http://en.wikipedia.org/wiki/Coderush" mce_href="http://en.wikipedia.org/wiki/Coderush"&gt;CodeRush&lt;/A&gt; and &lt;A href="http://en.wikipedia.org/wiki/ReSharper" mce_href="http://en.wikipedia.org/wiki/ReSharper"&gt;Resharper&lt;/A&gt;).&amp;nbsp; But it was just a hope.&amp;nbsp; Now there is one!&lt;/P&gt;
&lt;P&gt;I could go on for ages.&amp;nbsp; The &lt;A href="http://blogs.msdn.com/camerons/archive/2008/12/16/introduction-to-directed-graph-markup-language-dgml.aspx" mce_href="http://blogs.msdn.com/camerons/archive/2008/12/16/introduction-to-directed-graph-markup-language-dgml.aspx"&gt;diagramming support&lt;/A&gt; and of course our uses of it.&amp;nbsp; Integrated Silverlight support, ASP.NET 4 with MVC2 (read about it on &lt;A href="http://weblogs.asp.net/scottgu/archive/2010/04/12/visual-studio-2010-and-net-4-released.aspx" mce_href="http://weblogs.asp.net/scottgu/archive/2010/04/12/visual-studio-2010-and-net-4-released.aspx"&gt;Scott’s Blog&lt;/A&gt;).&amp;nbsp; Language improvements in C#, VB, and C++.&amp;nbsp; Did I mention &lt;A href="http://visualstudiomagazine.com/articles/2010/04/01/using-visual-studio-2010.aspx" mce_href="http://visualstudiomagazine.com/articles/2010/04/01/using-visual-studio-2010.aspx"&gt;Windows Azure&lt;/A&gt; support as well?&amp;nbsp; &lt;A href="http://msdn.microsoft.com/en-us/library/ee330921.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ee330921.aspx"&gt;Sharepoint&lt;/A&gt; support? &lt;A href="http://blogs.msdn.com/somasegar/archive/2009/10/09/f-in-vs2010.aspx" mce_href="http://blogs.msdn.com/somasegar/archive/2009/10/09/f-in-vs2010.aspx"&gt;F#&lt;/A&gt;?&amp;nbsp; It’s huge.&lt;/P&gt;
&lt;P&gt;This was only “My” History of Visual of Visual Studio.&amp;nbsp; For me this is the "epilog" but for everyone else, VS2010 out the door, it’s time to begin your own History.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Congratulations and Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9996078" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>Variability in Benchmarks</title><link>http://blogs.msdn.com/b/ricom/archive/2010/04/07/variability-in-benchmarks.aspx</link><pubDate>Wed, 07 Apr 2010 22:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9992048</guid><dc:creator>ricom</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9992048</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/04/07/variability-in-benchmarks.aspx#comments</comments><description>&lt;P&gt;I’m not especially a great fan of micro-benchmarks, they’re handy as a compliment to the larger tests but I often find that they lead to confusion because they are interpreted as reflecting reality when nothing could be farther from the truth.&amp;nbsp; The fact is that micro-benchmarks are intended to magnify some particular phenomenon to allow it to be studied.&amp;nbsp; You can expect that normal things like cache pressure, even memory consumption generally, will be hidden – often on purpose for a particular test or tests.&amp;nbsp; Nonetheless many people, including me, feel more comfortable when there is a battery of micro-benchmarks to back up the “real” tests because micro-benchmarks are much more specific and therefore more actionable.&lt;/P&gt;
&lt;P&gt;However, benchmarks in general have serious stability issues.&amp;nbsp; Sometimes even run-to-run stability over the same test bits is hard to achieve.&amp;nbsp; I have some words of caution regarding the variability of results in micro-benchmarks, and benchmarks generally. &lt;/P&gt;
&lt;P&gt;Even if you do your best to address the largest sources of &lt;EM&gt;internal variability&lt;/EM&gt; in a benchmark by techniques like controlling GCs, adequate warm-up, synchronizing participating processes, making sensible affinity choices, and whatnot,&amp;nbsp;you are still left with significant sources of what I will call &lt;EM&gt;external variability&lt;/EM&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The symptom of &lt;EM&gt;external variability&lt;/EM&gt; is that you’ll get a nice tight results from your benchmark (a good benchmark might have a &lt;A class="" href="http://en.wikipedia.org/wiki/Coefficient_of_variation" mce_href="http://en.wikipedia.org/wiki/Coefficient_of_variation"&gt;Coefficient of&amp;nbsp;Variation&lt;/A&gt; of well below 1%) but the observed result is much slower (or, rarely, faster) than a typical run.&amp;nbsp; The underlying cause varies, some typical ones are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Scheduler variability – the scheduler makes an unfortunate choice and sticks with it&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;The entire run is much slower than normal&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Uncontrolled background activity external to the test&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Part of the run is slower, maybe several consecutive test cases in a suite&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Interference from attached devices&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Incoming network packets or other sources of interrupts&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;
&lt;P&gt;These problems are often not the dominant sources of variability initially but as the benchmark is improved, controlling for other factors, they become dominant.&lt;/P&gt;
&lt;P&gt;Statistically the underlying issue is this:&amp;nbsp; repeated benchmark measurements in a run are &lt;EM&gt;&lt;STRONG&gt;not&lt;/STRONG&gt;&lt;/EM&gt; independent: a phenomenon affecting a particular iteration is highly likely to also affect the next iteration.&amp;nbsp; A closer statistical model might be independent measurements punctuated by a &lt;A class="" href="http://en.wikipedia.org/wiki/Poisson_process" mce_href="http://en.wikipedia.org/wiki/Poisson_process"&gt;Poisson Process&lt;/A&gt; that produces long lasting disruptions.&amp;nbsp; "Waiter, there is a fish in my benchmark."&lt;/P&gt;
&lt;P&gt;My experience with this sort of thing, and I expect the battle-scarred will agree, is that reducing external variability is an ongoing war.&amp;nbsp; There isn’t really a cure.&amp;nbsp; But it does pay to not have hair-trigger reflex on regression warnings, and to screen for false positives in your results.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9992048" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/performance/">performance</category></item><item><title>My Annual Personal Posting</title><link>http://blogs.msdn.com/b/ricom/archive/2010/04/05/my-annual-personal-posting.aspx</link><pubDate>Tue, 06 Apr 2010 06:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9990965</guid><dc:creator>ricom</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9990965</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/04/05/my-annual-personal-posting.aspx#comments</comments><description>&lt;P&gt;I try to keep the content on this blog strictly professional (although sometimes it's like an editorial but at least it's topical) About once a year I break down and write something that's basically just some personal thing I felt like sharing.&amp;nbsp;This is my link for this year.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;A couple of years ago my family became involved in animal rescue (mainly cats and dogs).&amp;nbsp; It all started when my wife asked me if we could get a third dog and I told her that was a bad idea -- "too many" I said.&amp;nbsp; But I thought fostering would be a good thing.&amp;nbsp; Ha!&amp;nbsp; I had no idea I was saying "no" to three and now sometimes we have nine in the house!&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Still it was the best stupid thing I ever said.&lt;/P&gt;
&lt;P&gt;One of the organizations our family is associated with is Furbaby Rescue here in Washington.&amp;nbsp; If you are a pet person, or think you might like to be one some day, I invite you to watch this.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.youtube.com/watch?v=YExxNEpEdJY"&gt;http://www.youtube.com/watch?v=YExxNEpEdJY&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Warning: it's quite sad as are many of&amp;nbsp;rescue stories.&amp;nbsp; But I hope this one has a happy ending when all is said and done.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9990965" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/ramblings/">ramblings</category></item><item><title>Why you really want to avoid catching and rethrowing exceptions</title><link>http://blogs.msdn.com/b/ricom/archive/2010/04/05/why-you-really-want-to-avoid-catching-and-rethrowing-exceptions.aspx</link><pubDate>Mon, 05 Apr 2010 19:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9990729</guid><dc:creator>ricom</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9990729</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2010/04/05/why-you-really-want-to-avoid-catching-and-rethrowing-exceptions.aspx#comments</comments><description>&lt;P&gt;I like processes that simply drop-dead fail when they have an unrecoverable fault.&amp;nbsp; Trying to continue is often dangerous and unlikely to actually help anyone.&amp;nbsp; This policy is all fine and well but in all cases it is vital that the “death” stack of a process be the true problem, not a generic error handler.&amp;nbsp; Those kinds of handlers ruin the lives of developers who are trying to analyze error logs, and effectively make services like Watson useless.&amp;nbsp; I can’t stress enough how critical it is to NOT mess with the failure stack.&lt;/P&gt;
&lt;P&gt;I’ve seen many of these in the wild, including of course Microsoft code, and it means that instead of getting a nice actionable stack in the log (which would have been a Watson report in the field) you have to go back to the code and try to repro.&amp;nbsp; In the case below I stared at the source for a while trying to figure out what was likely wrong and it turned out the true problem was quite distant from the likely candidates.&lt;/P&gt;
&lt;P&gt;2010/04/05 11:02:14 AM&amp;nbsp; BEGIN&amp;nbsp;&amp;nbsp;&amp;nbsp; Peek_Range TEST&lt;BR&gt;2010/04/05 11:02:14 AM&amp;nbsp; ---- Exception in [StackTest] thrown type=[TestCodeException], eip=[00000004`4716C93E], message=[Index (1) is out-of-range [0..1]!]&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;That was the failure right there, and that stack was the one I needed! Nothing after that should have happened... But... execution continues until finally....&lt;/P&gt;
&lt;P&gt;2010/04/05 11:02:15 AM&amp;nbsp; Test completed exceptionally [Peek_Range]: Index (1) is out-of-range [0..1]!&lt;/P&gt;
&lt;P&gt;The stack reported at this point is useless… the real problem was millions of cycles ago.&amp;nbsp; I'm not even including&amp;nbsp;the stack from the log&amp;nbsp;because it's just stupid.&lt;/P&gt;
&lt;P&gt;The real stack can be extracted with a repro (at great pain)&lt;/P&gt;
&lt;P&gt;And it ends up looking something like&amp;nbsp;this (cleaned up)&lt;/P&gt;
&lt;P&gt;StackTest!TestUtilities::ParamCheckIndex&amp;lt;int32&amp;gt;&lt;BR&gt;StackTest!CollectionTestUtils::TestUtilities_SimpleList&amp;lt;int&amp;gt;::RangeCheckIndex&lt;BR&gt;StackTest!CollectionTestUtils::TestUtilities_SimpleList&amp;lt;int&amp;gt;::get_Item&lt;/P&gt;
&lt;P&gt;The actual problem is in the test code!&amp;nbsp;&amp;nbsp; The only useful information from the original log was basically the test that I should run.&amp;nbsp; Thank goodness it’s a 100% repro.&lt;BR&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9990729" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/design+advice/">design advice</category></item><item><title>VSX Keynote posted</title><link>http://blogs.msdn.com/b/ricom/archive/2009/12/08/vsx-keynote-posted.aspx</link><pubDate>Wed, 09 Dec 2009 01:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9934360</guid><dc:creator>ricom</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9934360</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/12/08/vsx-keynote-posted.aspx#comments</comments><description>&lt;P&gt;Just a quick plug, if you missed the VSX conference you can see it all online on Channel 9.&amp;nbsp; Some great talks including my &lt;A href="http://channel9.msdn.com/posts/VSIPMarketing/VSX100-Visual-Studio-Extensibility-Keynote-Past-Present-and-Future/" mce_href="http://channel9.msdn.com/posts/VSIPMarketing/VSX100-Visual-Studio-Extensibility-Keynote-Past-Present-and-Future/"&gt;keynote speech&lt;/A&gt; on VS Futures.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9934360" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/recommendations/">recommendations</category></item><item><title>VS2010 Beta2 performance and other issues</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/28/vs2010-beta2-performance-and-other-issues.aspx</link><pubDate>Wed, 28 Oct 2009 20:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9914306</guid><dc:creator>ricom</dc:creator><slash:comments>38</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9914306</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/28/vs2010-beta2-performance-and-other-issues.aspx#comments</comments><description>&lt;P&gt;Just a few words of encouragement today:&amp;nbsp; I can't emphasize enough how valueable your feedback is to us at this point; no matter how hard we try we simply cannot duplicate the diversity that is the real world.&amp;nbsp; We need to know what's really working out there -- what works for us isn't enough.&amp;nbsp; Whether it's performance, stability, or any other issue, your feedback will help us to "get it right" for the release.&lt;/P&gt;
&lt;P&gt;I've seen some super-positive comments about product performance and I've seen some negative ones.&amp;nbsp; Your comments will help us to figure out which areas we've missed, what combinations aren't working, what hardware are we using poorly, or any other goofy thing we might have done.&lt;/P&gt;
&lt;P&gt;You can use &lt;A href="http://connect.microsoft.com/" mce_href="http://connect.microsoft.com/"&gt;http://connect.microsoft.com/&lt;/A&gt;&amp;nbsp;or you can provide comments here.&amp;nbsp; We're even watching twitter and the blog-o-sphere generally but those are less reliable.&lt;/P&gt;
&lt;P&gt;Brian Harry is also reaching out &lt;A href="http://blogs.msdn.com/bharry/" mce_href="http://blogs.msdn.com/bharry/"&gt;http://blogs.msdn.com/bharry/&lt;/A&gt;&amp;nbsp;and I know all the other executive bloggers have their ears on -- and they'll get help.&amp;nbsp; Connect bugs are the best of all but don't be shy, we'll take the feedback however we can get it.&lt;/P&gt;
&lt;P&gt;Thank you!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9914306" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category></item><item><title>Inside Visual Studio Beta 2 - Performance and Reliability</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/20/inside-visual-studio-beta-2-performance-and-reliability.aspx</link><pubDate>Tue, 20 Oct 2009 19:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9910135</guid><dc:creator>ricom</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9910135</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/20/inside-visual-studio-beta-2-performance-and-reliability.aspx#comments</comments><description>&lt;P&gt;After my keynote speech yesterday at&amp;nbsp;the &lt;A href="http://blogs.msdn.com/ricom/archive/2009/09.aspx" mce_href="http://blogs.msdn.com/ricom/archive/2009/09.aspx"&gt;Development Tools Ecosystem Summit&lt;/A&gt;&amp;nbsp;Charles Torre caught up with me and we made this video.&amp;nbsp; Hot off the presses: &lt;A id=ctl00_MainPlaceHolder_Starter_TitleLink href="http://channel9.msdn.com/posts/Charles/Rico-Mariani-Inside-Visual-Studio-Beta-2-Performance-and-Reliability/"&gt;Rico Mariani: Inside Visual Studio Beta 2 - Performance and Reliability&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;It's super-exciting :)&lt;/P&gt;
&lt;P&gt;If you missed the keynote you can get virtually all the content by watching this video and reading the last entry in my &lt;A href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;&lt;SPAN style="COLOR: #777777; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3 face=Calibri&gt;History of Visual Studio&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; series &lt;A href="http://blogs.msdn.com/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx" mce_href="http://blogs.msdn.com/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx"&gt;My History of Visual Studio (Part 10, final)&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9910135" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category></item><item><title>My History of Visual Studio (Part 10, final)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx</link><pubDate>Mon, 19 Oct 2009 21:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9909427</guid><dc:creator>ricom</dc:creator><slash:comments>23</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9909427</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/19/my-history-of-visual-studio-part-10-final.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Visit the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=151797" mce_href="http://go.microsoft.com/fwlink/?LinkID=151797"&gt;Microsoft Visual Studio 2010 and .NET Framework 4 Beta&lt;/a&gt; web site for the latest info]&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Visual Studio 2008 Winds Down, Visual Studio 2010 Begins&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Just as things were starting to wind down on VS2008, I got a new assignment.&amp;nbsp; I was going to be &lt;a href="http://blogs.msdn.com/ricom/archive/2007/07/12/news-about-me.aspx" mce_href="http://blogs.msdn.com/ricom/archive/2007/07/12/news-about-me.aspx"&gt;Chief Architect of Visual Studio&lt;/a&gt;.&amp;nbsp; Wow.&amp;nbsp; So here this series takes a bit of a turn because &amp;ldquo;my&amp;rdquo; history is quite a bit different at this point &amp;ndash; I actually stopped working on the current product at all, and much as I would have liked to write about what I was doing back then, you can imagine there wasn&amp;rsquo;t a whole lot of enthusiasm about starting blog discussions on what we should do in &amp;ldquo;Dev10&amp;rdquo; (the term &amp;ldquo;Hawaii&amp;rdquo; never stuck and was soon abandoned) while we were trying to launch VS2008.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Remodeling&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;From a technical perspective, the idea of VS2010 was to begin a remodeling process that would span several versions.&amp;nbsp; Making key investments that would help long-standing problems and at the same time offer some immediately compelling features as well.&amp;nbsp; I gave a lot of thought to what enabling steps we would have to take to make our experience be something great in say three versions.&amp;nbsp; It was hard to see exactly what that future might be, so I tried not to think about specific features at all. &amp;nbsp;I had seen all sorts of &amp;ldquo;flashware&amp;rdquo; concepts for things we might do and I tried to think about what key problems we would have to solve to implement things of that nature.&amp;nbsp; Using all that, and what I already knew, I came up with a list of fairly low-level considerations for a &amp;ldquo;VS of the Future&amp;rdquo; that I thought we should work on, and why.&lt;/p&gt;
&lt;p&gt;I think the actual document I created is pretty dry, it&amp;rsquo;s full of observations about the size of processor caches, the number of cores, the memory wall, the locality of our data structures, blah, blah, blah.&amp;nbsp; It goes on like this for pages, but I think I can summarize it into a couple of major themes.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Concurrency&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The first major theme is concurrency, and the need to increase our ability to use it successfully.&amp;nbsp; You might think that with all of those threads Visual Studio spawns that there is a great deal of parallelism but, for the most part, it&amp;rsquo;s only superficial (there are exceptions), what happens more often than not is that those threads run something like&amp;nbsp; relay race with only one thread having the baton at any given moment.&amp;nbsp;&amp;nbsp; One key reason for this is that due to the single-threaded history of our code-base, and indeed many Windows applications, a lot of the objects are tied to the &lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model#Threading_in_COM" mce_href="http://en.wikipedia.org/wiki/Component_Object_Model#Threading_in_COM"&gt;STA&lt;/a&gt; that is the main thread.&lt;/p&gt;
&lt;p&gt;To create opportunities for concurrency you have to start to disentangle the important data structures from the STA and give them better access models that are friendly to concurrency. A great example of this is the new editor in VS2010.&amp;nbsp; It allows you to access editor buffers via immutable micro-snapshots.&amp;nbsp; Previously, if you wanted to do a something like say background analysis on a live text buffer, you had to do crazy things like copying the entire editor buffer on every keystroke.&amp;nbsp; Concepts familiar to database programmers, like &lt;a href="http://en.wikipedia.org/wiki/Isolation_(database_systems)" mce_href="http://en.wikipedia.org/wiki/Isolation_(database_systems)"&gt;isolation&lt;/a&gt;, need to be present in the key structures of any concurrent sytem.&lt;/p&gt;
&lt;p&gt;The STA concerns are a bit like a plague, they can cause a massive &amp;ldquo;entanglement&amp;rdquo; of data processing and presentation.&amp;nbsp; Transitions into or between STAs can result in unexpected message pumping, leading to bizarre &lt;a href="http://en.wikipedia.org/wiki/Reentrant_(subroutine)" mce_href="http://en.wikipedia.org/wiki/Reentrant_(subroutine)"&gt;re-entrancies&lt;/a&gt; which in turn result in astonishing bugs that are very hard to find and fix.&lt;/p&gt;
&lt;p&gt;Additional entanglements occur between processes trying to create parent/child relationships between their windows where the single pump effectively fuses together certain STAs &amp;ndash; a necessary step given typical application assumptions but a total bug nightmare and a parallelism disabler.&lt;/p&gt;
&lt;p&gt;Ultimately the most important thing is to make it as easy as possible to move work off of the UI thread.&amp;nbsp; I think it&amp;rsquo;s vitally important that there is a single thread responsible for the UI &amp;ndash; it&amp;rsquo;s the sanest way to preserve the order of operations the user initiated &amp;ndash; the &lt;a href="http://en.wikipedia.org/wiki/Causality" mce_href="http://en.wikipedia.org/wiki/Causality"&gt;causality&lt;/a&gt; from their perspective if you will &amp;ndash; but as their requests become non-trivial you need the flexibility to do them asynchronously.&lt;/p&gt;
&lt;p&gt;There are two major kinds of background activity that come up in an IDE; it is easiest to illustrate these two needs by example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Search for &amp;ldquo;foo&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;This can be done in a totally asynchronous fashion with different &amp;ldquo;threads&amp;rdquo; proceeding in parallel against different editor buffers or other searchable contexts.&amp;nbsp; All the foos light up as they are discovered for instance.&lt;/li&gt;
&lt;li&gt;Foos that are not visible need not be processed, so this sort of parallelism has the option to be &amp;ldquo;lazy&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rename &amp;ldquo;foo&amp;rdquo; to &amp;ldquo;bar&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;We can still do this asynchronously but now there is an expectation that we will eventually do it all and of course we must do all the foos not just the visible ones&lt;/li&gt;
&lt;li&gt;Generally this requires progress, and a transaction&lt;/li&gt;
&lt;li&gt;It can fail, or be cancelled, these are normal things&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both of these represent two cases where we can use a &amp;ldquo;coarse&amp;rdquo; parallelism model (e.g. one file at a time, independently).&amp;nbsp; Of course we also would like to do fine-grained parallelism in places and in fact searching could be amenable to this as well (e.g. search odd lines with one thread even lines with another).&amp;nbsp; Fine-grained parallelism has the opportunity to keep data locality good because you can access the data in one stream rather than access disparate data streams all at once, at the expense of more complex scheduling.&amp;nbsp; Locality is good for performance, more threads are good, sounds good but you need some fundamentals to make any of this happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Limited memory usage in the face of many threads running&lt;/li&gt;
&lt;li&gt;Ability to safely access the data in slices that are durable and limited in span&lt;/li&gt;
&lt;li&gt;Isolation from changes that happen during the operations&lt;/li&gt;
&lt;li&gt;No STA requirements in the data access and a asynchronous way to deliver updates to the UI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Putting the text editor on a plan that can satisfy these needs is itself a big step forward&lt;a title="_Toc177300759" name="_Toc177300759"&gt;&lt;/a&gt; but on a long term basis it would be nice to do many things on this plan.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New UI Model&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Again, I went on at great length about this in my original memo but I&amp;rsquo;ll treat this topic even more briefly than concurrency.&amp;nbsp; The long and the short of it is that your average developer&amp;rsquo;s machine has the equivalent of a few 1990s supercomputers for a &lt;a href="http://en.wikipedia.org/wiki/GPU" mce_href="http://en.wikipedia.org/wiki/GPU"&gt;GPU&lt;/a&gt; (we could haggle over how many) and it&amp;rsquo;s important to be able to get good mileage out of that unit.&amp;nbsp; It&amp;rsquo;s hard to imagine achieving those kinds of successes at reasonable cost using the good old &lt;a href="http://msdn.microsoft.com/en-us/library/dd145213(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd145213(VS.85).aspx"&gt;WM_PAINT&lt;/a&gt; + &lt;a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface" mce_href="http://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;GDI&lt;/a&gt; model &amp;ndash; a high quality retained mode graphics system is basically a must.&lt;/p&gt;
&lt;p&gt;In addition to a making it easier to use the GPU, there is also a tremendous desire to do good separation between the UI and the data elements of your design.&amp;nbsp; Not just because this is architecturally sensible and clean but, as I discussed in the previous section, because to do otherwise significantly hinders your ability to achieve a good degree of parallelism.&amp;nbsp; The retained mode graphics model actively encourages badly needed separation and you all know I love the &lt;a href="http://blogs.msdn.com/brada/archive/2003/10/02/50420.aspx" mce_href="http://blogs.msdn.com/brada/archive/2003/10/02/50420.aspx"&gt;Pit of Success&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ultimately that leads to the choice of &lt;a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation" mce_href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;WPF&lt;/a&gt; for presentation in Visual Studio because the long term choices are to either use that or roll our own.&amp;nbsp; However WPF and &lt;a href="http://en.wikipedia.org/wiki/Silverlight" mce_href="http://en.wikipedia.org/wiki/Silverlight"&gt;Silverlight&lt;/a&gt; evolve in future frameworks, and you&amp;rsquo;d have to be crazy to think they won&amp;rsquo;t, we&amp;rsquo;re better off using WPF notions than relying on the past, or worse, on something of our own making.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What came of all this?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve deliberately avoided going into feature discussions so far, just as I did in my original memo, but ultimately we had to choose particular product areas where we would take these notions and invest in moving them into a good direction.&amp;nbsp; That&amp;rsquo;s the point of the &amp;ldquo;remodel&amp;rdquo; after all.&lt;/p&gt;
&lt;p&gt;These are some of the major initiatives that got an investment; they had impact throughout the entire product.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Multi-targeting&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A new framework, and in particular a new CLR, essentially mandated that we do this work.&amp;nbsp; We had been able to do this more cheaply in previous releases because all the target frameworks shared a CLR (the CLR had been on v2.0 even though the framework moved on to 3.0 and 3.5).&amp;nbsp; This base level of compatibility allowed a simpler &amp;ldquo;onion-skin&amp;rdquo; kind of model to deliver an effective solution in Orcas &amp;ndash; that wasn&amp;rsquo;t going to work in Dev10.&amp;nbsp; In Dev10 we had to be able to target CLR 2.0 and CLR 4.0 and we had to do it in such a way that any given solution might use the related frameworks in any combination.&amp;nbsp; We certainly couldn&amp;rsquo;t assume that the mscorlib that the IDE had loaded was the one that the user wanted to target.&lt;/p&gt;
&lt;p&gt;Then there&amp;rsquo;s the matter of tools.&amp;nbsp; There are different compilers for different frameworks and we can&amp;rsquo;t assume that, for instance, the C# compiler for version 4.0 is the right tool for the job when building a project designed to run on version 3.5. And even if we were super careful with the compilers, what about all the other tools that create outputs, like say resources? Those assets might be in a format that is serialized with the expectation that a particular framework will load it.&amp;nbsp; So no one tool could do the job.&lt;/p&gt;
&lt;p&gt;And let&amp;rsquo;s not forget the native tools, they have all these problems too, though I&amp;rsquo;ve been using managed examples, you can search and replace the runtime names in my discussion with native tools and libraries and you get basically all the same phenomena.&lt;/p&gt;
&lt;p&gt;So in VS2010, based on the project target, we have to select the right libraries and tools to create all your outputs and we have to be able to vary these on a project by project basis.&amp;nbsp; That sounds good.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s just the start.&lt;/p&gt;
&lt;p&gt;The build chain is in some ways the least of our problems, what about all those designers?&amp;nbsp; What about Intellisense?&amp;nbsp; As you change focus from from file to file, depending on the framework you&amp;rsquo;re targeting in that file we need to show you Intellisense for just the methods you can actually use in that context.&amp;nbsp; Likewise designers should include only choices that are reasonable for the current target, so for instance, the items in the &lt;a href="http://en.wikipedia.org/wiki/Winforms" mce_href="http://en.wikipedia.org/wiki/Winforms"&gt;Winforms&lt;/a&gt; designer toolbox should not include controls that are available in the version of the framework the IDE happens to be using, but rather the ones that are available on the desired target, and of course those are not likely to be the same.&lt;/p&gt;
&lt;p&gt;Add to this mix the desire to target platform subsets like the &amp;ldquo;client profile&amp;rdquo; of framework 4.0 and you&amp;rsquo;ve got quite challenge on your hands.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I remember a very compelling breakdown that the teams used to explain the levels of success to management (and me)&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;b&gt;Good:&amp;nbsp; &lt;/b&gt;Designers and Intellisense prevent you from making mistakes; you see only things that you can really use for your target.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;b&gt;Not Good:&lt;/b&gt; Designers didn&amp;rsquo;t warn you, but at least you got a compile time error that was helpful and can be corrected.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;b&gt;Bad:&lt;/b&gt; There was no compile time error but when you ran the code you could readily see that it had some target specific aspect that shouldn&amp;rsquo;t be there and you could correct the code to avoid the problem.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;b&gt;Ugly:&lt;/b&gt; As above, but there is no reasonable diagnostic information and/or no reasonable way to fix it.&lt;/p&gt;
&lt;p&gt;Obviously we want all aspects to be &amp;ldquo;Good&amp;rdquo; and if that can&amp;rsquo;t be achieved then as few as possible cases in each successively lower category.&amp;nbsp; I think you&amp;rsquo;ll find that as of Beta 2 we&amp;rsquo;ve been very successful.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New Editor&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Without going into a full discussion of the problems with the &amp;ldquo;old&amp;rdquo; editor it is worth mentioning these basic facts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The old system was blocking innovation because of limitations in how it does the drawing &amp;ndash; adornments are painful to add&lt;/li&gt;
&lt;li&gt;It was &amp;ldquo;tricky&amp;rdquo; to use in non-trivial cases, often requiring extreme interventions such as wholesale copying of buffers to achieve stable state, the locking mechanism is prone to mistakes&lt;/li&gt;
&lt;li&gt;When combined with its undo-manager it sometimes (always?) highly wasteful in terms of memory&lt;/li&gt;
&lt;li&gt;It has assorted algorithms that do not scale well, generally those to do with region tracking &amp;ndash; increasingly critical to editor consumers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many customer performance complaints boil down to lack of scalability in the current editor structure. These issues in turn boil down to non-linear memory usage, and non-linear algorithms, where sub-linear choices are possible, and necessary, to create the proper experience.&amp;nbsp; We get real scalability complaints from customers on an ongoing basis and these problems can&amp;rsquo;t be solved by &amp;ldquo;tuning.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;To address these problems we had already built a new editor platform, including visualization and text management services.&amp;nbsp; The design had proven scalability and extensibility and had already shipped (in &lt;a href="http://en.wikipedia.org/wiki/Expression_Blend" mce_href="http://en.wikipedia.org/wiki/Expression_Blend"&gt;Blend&lt;/a&gt;).&amp;nbsp; It was a very real technology.&amp;nbsp; However, there was a great deal of code in Visual Studio that depended on old editor behaviors.&lt;/p&gt;
&lt;p&gt;To simplify adoption of the new editor we created &amp;ldquo;shim&amp;rdquo; services that supported the most popular of the old interfaces allowing existing clients to continue to use those interfaces.&amp;nbsp; Since most editor consumers actually use only a subset of the whole API we were able to substantially mitigate the cost of conversion across Visual Studio &amp;ndash; shims weren&amp;rsquo;t a universal solution, but they helped.&lt;/p&gt;
&lt;p&gt;Now I say that like it was some easy thing but wow it&amp;rsquo;s a ton of work even at the &amp;ldquo;reduced&amp;rdquo; cost.&amp;nbsp; And the number of shims seemed to keep growing, and growing, and&amp;hellip; it took a while to get this under control.&lt;/p&gt;
&lt;p&gt;There were other problems. The new editor wasn&amp;rsquo;t identical to the old, despite being more functional overall it was missing some things &amp;ndash; like column select &amp;ndash; that would need to be added (it&amp;rsquo;s in Beta 2). Then there are the complicated editor interactions in cases like those presented by the &lt;a href="http://msdn.microsoft.com/en-us/library/ms973868.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms973868.aspx"&gt;Web Forms&lt;/a&gt; designer &amp;ndash; the presence of markup intermixed with a language (like VB or C#) makes Intellisense very tricky.&amp;nbsp; The language service needs to see the file without the markup to provide coloring and Intellisense but of course the user edits the composite file. Getting this to work on the new editor was quite a trick.&lt;/p&gt;
&lt;p&gt;Having gone through all this I think I can say that the new editor has a very bright future; it has unprecedented extensibility &amp;ndash; everything from text replacement, to object insertion, to &lt;a href="http://en.wikipedia.org/wiki/HUD_(video_gaming)" mce_href="http://en.wikipedia.org/wiki/HUD_(video_gaming)"&gt;HUD&lt;/a&gt;&amp;ndash;like overlays.&amp;nbsp; In this version we&amp;rsquo;ve barely begun to tap its capabilities.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New Shell&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It would be a mistake to think of the new shell as just a redo of the old in WPF, it&amp;rsquo;s quite a lot more than that. &amp;nbsp;There is a whole new toolbar system, a whole new menu system, both based on WPF. The docking controls, easily taken for granted, those are all new.&amp;nbsp; There are the bits that allow document windows to completely float for better multi-monitor support.&amp;nbsp; There are all the decorative bits, the window tabs, the output window tabs.&amp;nbsp; It&amp;rsquo;s starting to add up but these things are only one aspect of the Shell, its UI.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Behind the scenes, there to enable pieces like the new editor that I discussed above, and the project system that will be next, are the &lt;a href="http://msdn.microsoft.com/en-us/library/bb685612.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb685612.aspx"&gt;Shell Services&lt;/a&gt;.&amp;nbsp; You might see screenshots of the new &lt;a href="http://blogs.msdn.com/pedrosilva/archive/2009/04/02/introducing-vs-extension-manager.aspx" mce_href="http://blogs.msdn.com/pedrosilva/archive/2009/04/02/introducing-vs-extension-manager.aspx"&gt;Extension Manager&lt;/a&gt; and the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/" mce_href="http://visualstudiogallery.msdn.microsoft.com/en-us/"&gt;Visual Studio Gallery&lt;/a&gt;, they are in some ways the face of much of the underlying work:&amp;nbsp; a new deployment model for extensions centered around the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/529a374e-f2ae-44a0-802e-b889a2ce768c" mce_href="http://visualstudiogallery.msdn.microsoft.com/en-us/529a374e-f2ae-44a0-802e-b889a2ce768c"&gt;VSIX&lt;/a&gt; packaging format and the &lt;a href="http://www.codeplex.com/MEF" mce_href="http://www.codeplex.com/MEF"&gt;MEF&lt;/a&gt; extension model.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;But those dialogs really are &lt;i style="mso-bidi-font-style: normal;"&gt;just&lt;/i&gt; the face, to make the systems work there are many invisible things, like the MEF catalog and services that manage extension state.&amp;nbsp; In fact, if you were to visit the Shell Services link I provided above, you could go down that entire list and you would find very few of the major systems that were not affected in this rewrite.&amp;nbsp; From the Start Page, to Intellisense, most services have had significant work.&amp;nbsp; MEF itself lays out a roadmap for future levels of extensibility in the product, simultaneously more comprehensive, easier to use, and in more areas.&lt;/p&gt;
&lt;p&gt;That last notion is perhaps the most important one, I&amp;rsquo;ve said this many times in various speeches but it bears repeating: It&amp;rsquo;s hard to look at Visual Studio, a product that is substantially ALL extensions, and say &amp;ldquo;it needs more extensibility&amp;rdquo; &amp;ndash; but it does.&amp;nbsp; The original Visual Studio shell provided excellent extensibility of the core services &amp;ndash; VS itself is the proof of that &amp;ndash; but what is lacking is general extensibility of the extensions themselves.&amp;nbsp; These extra levels are what we sought to add in Editor and the Common Project System, and hopefully they will pervade the product over time.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;Common&amp;rdquo; Project System&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve alluded to this system several times so far in the document; it&amp;rsquo;s also an important step on a long-term plan.&lt;/p&gt;
&lt;p&gt;Anyone who has created a project type for Visual Studio knows that it can be a serious pain to try to &lt;a href="http://en.wikipedia.org/wiki/Keeping_up_with_the_Joneses" mce_href="http://en.wikipedia.org/wiki/Keeping_up_with_the_Joneses"&gt;keep up with the Joneses&lt;/a&gt;.&amp;nbsp; The flagship languages add new features (&lt;a href="http://en.wikipedia.org/wiki/ClickOnce" mce_href="http://en.wikipedia.org/wiki/ClickOnce"&gt;ClickOnce&lt;/a&gt; is the canonical example) and since there is no central place to put project features, they end up having to be re-implemented in the code for many different project types.&amp;nbsp; The ability to create project &amp;ldquo;flavors&amp;rdquo; (described a little bit &lt;a href="http://msdn.microsoft.com/en-us/library/bb164709(VS.80).aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb164709(VS.80).aspx"&gt;here&lt;/a&gt;) helps alleviate this somewhat but certainly does not provide complete relief.&lt;/p&gt;
&lt;p&gt;So, at the start of the cycle we find ourselves in a situation that is something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We&amp;rsquo;d like to create project system that would provided the needed extensibility so that we could unify many project types&lt;/li&gt;
&lt;li&gt;We think it would be nuts to create this thing and then try to change all the projects to that plan in one release&lt;/li&gt;
&lt;li&gt;We have the C++ project system which needs to move to &lt;a href="http://en.wikipedia.org/wiki/MSBuild" mce_href="http://en.wikipedia.org/wiki/MSBuild"&gt;MSBuild&lt;/a&gt; anyway to be more like the others and gain MSBuild's incremental build&amp;nbsp;and scale benefits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the solution seems obvious &amp;ndash; we&amp;rsquo;ll start building &amp;ldquo;CPS&amp;rdquo; and we&amp;rsquo;ll do C++ first, that way we have a test case, we don&amp;rsquo;t have to change the world all at once, and the C++ team will no longer have to be in the business of managing all its own project stuff.&amp;nbsp; The reason that I quoted &amp;ldquo;Common&amp;rdquo; is that, at least for now, it&amp;rsquo;s only the &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vs2010ctpcpp/thread/b36cc0ca-3281-42cb-aa5b-6f08fff09603" mce_href="http://social.msdn.microsoft.com/Forums/en-US/vs2010ctpcpp/thread/b36cc0ca-3281-42cb-aa5b-6f08fff09603"&gt;C++ project system&lt;/a&gt; &amp;ndash; though it has ambitions to be a lot more.&lt;/p&gt;
&lt;p&gt;How hard can that be?&amp;nbsp; It&amp;rsquo;s only an all new project system with virtually all of its attributes encoded cascaded XML files, general purpose editing UI, with pervasive MEF extension points, and enough scale to handle the largest C++ solutions we have. &amp;nbsp;Why it&amp;rsquo;s triviality itself J&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Other Highlights&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;When I wrote about &amp;ldquo;Dolphin&amp;rdquo; I gave a litany of changes, it was an impressive list, but I think I can say with candor that I gave a fairly complete list of the major new pieces of work in that release.&amp;nbsp; I was able to do that because the team was a lot smaller and the whole release could fit inside one person&amp;rsquo;s head.&amp;nbsp; I&amp;rsquo;m not even going to pretend that I can write about everything that&amp;rsquo;s in VS2010 &amp;ndash; So far I&amp;rsquo;ve stayed very close to my own team and the things that were most dear to me &amp;ndash; this is only &amp;ldquo;my&amp;rdquo; history after all, the complete history would require input from thousands.&amp;nbsp; So even though I can&amp;rsquo;t possibly be complete, there are a few of my favorite new things that I want to talk about.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The New C++ Code Model&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://blogs.msdn.com/vcblog/archive/2009/10/14/visual-c-code-model-in-visual-studio-2010.aspx" mce_href="http://blogs.msdn.com/vcblog/archive/2009/10/14/visual-c-code-model-in-visual-studio-2010.aspx"&gt;VS2010 C++ Code Model&lt;/a&gt; is essentially a complete redo of the old technology.&amp;nbsp; Now I&amp;rsquo;m a funny guy to be writing about this because probably more than any other one person I&amp;rsquo;m responsible for creation of the &lt;b&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;old&lt;/i&gt;&lt;/b&gt; technology.&amp;nbsp; All those .bsc files, that was my baby, we came up with the current system when we were working on &lt;a href="http://msdn.microsoft.com/en-us/library/aa235446(VS.60).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa235446(VS.60).aspx"&gt;Minimal Rebuild&lt;/a&gt; (previously discussed) and several of my friends had the joy of maintaining that code in the years after I left the C++ team (thanks, you know who you are, and sorry!).&amp;nbsp; The .ncb code was the &amp;ldquo;no compile browser&amp;rdquo; and the original flavor of that was created by another fellow who I supervised, no name dropping, this was another case of &amp;ldquo;give the new guy this really hard project, I&amp;rsquo;m sure he&amp;rsquo;ll do fine&amp;rdquo;.&amp;nbsp; Gee I find myself apologizing a lot in this history.&lt;/p&gt;
&lt;p&gt;Anyway suffice to say they were fine in say 1993 but I think it&amp;rsquo;s possible to do a lot better in 2009 and nobody is happier to see my old code leave the building than me.&amp;nbsp; The new system offers improvements almost across the board, especially in reliability and performance.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Historical Debugging&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;You know I couldn&amp;rsquo;t do another entry without talking about debugger technology. &lt;a href="http://blogs.msdn.com/ianhu/archive/2009/05/13/historical-debugging-in-visual-studio-team-system-2010.aspx" mce_href="http://blogs.msdn.com/ianhu/archive/2009/05/13/historical-debugging-in-visual-studio-team-system-2010.aspx"&gt;Historical Debugging&lt;/a&gt; is a feature that&amp;rsquo;s been incubating in the minds of debugger people probably for as long as they&amp;rsquo;ve been debugging.&lt;/p&gt;
&lt;p&gt;I was the debugger lead in the early 90s and I used to explain the utility of debuggers and debugging tools in this way:&amp;nbsp; Imagine a program with a bug, it has been running along, everything is fine, everything is going wonderful, the flow of execution arrives at a point we&amp;rsquo;ll call Albuquerque, where it turns right.&amp;nbsp; Now as every &lt;a href="http://en.wikipedia.org/wiki/Bugs_Bunny" mce_href="http://en.wikipedia.org/wiki/Bugs_Bunny"&gt;Bugs Bunny&lt;/a&gt; fan knows, the correct thing to do at Albuquerque is to &lt;a href="http://www.bing.com/search?q=I+shoulda+turned+left+at+albuquerque" mce_href="http://www.bing.com/search?q=I+shoulda+turned+left+at+albuquerque"&gt;turn &lt;i style="mso-bidi-font-style: normal;"&gt;left&lt;/i&gt;&lt;/a&gt;. The program&amp;rsquo;s decision to go right has led it down an incorrect path and sometime later we will observe a problem.&lt;/p&gt;
&lt;p&gt;Now if we&amp;rsquo;re very lucky &amp;ldquo;sometime later&amp;rdquo; will be very soon, like for instance it might be that we just de-referenced a null pointer and we&amp;rsquo;re going to take an exception about 2 nanoseconds after the mistake.&amp;nbsp; That&amp;rsquo;s an easy bug to fix.&amp;nbsp; On the other hand it could be that &amp;ldquo;turning right&amp;rdquo; was more subtle &amp;ndash; maybe we corrupted a data structure in a minor way and it might be days before we can see an observable effect &amp;ndash; that kind of bug is a nightmare.&lt;/p&gt;
&lt;p&gt;Finding &amp;ldquo;Albuquerque&amp;rdquo; is what I call The Fundamental Problem of Debugging.&amp;nbsp; The debugger provides you with tools (e.g. breakpoints) that allow you to stop execution while things were still good and slowly approach the point where things first went wrong.&amp;nbsp; The debugger likewise provides you with tools to examine the state afterwards, hoping to find evidence of what went wrong in the recent past that will help you to see the origin.&amp;nbsp; The callstack window is a great example of looking at the past to try to understand what might have already gone wrong.&lt;/p&gt;
&lt;p&gt;To find the problem, you might start after the failure and try to look back, finding a previously unobserved symptom and moving closer to the original problem or you might start before the failure and try to move forward slowly, hopefully not overshooting the problem by too much.&amp;nbsp; Or you might do a combination of these things.&amp;nbsp; You might add assertions or diagnostic output to help you to discover sooner that things went wrong, and give you a view of the past.&amp;nbsp; It&amp;rsquo;s all about finding Albuquerque.&lt;/p&gt;
&lt;p&gt;Historical debugging directly addresses the Fundamental Problem by giving you the ability to look at a lot more of the past.&amp;nbsp; And it&amp;rsquo;s far superior to the limited ideas we had back in the 90s for accomplishing the result.&amp;nbsp; I know a couple of people who have had this idea in their head for over fifteen years &amp;ndash; it&amp;rsquo;s great to see it out there for programmers to enjoy.&amp;nbsp; I think you&amp;rsquo;ll love it, it&amp;rsquo;s like a drug! J&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Help&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The Help system was another case where we saw very early on that it should get a remodel.&amp;nbsp; I think the energy around that effort began with a very well written memo from a &lt;a href="http://blogs.msdn.com/aprilr/" mce_href="http://blogs.msdn.com/aprilr/"&gt;friend of mine&lt;/a&gt;.&amp;nbsp; Frankly the sad truth is that it was pretty hard to find people who had anything nice to say about the Help system in late 2008.&amp;nbsp; I think many users had given up and were just using their favorite online search to find what they needed, which, as a doubly tragic statistical truth, was probably not our search.&lt;/p&gt;
&lt;p&gt;The Help team didn&amp;rsquo;t have an architect so I loaned myself out to them and together we made what I think are some pretty cool plans that have borne fruit.&amp;nbsp; The new system is much lighter weight and is standards based.&amp;nbsp; Taking a cue from MS Office the content files are basically &lt;a href="http://en.wikipedia.org/wiki/XHTML" mce_href="http://en.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt; in a &lt;a href="http://en.wikipedia.org/wiki/.zip" mce_href="http://en.wikipedia.org/wiki/.zip"&gt;.ZIP file&lt;/a&gt; with a custom extension &lt;a href="http://mariusbancila.ro/blog/2009/05/12/help-3-in-visual-studio-2010/" mce_href="http://mariusbancila.ro/blog/2009/05/12/help-3-in-visual-studio-2010/"&gt;MSHC&lt;/a&gt;.&amp;nbsp; This is an archivist&amp;rsquo;s dream, but it also opens up the Help authoring space tremendously &amp;ndash; with no documentation at all you can now just look at one of the archives and pretty much figure out how to get your content anywhere in the system.&lt;/p&gt;
&lt;p&gt;For offline viewing, the customer help viewer is gone, replaced with a mini localhost web-server that delivers the help to the browser of your choice from the archives.&amp;nbsp; We tried various indexing strategies for full-text and other searches but ultimately settled on a custom indexer that I wrote in a few days (well, to be fair they did a lot of work on it after I finished my parts, but I wrote the core).&amp;nbsp; The indexer is actually very similar in operation to my old &lt;a href="http://msdn.microsoft.com/en-us/library/87x7wc99(VS.80).aspx" mce_href="http://msdn.microsoft.com/en-us/library/87x7wc99(VS.80).aspx"&gt;bscmake&lt;/a&gt; program, the C++ program database generator &amp;ndash; those techniques fit Help content well, and it produces &lt;a href="http://mariusbancila.ro/blog/2009/05/12/help-3-in-visual-studio-2010/" mce_href="http://mariusbancila.ro/blog/2009/05/12/help-3-in-visual-studio-2010/"&gt;MSHI&lt;/a&gt; files.&lt;/p&gt;
&lt;p&gt;Importantly, you don&amp;rsquo;t have to create our index format to publish Help for your topics; the MSHC file has all the information in the XHTML.&amp;nbsp; We ship pre-built MSHI files to save installation time because of the size of our corpus, but you don&amp;rsquo;t have to.&amp;nbsp; Additionally, the MSHI files can actually be merged as much or as little as desired for even more performance.&amp;nbsp; But don&amp;rsquo;t merge MSHI&amp;rsquo;s from different &lt;a href="http://en.wikipedia.org/wiki/Locale" mce_href="http://en.wikipedia.org/wiki/Locale"&gt;locales&lt;/a&gt; because there is no usable universal sort order that looks decent to customers.&lt;/p&gt;
&lt;p&gt;A 3&lt;sup&gt;rd&lt;/sup&gt; party help viewer need not use MSHI at all, you could easily build your own index.&lt;/p&gt;
&lt;p&gt;The content itself is delivered in a much lighter weight format, the big tree control is gone.&amp;nbsp; In fact most of the styling for the pages is itself stored in the content as a topic and it can all be updated like any other content.&amp;nbsp; You can have a lot of help on your system, or just a minimal set of your favorite books, your choice.&lt;/p&gt;
&lt;p&gt;Overall I&amp;rsquo;m very happy with how this effort went. We replaced aging indexing technology with something new and much more precise.&amp;nbsp; We removed the viewer application entirely.&amp;nbsp; We drastically simplified the interface between the IDE and help (basically it&amp;rsquo;s a URL at this point).&amp;nbsp; And it&amp;rsquo;s faster!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The Benefits of Dogfooding&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s fairly well known that we try to &lt;a href="http://en.wikipedia.org/wiki/Dogfooding" mce_href="http://en.wikipedia.org/wiki/Dogfooding"&gt;dogfood&lt;/a&gt; all our own products.&amp;nbsp; In this particular release I think there were some nice significant benefits from this practice.&amp;nbsp; I&amp;rsquo;ll highlight just a few of the ones that I think are the most important here.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;.NET Framework 4.0&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s hard to imagine not dogfooding this in the release given its importance but there were several unexpected benefits for customers.&amp;nbsp; First, the general character of the release was profoundly affected by Visual Studio&amp;rsquo;s early adoption, and our need to create designer assets for many different framework versions.&amp;nbsp; The effects were felt in everything from binding policy to metadata format.&amp;nbsp; As an architect I was very pleased by these results because in many cases we were able to find and prevent problems on the whiteboard &amp;ndash; where corrections are a lot a cheaper.&lt;/p&gt;
&lt;p&gt;A secondary benefit came about because Visual Studio 2010 had to implement so many existing COM interfaces in managed code &amp;ndash; resulting in a large number of &lt;a href="http://msdn.microsoft.com/en-us/library/f07c8z1c.aspx" mce_href="http://msdn.microsoft.com/en-us/library/f07c8z1c.aspx"&gt;COM Callable Wrapper&lt;/a&gt; (CCW) objects.&amp;nbsp; Likewise much new managed code needed to call existing interfaces that were not being converted, hence significant use of &lt;a href="http://msdn.microsoft.com/en-us/library/8bwh56xe.aspx" mce_href="http://msdn.microsoft.com/en-us/library/8bwh56xe.aspx"&gt;Runtime Callable Wrapper&lt;/a&gt;&amp;nbsp; (RCW) objects.&amp;nbsp; That&amp;rsquo;s all well and good, these technologies had existed for years, however, fairly innocuous seeming choices, like &amp;ldquo;when should RCW&amp;rsquo;s be cleaned up&amp;rdquo; were having profound consequences.&amp;nbsp; The additional CLR cleanup code present in past releases introduced unexpected reentrancy that was not present in the strictly native implementation.&amp;nbsp; Importantly Visual Studio gave us fairly easy and important test cases to work with and ultimately resulted in significant improvements in COM interoperability &amp;ndash; these kinds of experiences make the Framework better for everyone.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Windows Presentation Foundation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The WPF team had many headaches to deal with thanks to having VS for a customer but I&amp;rsquo;d like to think WPF also got more than a few benefits.&amp;nbsp; Some of the corrections we asked for were fairly minor &amp;ndash; like the toolbar panel&amp;rsquo;s layout code which was fairly weak, and we have a lot of toolbars.&amp;nbsp; But in other cases there were significant weakness.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d say that if there was a theme to our WPF problems it was this:&amp;nbsp; that the complexity of Visual Studio&amp;rsquo;s use of hybrid traditional Win32 and WPF elements was a new challenge.&amp;nbsp; But ultimately this resulted in a lot of goodness.&amp;nbsp; It&amp;rsquo;s possible to do good focus transitions now between WPF elements and Win32 elements, something that would make a person&amp;rsquo;s head hurt.&amp;nbsp; And, perhaps even more importantly, different combinations of hosting WPF in Win32 UI and Win32 UI in WPF were resulting in extra drawing delays.&amp;nbsp; These paths were exercised by the many window combinations present in Visual Studio and the abundance of big display transitions (like switching to debug mode and back).&amp;nbsp; Generally speaking the hosting services got a lot of exercise and were significantly improved as a consequence.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll talk a little bit more about WPF below specifically as it relates to Beta 2.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Team Foundation Server&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Of all the technologies that we beat on, I think &lt;a href="http://en.wikipedia.org/wiki/Team_Foundation_Server" mce_href="http://en.wikipedia.org/wiki/Team_Foundation_Server"&gt;TFS&lt;/a&gt; probably got the beating worse than any other system.&amp;nbsp; For sheer volume of users, size and number of shelf-sets, number of branches, merges, automated builds, reports, to say nothing of bugs, issue tracking, and basically every other TFS feature our entire division put a level of load on our TFS systems that makes me think that anyone with any load that is even remotely normal is going to have no trouble at all.&amp;nbsp; Sometimes it was painful for us, like dogfooding is (and is supposed to be) but it&amp;rsquo;s going to be that much better for you.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;From Beta 1 to Beta 2&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve saved the best news for the last section of the last installment.&amp;nbsp; Beta 1 of VS2010 represented some really great progress towards our goals but there were a lot of issues, I&amp;rsquo;m happy to report that we&amp;rsquo;ve been hard at work on the most serious ones and I think we&amp;rsquo;ve got great results for you.&amp;nbsp; I&amp;rsquo;ve listed just a few of the improvements that I think are most important below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Beta 1 got many complaints due to &amp;ldquo;fuzzy text&amp;rdquo;, in response to this WPF adopted &lt;a href="http://msdn.microsoft.com/en-us/library/dd368038(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd368038(VS.85).aspx"&gt;Direct Write&lt;/a&gt; to give a much better overall experience.&amp;nbsp; Those changes accrue to everyone (and yes you&amp;rsquo;ll get lovely text in VS!)&lt;/li&gt;
&lt;li&gt;Performance in Remote Desktop situations is much improved&lt;/li&gt;
&lt;li&gt;Startup time is significantly reduced in virtually all cases&lt;/li&gt;
&lt;li&gt;Raw typing speed is vastly improved, I know that for instance, C# raw typing speed has never been faster&lt;/li&gt;
&lt;li&gt;The new editor includes column select, as well as dozens of other underlying improvements that help region management, outlining and so forth&lt;/li&gt;
&lt;li&gt;Debugger performance, with and without historical debugging, is much improved, stepping is quite snappy&lt;/li&gt;
&lt;li&gt;The Visual Basic project system can now emit an executable while it is compiling a different one, those should yield the best build times ever for VB solutions&lt;/li&gt;
&lt;li&gt;Assorted shell changes in important panels, in data caching, in MEF catalog construction, and in style application will help virtual all cases but notably transitions between modes&lt;/li&gt;
&lt;li&gt;The new offline Help system is ready to you to use&lt;/li&gt;
&lt;li&gt;Find in Files uses a parallel search algorithm, and last, but not least&amp;hellip;&lt;/li&gt;
&lt;li&gt;The hated Add References dialog begins on a sensible tab and populates the full list of references asynchronously should you ask for them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are so many improvements I can&amp;rsquo;t possibly list them all. I lost count of the number of performance issues we addressed, there were probably over 100 performance analysis reports counting only my efforts on the most critical scenarios and I was hardly alone in this!&lt;/p&gt;
&lt;p&gt;Generally, looking at the full battery of our performance tests we find that VS2010 outperforms VS2008 in the majority of cases, and, if you weigh the scenarios by importance, VS2010 looks even better than that.&amp;nbsp; Our remaining performance battles are around reducing overall memory consumption, and I&amp;rsquo;m sure that will continue to be a focus area between now and the final release as we fight for every byte.&lt;/p&gt;
&lt;p&gt;Internally, folks are very surprised and pleased by how far we have come in this Beta. I hope you are equally pleased.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;To everyone that got this far, thanks so much for reading My History of Visual Studio, and I look forward to your feedback on either the Beta or the series.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;
&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Visit the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=151797" mce_href="http://go.microsoft.com/fwlink/?LinkID=151797"&gt;Microsoft Visual Studio 2010 and .NET Framework 4 Beta&lt;/a&gt; web site for the latest info]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9909427" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 9)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/16/my-history-of-visual-studio-part-9.aspx</link><pubDate>Sat, 17 Oct 2009 00:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9908435</guid><dc:creator>ricom</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9908435</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/16/my-history-of-visual-studio-part-9.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In the last posting I talked about the &amp;ldquo;Whidbey&amp;rdquo; release, VS2005, but I feel like I left out two really important aspects so I&amp;rsquo;d like to start this part by rewinding a bit for those two topics.&lt;/p&gt;
&lt;p&gt;I had mentioned in &lt;a href="http://blogs.msdn.com/ricom/archive/2009/10/13/my-history-of-visual-studio-part-7.aspx"&gt;Part 7&lt;/a&gt; that some of the UML support in the &amp;ldquo;Everett&amp;rdquo; time-frame was starting to foreshadow the release of &lt;a href="http://en.wikipedia.org/wiki/Visual_Studio_Team_System"&gt;VSTS&lt;/a&gt;.&amp;nbsp; Well, in Whidbey there is no foreshadowing disclaimer necessary &amp;ndash; &lt;a href="http://msdn.microsoft.com/en-us/library/aa302180.aspx"&gt;VSTS arrives&lt;/a&gt; and I think at that point it&amp;rsquo;s clear that Microsoft is going to try to have a real offering in the &lt;a href="http://en.wikipedia.org/wiki/Application_lifecycle_management"&gt;ALM&lt;/a&gt; space.&amp;nbsp; I think it&amp;rsquo;s fair to say that the venerable &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Visual_SourceSafe"&gt;VSS&lt;/a&gt; was not going to be the product to carry us into the 21&lt;sup&gt;st&lt;/sup&gt; century.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t want to understate the difficulty of bringing just &lt;a href="http://en.wikipedia.org/wiki/Team_Foundation_Server"&gt;TFS&lt;/a&gt; to market, and that&amp;rsquo;s only one part of the equation, but even giving those hard-working folks a well-deserved nod, I felt like the first VSTS was just a taste of ALM at this time &amp;ndash; whetting the appetite as it were.&amp;nbsp; But even so, with so many shops wanting to formalize their practices in some way &amp;ndash; even lightweight practices like &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt; &amp;ndash; this kind of support was welcome relief.&amp;nbsp; I think those years included a much greater level of attention to the &lt;i style="mso-bidi-font-style: normal;"&gt;process&lt;/i&gt; of creating software than at any other time in my experience.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Just 4 years after its initial 2005 release, VSTS is a huge part of what we deliver &amp;ndash; and in 2002 it didn&amp;rsquo;t even exist.&lt;/p&gt;
&lt;p&gt;I started my discussion about the Whidbey release with an observation about how big of an influence Windows Vista was on our tools.&amp;nbsp; I think I should have ended with my single biggest regret about that release because it&amp;rsquo;s highly related. &amp;nbsp;Despite its huge influence, our support for Windows Vista was lousy in the initial release, like really lousy.&amp;nbsp; It wasn&amp;rsquo;t until we delivered &lt;a href="http://msdn.microsoft.com/en-us/vstudio/bb265237.aspx"&gt;SP1&lt;/a&gt; and especially the &lt;a href="http://msdn.microsoft.com/en-us/vstudio/bb332348.aspx"&gt;Vista support for SP1 pack&lt;/a&gt; that we got to a reasonable level of support.&amp;nbsp; I could make a bunch of excuses but they all sound pathetic to me so I&amp;rsquo;ll just stick with &amp;ldquo;It&amp;rsquo;s my #1 regret.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;OK so much for the downer part of the article; let&amp;rsquo;s move on to Visual Studio 2008 &amp;ldquo;Orcas.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The thing that I most remember about &amp;ldquo;Orcas&amp;rdquo; is &lt;a href="http://beta.channel9.msdn.com/shows/WM_IN/MQ--Milestone-Quality-MQ-also-equals-Carol-Grojean-program-manager-extraordinaire-in-the-develop/"&gt;&amp;ldquo;MQ&amp;rdquo;&lt;/a&gt; &amp;ndash; the Quality Milestone.&amp;nbsp; This is where we spent the equivalent of an entire coding just taking care of nagging issues that otherwise seem to not get handled. I&amp;rsquo;ll name-drop again since I just linked her video, I&amp;rsquo;d have to say it was Carol more than anyone else that was keeping us honest about the &amp;ldquo;debt&amp;rdquo; we had accumulated in our product and popularizing that meme in our division.&amp;nbsp; Debt is a great way to think about trade-offs: every time you make a choice that isn&amp;rsquo;t right in the long term, any short-cut, accumulates some debt.&amp;nbsp; Any bug you choose to defer, that&amp;rsquo;s debt.&amp;nbsp; Some debt you should write-off, that fix just isn&amp;rsquo;t happening, some you should address, but always you should be aware that you&amp;rsquo;ll have to deal with it sooner or later, and it may as well be sooner.&lt;/p&gt;
&lt;p&gt;That mind-set, which was the focus of MQ was pervasive for the whole release, and I think it shows.&amp;nbsp; From a stability and performance perspective VS2008 was universally better than 2005 &amp;ndash; a very hard thing to achieve in any major release with significant additions.&lt;/p&gt;
&lt;p&gt;I think the &amp;ldquo;star&amp;rdquo; of VS2008 was &lt;a href="http://en.wikipedia.org/wiki/Linq"&gt;Linq&lt;/a&gt; &amp;ndash; my favorite flavor was &amp;ldquo;Linq to SQL&amp;rdquo; which &lt;a href="http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx"&gt;I&amp;rsquo;ve written about&lt;/a&gt; at some length before.&amp;nbsp; Perhaps the most amazing thing about Linq is that its introduction into both C# and VB allowed mainstream programmers to start using &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;functional concepts&lt;/a&gt; in a natural way, often without even realizing it!&amp;nbsp; But a close second are two other amazing things:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Linq variants (Linq to XXX) started appearing like crazy &amp;ndash; the notation was incredibly useful&lt;/p&gt;
&lt;p&gt;2)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; You could actually get great performance out of this kind of layer without inflicting craziness on users (see my article again for the Linq to SQL discussion)&lt;/p&gt;
&lt;p&gt;In the same way that the needs of high quality designers drove advances like partial classes (critical for code separation) Linq variants and their needs, drove the &lt;a href="http://en.wikipedia.org/wiki/Type_inference"&gt;type inference&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Extension_method" mce_href="http://en.wikipedia.org/wiki/Extension_method"&gt;extension methods&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Abstract_semantic_graph" mce_href="http://en.wikipedia.org/wiki/Abstract_semantic_graph"&gt;expression tree&lt;/a&gt; features, including concise &lt;a href="http://en.wikipedia.org/wiki/Lambda_calculus"&gt;lambda&lt;/a&gt; notation, necessary for its success into the mainstream languages.&amp;nbsp; &amp;nbsp;This brings great collateral benefits because those exact same notions are helpful in so many other scenarios &amp;ndash; I use them pervasively in my WPF code for event handling for instance.&lt;/p&gt;
&lt;p&gt;As usual this all comes at a cost, it&amp;rsquo;s not just language notation: it&amp;rsquo;s also the debugging support, profiling, garbage collection, FXCOP, and so on.&amp;nbsp; After all, just because a method is dynamically generated, has no name, and no &lt;a href="http://en.wikipedia.org/wiki/Program_database"&gt;.pdb&lt;/a&gt; file information, doesn&amp;rsquo;t mean you don&amp;rsquo;t want to analyze it like the others.&amp;nbsp; And of course the ability to generate expression trees in addition to &lt;a href="http://en.wikipedia.org/wiki/Intermediate_language"&gt;IL&lt;/a&gt; represents another significant undertaking for the compilers.&amp;nbsp; All of this is fundamentally necessary for Linq to succeed but it&amp;rsquo;s kind of invisible &amp;ndash; it&amp;rsquo;s the stuff you expect to just work.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Orcas&amp;rdquo; also included the &amp;ldquo;Cider&amp;rdquo; designer for WPF. Remember that during this period there had been several runtime releases including 3.0 and it shipped alongside 3.5 of the framework.&amp;nbsp; Well by the WPF was a first class application target and it needed designer support and the richness of WPF resulted in perhaps one of the most complicated designers ever created. It&amp;rsquo;s doubtful that a successful designer could have been created if not for the lessons from &amp;ldquo;Sparkle&amp;rdquo; aka &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Expression_Blend"&gt;Expression Blend&lt;/a&gt;, and language advances like partial classes to ease things along.&lt;/p&gt;
&lt;p&gt;The abundance of framework subsets led to the need for multi-targeting &amp;ndash; that is the ability of the tool to target any one of several framework versions or to have solutions with projects targeting arbitrary combinations.&amp;nbsp; This was tricky enough in Orcas but at least the frameworks all shared a common core &amp;ndash; simplifying things significantly.&amp;nbsp; That grace would be absent in the follow-on release VS2010.&lt;/p&gt;
&lt;p&gt;Other application models were popping up as well &amp;ndash; &lt;a href="http://wikipedia/wiki/Silverlight"&gt;Silverlight&lt;/a&gt; had made its debut, taking WPF concepts to the web, and Windows Workflow (&lt;a href="http://en.wikipedia.org/wiki/Workflow_Foundation"&gt;WF&lt;/a&gt;) also delivered a release and a designer.&amp;nbsp; If it wasn&amp;rsquo;t already &lt;i style="mso-bidi-font-style: normal;"&gt;de facto&lt;/i&gt; reality, the general theme that &amp;ldquo;every application model needs a suitable design experience&amp;rdquo; was certainly cemented during this period.&lt;/p&gt;
&lt;p&gt;Debugging technology takes itself to new amazing places like &lt;a href="http://en.wikipedia.org/wiki/XSLT"&gt;XSLT&lt;/a&gt; debugging (XSLT makes my head hurt even more than &lt;a href="http://en.wikipedia.org/wiki/APL_(programming_language)"&gt;APL&lt;/a&gt;) and gains the ability to debug into the &lt;a href="http://en.wikipedia.org/wiki/Base_Class_Library"&gt;BCL&lt;/a&gt; and dynamically download the source as needed to do the job.&amp;nbsp;&amp;nbsp; Very slick, but by now you know I&amp;rsquo;m partial to debugging technology J&lt;/p&gt;
&lt;p&gt;And on the native code front, &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Foundation_Classes"&gt;MFC 9&lt;/a&gt; makes its appearance &amp;ndash; adding support for new Vista concepts, and representing the first significant update to MFC in a very long time.&lt;/p&gt;
&lt;p&gt;But for me the biggest memories are just working on performance across the board, from MQ to the finish.&amp;nbsp; In the framework, in the tools, we made big dents in many scenarios and overall, even with lots of new features, Orcas felt snappier than Whidbey which was a great accomplishment.&amp;nbsp; I loved using it!&lt;/p&gt;
&lt;p&gt;I just hit 1200 words so I think it&amp;rsquo;s time to stop, having skipped vast regions and barely mentioned VSTS, I&amp;rsquo;ll pick up again in a bit.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thank you for all the feedback and comments, they&amp;rsquo;re much appreciated.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9908435" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 8)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/14/my-history-of-visual-studio-part-8.aspx</link><pubDate>Thu, 15 Oct 2009 02:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9907419</guid><dc:creator>ricom</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9907419</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/14/my-history-of-visual-studio-part-8.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t really talk about what was going on in the IDE without covering what was happening in the runtime because their fates are so intertwined, so even though it&amp;rsquo;s off topic a little bit, allow me to cover some details from Framework 2.0.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Longhorn&amp;rdquo;, which became Windows Vista, was probably the single greatest influence on the Developer Division during the years when .NET Framework 2.0 and Visual Studio 2005 (collectively &amp;ldquo;Whidbey&amp;rdquo;) were being developed.&amp;nbsp; I think I could write several books on those years as a study in being too successful for your own good.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As I wrote earlier there was a certain mania in managed code adoption during that time and, though ultimately some of those efforts had to be scrapped, many were a positive influence on the tool chain.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anecdote: It&amp;rsquo;s not really important to the story but just for fun I can&amp;rsquo;t resist telling you about my first day on the job when I joined the CLR performance team.&amp;nbsp; I had been working for the last 7 years in the MSN area, with a great emphasis on server workloads, data architectures, and so forth.&amp;nbsp; So I was a bit surprised when on day one I was told I was going to be working on our client performance problems &amp;ndash; that&amp;rsquo;s a Whisky Tango Foxtrot moment.&amp;nbsp; Pays to be flexible I guess J&lt;/p&gt;
&lt;p&gt;Client workloads were a lot harder on the .NET Framework at that time.&amp;nbsp; We did have an ngen story but it needed a lot of work.&amp;nbsp; Putting as much code as possible into readily shared DLLs is fundamentally necessary to getting reasonable memory usage on the client &amp;ndash; much less of an issue on dedicated servers for instance.&amp;nbsp; Contrariwise, code sharing is even more essential on a Terminal Server with potentially hundreds of users running client applications.&lt;/p&gt;
&lt;p&gt;Sharing also vitally important to flagship applications, like Visual Studio, that are trying to get their code loaded as quickly as possible using technologies like &lt;a href="http://en.wikipedia.org/wiki/Superfetch#SuperFetch"&gt;Superfetch&lt;/a&gt;.&amp;nbsp; It&amp;rsquo;s a pretty simple chain of events, jitted code can&amp;rsquo;t be shared, unshared code uses more memory, use too much memory and you&amp;rsquo;re dead. Sharing is good. We had to do more of it.&amp;nbsp; It was doubly important because major new Framework elements were being developed while this was all going on: &amp;nbsp;things like Windows Presentation Foundation (WPF) and Windows Communication Foundation (WCF) to name a few.&lt;/p&gt;
&lt;p&gt;The Base Class Library (BCL) was gaining support for Generics (starring my favorite Nullable&amp;lt;T&amp;gt;) and XML use was exploding in all parts of the stack.&amp;nbsp; I used to joke that if angle brackets &amp;lt;&amp;gt; had never been invented I would have no performance issues to work on.&amp;nbsp; If only it were true.&lt;/p&gt;
&lt;p&gt;In the universe of technologies requiring tool support we really should add at least two more.&amp;nbsp; There were yet more improvements to ASP.NET, there were compelling 64 bit architectures (x64 and ia64), and, probably most difficult of all the considerations, there was &lt;a href="http://en.wikipedia.org/wiki/Microsoft_SQL_Server#SQL_Server_2005"&gt;SQL Server 2005&lt;/a&gt; &amp;ldquo;Yukon&amp;rdquo; which introduced SQL CLR allowing users to write stored procedures in managed code.&lt;/p&gt;
&lt;p&gt;Again, I could write whole books on what was going on in the runtime components, but I&amp;rsquo;m trying to stay focused on Visual Studio for this series so I think that&amp;rsquo;s probably enough landscape setting, as it is with all those changes it&amp;rsquo;s easy to see why Whidbey took nearly three years.&lt;/p&gt;
&lt;p&gt;For starters, there were whole new project and deployment types needed to support the new ASP.NET with its own, new, developer server; and likewise for the SQL scenarios.&amp;nbsp; And while I&amp;rsquo;m on the topic of project and deployment this is also where &amp;ldquo;&lt;a href="http://en.wikipedia.org/wiki/ClickOnce"&gt;ClickOnce&lt;/a&gt;&amp;rdquo; makes its debut.&lt;/p&gt;
&lt;p&gt;ClickOnce had to permeate our project systems but its introduction also highlighted an inherent weakness:&amp;nbsp; despite the extensibility offered in the project space there was (and indeed is) no one central place ClickOnce deployment could be added so that all project types would benefit.&amp;nbsp; This is a classic example of why ongoing refactoring/remodeling of architecture is so important.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Personal note: my first direct interaction with the Visual Studio team during this time period was working on the performance of the Create New Project dialog &amp;ndash; something which can never quite go fast enough to make us happy.&lt;/p&gt;
&lt;p&gt;Ok so the project system needed work.&amp;nbsp; What else?&amp;nbsp; Well, anytime you add pretty much anything you can expect the debugger to be affected, this was no exception.&amp;nbsp; Generics &amp;ndash; check, needs debugging support, SQL CLR &amp;ndash; check needs debugging support, it was a long list.&amp;nbsp; But there was even more than just that going on: I have written earlier about the challenges of what we call &amp;ldquo;interop debugging&amp;rdquo; (where you debug both managed and unmanaged code at the same time) &amp;ndash; in this release both the debugger and runtime teams put considerable effort into making interop debugging more reliable.&amp;nbsp; That meant taking a very hard look at all the communications logic, the locking model, the safe-stopping points vs. &amp;ldquo;skid&amp;rdquo; points as I called them.&amp;nbsp; It was a huge endeavor, but as a result interop debugging got noticeably better in VS2005.&lt;/p&gt;
&lt;p&gt;All this hard work actually had an unexpected extra bonus.&amp;nbsp; We also introduced a managed code profiler in this timeframe and as it turns out, trying to stop managed code as it runs so that you can walk the stack the way profilers like to do tends to have all the same kinds of problems as trying to stop the code in a debugging context.&amp;nbsp; As a result, much of the hard work that went into getting the debugger working resulted in a more effective profiler solution.&lt;/p&gt;
&lt;p&gt;I should come back to SQL 2005 support &amp;ndash; it isn&amp;rsquo;t enough to just add project and debugging features but &lt;a href="http://en.wikipedia.org/wiki/ADO.NET"&gt;ADO.NET&lt;/a&gt; 2.0 was making its appearance and that requires suitable designers.&amp;nbsp; Visual Studio perhaps earns its name more so than its antecedent &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;Visual Basic&lt;/a&gt; because it&amp;rsquo;s Visual in many different ways &amp;ndash; just visual forms no longer suffices.&amp;nbsp; New SQL engine means data designers are a must.&lt;/p&gt;
&lt;p&gt;As if all of that wasn&amp;rsquo;t enough, there were two brand new pieces of technology that appeared during this time as well.&amp;nbsp; These were part of our Office programming story:&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Visual_Studio_Tools_for_Applications"&gt;VSTA&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/VSTO"&gt;VSTO&lt;/a&gt;.&amp;nbsp; In a few words, VSTA is tooling for &lt;a href="http://en.wikipedia.org/wiki/Independent_software_vendor"&gt;ISV&amp;rsquo;s&lt;/a&gt; to provide scripting features to their users, allowing their users to write managed language programs that automating their product.&amp;nbsp; The primary user is clearly Office but in principle anyone can participate &amp;ndash; you get a complete authoring experience with it.&amp;nbsp; VSTO, in contrast, allows you to write office extensions, intended to be written as native code against a COM API, using managed languages instead.&amp;nbsp; That poor sentence hardly does justice to the difficulty of achieving this result, and I&amp;rsquo;m glossing over the fact that there were other VSTO solutions as far back as 2003 but this is where I remember the spotlight first shining on that technology with any kind of luminosity.&lt;/p&gt;
&lt;p&gt;But, even with all this good work, there was one thing that stands out in my memory as being more important than all the others.&lt;/p&gt;
&lt;p&gt;Edit and Continue was back &amp;ndash;&amp;nbsp;and there was great rejoicing.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9907419" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 7)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/13/my-history-of-visual-studio-part-7.aspx</link><pubDate>Wed, 14 Oct 2009 02:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9906961</guid><dc:creator>ricom</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9906961</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/13/my-history-of-visual-studio-part-7.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p&gt;[I know I promised to talk about &amp;ldquo;Whidbey&amp;rdquo; in this installment but I realized I needed a bridge to get there or else I&amp;rsquo;d totally skip over &amp;ldquo;Everett&amp;rdquo; &amp;ndash; so this is that bridge.]&lt;/p&gt;
&lt;p&gt;In MSN the arrival of the .NET Framework and Visual Studio .NET was like a breath of fresh air.&amp;nbsp; My team was working on (among other things) a COM based object model for a content management system.&amp;nbsp; I once estimated that fully half the code was associated with the implementation of IUnknown in direct or aggregated cases (let&amp;rsquo;s hear it for punkOuter) or else tricky ref count management &amp;ndash; to say nothing of the similar code that was in every client.&lt;/p&gt;
&lt;p&gt;Using the old code as a reference, just one developer was able to re-implement the entirety of the interfaces &amp;ndash; save one class which we chose to wrap with COM interop instead &amp;ndash; in about 3 months. While it&amp;rsquo;s true that I have a high opinion of her (you know who you are) I think this was a great example of the .NET Framework shining in its strong areas.&lt;/p&gt;
&lt;p&gt;The resulting libraries integrated seamlessly with ASP.NET (naturally) and were maybe &amp;frac14; the size with superior performance.&amp;nbsp; One should never discount the cost of all those interlocked increments in COM objects and all the small allocations and long term fragmentation.&lt;/p&gt;
&lt;p&gt;Fragmentation, or rather lack of it, was another key benefit we got from the .NET stack in that time frame.&amp;nbsp; Until then it had been the bane of our existence, with 72 hour tests frequently showing performance degrading over time &amp;ndash; we found that we got 5x the speed of regular ASP and stable performance over time.&lt;/p&gt;
&lt;p&gt;We had other systems, formerly written in &lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt; that we were again able to rewrite in C# in a fraction of the time.&amp;nbsp; A key benefit was the strong UNICODE support that .NET offered &amp;ndash; we just weren&amp;rsquo;t getting what we needed out of the Perl implementations we had, to say nothing of the threading benefits.&amp;nbsp; Debugging it was a dream compared to the old world.&lt;/p&gt;
&lt;p&gt;In less than 6 months we had an all new data pump and all new managed content management system both scalable and more reliable than either of the previous systems.&amp;nbsp; Life was good.&lt;/p&gt;
&lt;p&gt;So I decided I should give up on MSN and go work on the CLR; I don&amp;rsquo;t think they ever forgave me. :)&lt;/p&gt;
&lt;p&gt;By the time I joined the CLR, fall of 2002, their work on &amp;ldquo;Everett&amp;rdquo; (aka Visual Studio .NET and .NET Framework 1.1) was nearly done, it didn&amp;rsquo;t release until the spring but things were winding down there and so I started working on &amp;ldquo;Whidbey&amp;rdquo; almost right away, but I don&amp;rsquo;t want to just gloss over Everett because some important stuff happened.&lt;/p&gt;
&lt;p&gt;C++ is a moving target, I guess all non-dead languages share that property but perhaps C++ is a lot more robust in this regard than many other modern languages, as a result there is almost always standards-catch-up work a compiler team should be doing. In this case it was around partial templates &amp;ndash; this stuff makes my brain hurt &amp;ndash; but I guess it should hurt: &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt; templates are &lt;a href="http://en.wikipedia.org/wiki/Turing-complete"&gt;Turing Complete&lt;/a&gt;. Frankly I was amazed by what the C++ team had managed to accomplish in the time they had, the needs of managed C++ and &lt;a href="http://msdn.microsoft.com/en-us/library/aa712982(VS.71).aspx"&gt;IJW&lt;/a&gt; (It Just Works) managed support.&lt;/p&gt;
&lt;p&gt;But there was a lot more in &amp;ldquo;Everett&amp;rdquo; despite the fact that it was supposed to be a minor update.&amp;nbsp; For instance, Everett introduced support for managed code on mobile devices.&amp;nbsp; &amp;nbsp;I can&amp;rsquo;t believe I&amp;rsquo;m saying that like you just push the &amp;ldquo;go mobile&amp;rdquo; button on .NET and out pops .NET CF and all the compilers, debuggers, emulators, and deployment tools just like that.&amp;nbsp; I think they made it look too easy.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Everett also introduced the Enterprise Architect version with the first &lt;a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language"&gt;UML&lt;/a&gt; support in our systems, maybe foreshadowing &lt;a href="http://en.wikipedia.org/wiki/Visual_Studio_Team_System"&gt;VSTS&lt;/a&gt;.&amp;nbsp; Designers were definitely here to stay.&lt;/p&gt;
&lt;p&gt;But truthfully I can&amp;rsquo;t say very much about &amp;ldquo;Everett&amp;rdquo; because I was desperately trying to learn about the runtime and getting ready for &amp;ldquo;Whidbey&amp;rdquo;.&amp;nbsp; Meanwhile &amp;ldquo;managed code mania&amp;rdquo; was at its zenith at Microsoft; sometimes it seemed like every product was trying to find a way to incorporate the .NET Framework into their plans.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9906961" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 6)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/12/my-history-of-visual-studio-part-6.aspx</link><pubDate>Tue, 13 Oct 2009 02:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9906392</guid><dc:creator>ricom</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9906392</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/12/my-history-of-visual-studio-part-6.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;The years 1998 to 2002 were very busy ones in the Developer Division.&amp;nbsp; I&amp;rsquo;ve previously written about &amp;ldquo;Dolphin&amp;rdquo; and I tried to give a sense of exactly how much changed during the Dolphin release and the sheer volume of work it required, but I think this period dwarfs that one in a number of ways.&lt;/p&gt;
&lt;p&gt;Visual C++ 2.0 &amp;ldquo;Dolphin&amp;rdquo; was, by definition, &amp;ldquo;just&amp;rdquo; a C++ product. Putting aside the fact that it was designed to allow extensions for multiple languages, the scope of the system was limited to only one part of the Developer Division.&amp;nbsp; In contrast, Visual Studio .NET, which spans the four years we&amp;rsquo;re talking about, and maybe a little more if you count the foundational parts that were already in VS6, was an effort that required the engagement of the entire division.&amp;nbsp; Arguably it was the first time we ever attempted such a thing in the developer space.&lt;/p&gt;
&lt;p&gt;Just thinking about it from the perspective of the number of people involved is telling &amp;ndash; VC2 was the work of 100ish people.&amp;nbsp; VS.NET required more like 20 times that, for more than twice as long.&lt;/p&gt;
&lt;p&gt;What kinds of things happened?&amp;nbsp; Well for starters the entire managed stack of what we&amp;rsquo;d call the .NET Framework had to be invented.&amp;nbsp; Not completely from scratch but pretty close.&amp;nbsp; That&amp;rsquo;s not just the runtime and the framework but also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;all the supporting file structures for IL and executable files, and inspectors for the same&lt;/li&gt;
&lt;li&gt;a world class garbage collector, in two flavors&lt;/li&gt;
&lt;li&gt;several variations of JIT compilers, as well as precompiled (ngen)&lt;/li&gt;
&lt;li&gt;several new major language compilers (C#, VB.Net, and managed C++)&lt;/li&gt;
&lt;li&gt;a complete &amp;ldquo;partial trust&amp;rdquo; model allowing for hosts that want a sandbox solution&lt;/li&gt;
&lt;li&gt;debugging and profiling APIs for these components used heterogeneously &amp;ndash; bringing us back to the world of soft-mode debugging the runtime&lt;/li&gt;
&lt;li&gt;rich interop choices for both direct calls and COM, into and out of the framework, as well assorted serialization and object remoting strategies&lt;/li&gt;
&lt;li&gt;the entire ASP.NET stack for IIS
&lt;div&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;new application models:&amp;nbsp; Winforms and Webforms for this environment including a flagship design experience for both of these&lt;/li&gt;
&lt;li&gt;solutions that contain projects of all these types in arbitrary combinations
&lt;div&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;an IDE that would handle of the these new experiences in addition to allowing unification of every major feature of all the other IDEs put together&lt;/li&gt;
&lt;li&gt;an IDE with an extension model that would allow 3rd parties to do their own languages/environments, just like ours&lt;/li&gt;
&lt;li&gt;lots more that I don&amp;rsquo;t even have room for&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s quite an eye-opening experience to consider that all of these things were required to succeed and you can sort of understand why it took so long &amp;ndash; some of the things on that list really can&amp;rsquo;t be started until others of them are substantially done, but of course the more complex later projects are likely to highlight problems in the earlier stages.&amp;nbsp; With so many people involved just the communication overhead could be daunting, and the tasks above are hardly easy in the first place.&lt;/p&gt;
&lt;p&gt;Well I&amp;rsquo;d like this to not read quite so much like a marketing bullet list so allow me to recall a few stories about all this from my own perspective &amp;ndash; remember I was still in MSN here.&lt;/p&gt;
&lt;p&gt;When I first heard about the next version of COM+, which became the .NET Framework, it was in the context of a pitch from the developer division to my MSN group asking that maybe we should consider moving some properties to ASP.NET to give feedback.&amp;nbsp; There was a lot of information to disseminate and many things were still preliminary but I remember that there was one thing that I fundamentally did not &amp;ldquo;get&amp;rdquo; about the whole thing.&amp;nbsp; It was because they were still calling it COM+ at that time and I had assumed that they were trying to come up with a new COM+ framework that was backwards compatible with the &lt;a href="http://en.wikipedia.org/wiki/COM_plus#COM.2B"&gt;old COM+&lt;/a&gt; stuff like what we used in the &lt;a href="http://msdn.microsoft.com/en-us/library/ms679938(VS.85).aspx"&gt;DTC&lt;/a&gt;.&amp;nbsp; When they told me that they were trying to do a compacting memory scheme in that world I thought they were completely nuts, at minimum you&amp;rsquo;d have to have proxy objects for everything so that you could move the real objects without anybody knowing.&amp;nbsp; We were maybe 45 minutes into the meeting before I realized the magnitude of what they were proposing &amp;ndash; they wanted an entirely new object model with an entirely different memory management strategy in all new languages.&amp;nbsp; Wow.&amp;nbsp; Just, wow.&lt;/p&gt;
&lt;p&gt;The next demo hit close to home.&amp;nbsp; It was a managed client for a web service.&amp;nbsp; They just pointed the tool at a web service and instantly had Intellisense over of it using VB.NET.&amp;nbsp; It had some rough spots but definitely another wow.&amp;nbsp; The next was a quick demo where they imported a &lt;a href="http://en.wikipedia.org/wiki/COM_Interop"&gt;COM component&lt;/a&gt;, the kind we used on our web pages for ad delivery and so forth, and then started calling that with Intellisense support sweet-as-you-please using nothing but the component&amp;rsquo;s TLB.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;I was so excited I got myself an early drop of the thing and started writing benchmarks.&amp;nbsp; I wrote applications that did the kind of string manipulations that our web sites usual did and sent them feedback based on my results.&amp;nbsp; A lot of them made a difference.&amp;nbsp; I had a sabbatical coming up and I ended up spending most of my six weeks reading the base documentation for what they had built, partly to provide feedback, but even more because I thought it was going to be really important to learn it.&amp;nbsp; It would turn into my next job two years later.&lt;/p&gt;
&lt;p&gt;What about some of those other items on the list?&amp;nbsp; There&amp;rsquo;s some pretty meaty stuff there; I&amp;rsquo;d like to pick off a few and talk about them a little bit, and I&amp;rsquo;m so fond of debuggers; let&amp;rsquo;s start there. &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It turns out that debugging managed code can be pretty tricky.&amp;nbsp; I alluded to the fact that it&amp;rsquo;s a soft-mode debugger (like VC1). I say this because it has the key property of soft-mode debuggers which is that the debuggee isn&amp;rsquo;t really stopped when you stop it.&amp;nbsp; Both the VC1 debugger and the .NET managed debugger share this but they accomplish it totally differently and for different reasons.&amp;nbsp; In managed debugging &amp;ldquo;your&amp;rdquo; code really does stop normally, but there is a debugger helper thread in the debuggee that provides access to key structures and otherwise relays important information back to the debugger, so technically the debuggee isn&amp;rsquo;t completely stopped. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;So far so good, but if that were the extent of the situation, then this wouldn&amp;rsquo;t be a very interesting discussion &amp;ndash; maybe you could call that &amp;ldquo;nearly hard&amp;rdquo; mode or something &amp;ndash; the real situation is a lot more complicated. One complexity is the fact that when if the user tries to stop the debuggee because it&amp;rsquo;s say in an infinite loop, it&amp;rsquo;s possible that the debuggee is in the middle of some runtime call and not directly executing the code the user wrote. It could be in the middle of a garbage collection for instance. If that happens you don&amp;rsquo;t really want to stop the program right away do you? If you did, you&amp;rsquo;d find that your universe looks wrong &amp;ndash; some of the objects have been moved some have not, some pointers may still need to be corrected. In short, the world is not in a good state and there are lots of these temporarily-bad states that could be visible to a debugger.&amp;nbsp; Ouch.&amp;nbsp; So this is another typical soft-mode problem, when you try to stop, you kind of have to skid, get the debuggee somewhere sensible, then stop (or pretend to stop).&lt;/p&gt;
&lt;p&gt;If that wasn&amp;rsquo;t bad enough, the managed debugging has to work in a hybrid program that&amp;rsquo;s partly managed and partly unmanaged, maybe with some threads having different combinations.&amp;nbsp; So if you try to stop one thread that&amp;rsquo;s unmanaged you should be able to do the usual hard-mode thing but if you then try to inspect a different thread that is managed well that could then cause you problems unless you&amp;rsquo;re treating each thread as it needs to be treated for the kind of code its running at the time its stopped&amp;hellip;&amp;nbsp; Oh my&amp;hellip;&lt;/p&gt;
&lt;p&gt;Add to this fun the fact that you often have to actually &lt;i style="mso-bidi-font-style: normal;"&gt;run&lt;/i&gt; managed code to do normal debugger things like evaluate properties and you find that our poor debugger folks had a few things on their minds while they were integrating all of this.&amp;nbsp; It&amp;rsquo;s so easy to assume those call stacks and parameter values are easy J&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s pick a couple more of the more technically interesting problems from that bulleted list I started with.&amp;nbsp; One very interesting one is the Winforms designer.&amp;nbsp; Now this particular designer is interesting (perhaps unique at the time) because it needs to provide a full-fidelity visualization of the form you are authoring, including, for instance, controls on that form you have written yourself in the very same project.&amp;nbsp; These are what I like to call the &amp;ldquo;first party&amp;rdquo; controls.&amp;nbsp; It&amp;rsquo;s easy to show that in general the only way you can provide that kind of fidelity is to actually run the code in the designer.&amp;nbsp; So now we have to take the code you are writing, compile it on the sneak, load it within the IDE itself (using the very same framework of course) and then you can see your whole form, panels and all, just as it will appear in your application.&amp;nbsp; Wrap it with handles and rulers and so forth to allow direct manipulation and you have yourself one very slick designer!&amp;nbsp; Not easy to get that right.&lt;/p&gt;
&lt;p&gt;What about all that new IDE integration and extensibility?&amp;nbsp; Well to make that all happen you have to painstakingly go over all of the extensibility features that are in each of the existing shells, formalize them with clean COM contracts &amp;ndash; usually after conducting personal interviews to find out what the existing informal contracts &amp;ldquo;really mean&amp;rdquo; &amp;ndash; and then fit those into an all new framework of interfaces and components that is itself extensible by 3rd parties.&amp;nbsp; Naturally this is a totally thankless job and it&amp;rsquo;s as likely as not that everyone involved will say you did it wrong no matter how careful you are.&amp;nbsp; It&amp;rsquo;s kind of like tax-assessment: you know you have it perfectly fair when everyone hates it equally.&amp;nbsp; But in the end it was super-successful; there are literally dozens (if not hundreds) of language extensions available for Visual Studio &amp;ndash; you really could do this even if you didn&amp;rsquo;t work in Redmond!&lt;/p&gt;
&lt;p&gt;I could keep writing about how technically impressive Visual Studio .NET was, maybe I could even win a debate with the thesis &amp;ldquo;Visual Studio .NET was the most technically impressive release ever&amp;rdquo; but the fact of the matter is a lot of people didn&amp;rsquo;t like it; history isn&amp;rsquo;t all sunshine and roses after all.&amp;nbsp; I think I&amp;rsquo;d be remiss if I didn&amp;rsquo;t talk about at least some of the sore points so I&amp;rsquo;m going to hit one squarely on the head.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A lot of VB programmers did not want VB.NET at all and liked VS.NET just as much (i.e. they didn&amp;rsquo;t like it at all).&lt;/p&gt;
&lt;p&gt;Why?&amp;nbsp; Well the answer to that question is probably a whole book right there but let me boldly make some guesses.&lt;/p&gt;
&lt;p&gt;First, VB.NET was not the language they wanted.&amp;nbsp; The runtime changes presented a challenge, there was Winforms to learn for instance, but I think those might have been more acceptable if the language itself had been more VB-ish.&amp;nbsp; Traditionally there had always been a compiled version of BASIC and an interpreted version at the same time.&amp;nbsp; &amp;nbsp;VB.NET decidedly had that compiled-language feel and that didn&amp;rsquo;t sit well with those that wanted an interpreted feel.&amp;nbsp; I think a language that was more like &amp;ldquo;Iron Basic&amp;rdquo; (e.g. like our &lt;a href="http://en.wikipedia.org/wiki/Iron_Python"&gt;IronPython&lt;/a&gt; language but Basic instead of Python, still targeting .NET) would have been well received.&amp;nbsp; It scripts like a dream, it has direct access to .NET objects, you can run it in a little immediate window if you like, and change anything at all about your program on the fly.&amp;nbsp; I suspect we would have loved to deliver such a language but during that time we simply didn&amp;rsquo;t yet know how to do so.&lt;/p&gt;
&lt;p&gt;Second, VS.NET was not the IDE they wanted.&amp;nbsp; They were used to something smaller, tailor-made for VB that had genetically evolved for VB users, and this wasn&amp;rsquo;t it.&amp;nbsp; In the initial version of the integrated shell, Edit and Continue wasn&amp;rsquo;t working for the .NET languages leading to the astonishing first-time situation that the C++ system had edit and continue and the &lt;a href="http://en.wikipedia.org/wiki/Rapid_application_development"&gt;RAD&lt;/a&gt; programming languages did not!&lt;/p&gt;
&lt;p&gt;I think the net of all this was that there were divided loyalties among that generation of VS users &amp;ndash; I think that still persists actually.&amp;nbsp; It was impossible to not acknowledge VS.NET as a great technical achievement but it was also impossible to say that every customer was pleased with the direction.&lt;/p&gt;
&lt;p&gt;Whatever else you say though, the 2002 offering became the new foundation for tools innovation at Microsoft and it began a new era in IDE development here.&amp;nbsp; One in which a key distinguishing factor was the presence of rich graphical designers for virtually every development task. &amp;nbsp;&amp;nbsp;It was in this release that the notion that it was enough to simply throw up a text editor and call it good became insufficient.&amp;nbsp; Arguably, even now, Visual Studio&amp;rsquo;s bevy of designers are a key aspect of its success.&lt;/p&gt;
&lt;p&gt;Not long after Visual Studio .NET I returned to the Developer Divison, I&amp;rsquo;ll pick up the story at the &amp;ldquo;Whidbey&amp;rdquo; release in the next part.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9906392" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 5)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/10/my-history-of-visual-studio-part-5.aspx</link><pubDate>Sat, 10 Oct 2009 18:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905774</guid><dc:creator>ricom</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9905774</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/10/my-history-of-visual-studio-part-5.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx" mce_href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re still on the part of the story where I was off working in MSN which means all I can give you are the first- and second-hand stories that I&amp;rsquo;ve heard over the years. So I guess that makes them second- and third- hand to you.&amp;nbsp; This would be a great time to watch the &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;Channel Nine Documentary&lt;/a&gt; for more authoritative information J&lt;/p&gt;
&lt;p&gt;In the last part I wrote a little bit about what was happening in the VC++ IDE &amp;ndash; &amp;ldquo;edit and continue&amp;rdquo; for C++ programmers &amp;ndash; pretty amazing stuff.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;At about this time the Internet happened.&amp;nbsp; I mention that like it&amp;rsquo;s in passing but, even looking at the phenomenon super-narrowly, just from the perspective of how it affected our programming tools it had some pretty big effects.&lt;/p&gt;
&lt;p&gt;Of course probably the most major one was the creation of Visual Interdev to help people create great web applications.&amp;nbsp; You know that shell is going to be central to the story in a way nobody expected at the time (ok, maybe the VID guys expected it, but nobody else J) but also script and dynamic languages made a huge resurgence.&amp;nbsp; Perl, Python &amp;ndash; remember web sites in Perl?&amp;nbsp; And of course jscript, at first as a client-side language in the browser, but then more generally, and its twin in our world: vbscript.&lt;/p&gt;
&lt;p&gt;But for the web server needs and the browser needs, we might not have driven these languages within Microsoft as hard as we did.&amp;nbsp; They helped our tools grow up in unexpected ways, like for instance, I think in VC5 you could finally call the editor &amp;ldquo;grown up&amp;rdquo; &amp;ndash; it had been originally fairly underpowered as programmer&amp;rsquo;s editors go &amp;ndash;&amp;nbsp;but in VC5 full macro support was added (not just little recordings) using the vbscript engine.&amp;nbsp; It still needed polish but you could now no longer argue that it was lacking in raw potential/power.&amp;nbsp; Like other MS applications the macro language encompassed not just the editor but virtually all aspects of the product.&amp;nbsp; I remember making a command line debugger interface in an editor window with macros as a example for a friend.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Speaking of BASIC, during all this time, our friends in VB weren&amp;rsquo;t exactly idle either. In the VB5 IDE, Intellisense makes its appearance.&lt;/p&gt;
&lt;p&gt;Can you imagine programming without Intellisense?&amp;nbsp; Well I guess you probably all can because many of you did without it in the past, but certainly a good amount of cursing happens in my office when I find myself without it.&amp;nbsp; It isn&amp;rsquo;t just that it saves you typing &amp;ndash; it fundamentally changes the way you work.&amp;nbsp; For many applications Intellisense makes API documentation obsolete because it used to be that the #1 use for that stuff was to get method signatures, it is easily the #1 way people get &amp;ldquo;help&amp;rdquo; &amp;ndash; blowing away the F1 key for usage.&amp;nbsp; But it&amp;rsquo;s more important than that&amp;hellip; it goes as far as freeing you to use better naming techniques, especially in frameworks.&amp;nbsp;&amp;nbsp; Maybe &lt;a href="http://en.wikipedia.org/wiki/Dennis_Ritchie" mce_href="http://en.wikipedia.org/wiki/Dennis_Ritchie"&gt;Dennis Ritchie&lt;/a&gt; would not have left off the &amp;lsquo;e&amp;rsquo; in &amp;lsquo;&lt;a href="http://en.wikipedia.org/wiki/File_descriptor" mce_href="http://en.wikipedia.org/wiki/File_descriptor"&gt;creat()&lt;/a&gt;&amp;rsquo; if he&amp;rsquo;d had Intellisense.&amp;nbsp; And what about what it did for Office?&amp;nbsp; The Visual Basic for Applications (VBA) engine got Intellisense too and that meant Office programmers got much easier&amp;nbsp;automation scripting.&lt;/p&gt;
&lt;p&gt;At any rate, Intellisense was a total game-changer and was soon in the entire Visual Suite.&amp;nbsp; And by soon I mean what you might call Visual Studio 6.0 &amp;ndash; by an amazing coincidence the language version numbers had synchronized or been forced to synchronize (VJ and VID).&lt;/p&gt;
&lt;p&gt;Now VS6, and more importantly its parts, VB6 and VC6 are widely considered to be the best we ever made.&amp;nbsp; Not universally but certainly there are factions that think we should have stopped right there, or stayed on that track.&amp;nbsp; I think this is true because they represent the last of that evolutionary line, for both languages.&amp;nbsp; The IDE that would become Visual Studio became available in its first incarnation at that time, as I have alluded to in the past, and it was Visual Interdev.&amp;nbsp; In some ways, from a consolidation perspective it looked like we had taken a step backwards -- there were now four major shells rather than three.&amp;nbsp; The respective teams polished their products to a bright shine and Intellisense bloomed like daisies across the suite.&lt;/p&gt;
&lt;p&gt;For those of you that just lost me on shell count, I went to four with the addition of the VID shell (used by VJ++), add VB and VC++ and that makes three.&amp;nbsp; What is this fourth shell you speak of Rico?&lt;/p&gt;
&lt;p&gt;The problem is that in this entire history I&amp;rsquo;ve been completely silent on another suite member &amp;ndash; &lt;a href="http://en.wikipedia.org/wiki/Visual_FoxPro" mce_href="http://en.wikipedia.org/wiki/Visual_FoxPro"&gt;Visual FoxPro&lt;/a&gt; which also had its own shell.&amp;nbsp; Now there&amp;rsquo;s a reason for this &amp;ndash; and that is that I know painfully little about that product other than when I did a study of database technologies for Sidewalk in 1995 I was stunned by how many advanced features were already in the FoxPro product.&amp;nbsp; Who remembers &amp;ldquo;Rushmore&amp;rdquo; &amp;ndash; I remember getting some pretty slick demos!&amp;nbsp; Little known fact: it was the FoxPro team that taught me the basics of database programming -- thank you, you know who you are :)&lt;/p&gt;
&lt;p&gt;But, with apologies, I must go on, paying only very little homage to that shell. &amp;nbsp;It would be great if someone else posted a My History that included more FoxPro stuff.&amp;nbsp; Or any other My Histories for that matter&amp;hellip;&lt;/p&gt;
&lt;p&gt;I feel like I should mention Office a little bit more at this point.&amp;nbsp; I&amp;rsquo;ve hardly mentioned Office but it&amp;rsquo;s important to note that Office, and the needs of Office Programmability, were often key forces in language and tools design, to say nothing of the needs of the Office programmers themselves &amp;ndash; which frequently pushed our tools to the breaking-point.&amp;nbsp; IMHO, probably more than any other single force, it was Office that was driving BASIC &amp;ndash; from as early on as the Embedded Basic which then went on to power VB, and then later VBA, Office was a huge influence.&amp;nbsp; I think specifically it was Office that drove how application automation had to work and that in turn drove OLE Automation generally and that in turn drove BASIC.&amp;nbsp; Those of you who have ever had to program with &lt;a href="http://en.wikipedia.org/wiki/Variant_type" mce_href="http://en.wikipedia.org/wiki/Variant_type"&gt;VARIANT&lt;/a&gt;s a lot can probably thank or curse this dependency cycle.&lt;/p&gt;
&lt;p&gt;One other big thing to mention and then I&amp;rsquo;ll wrap up for this installment.&amp;nbsp; Another notable change in this time period was the maturation of the data access layers.&amp;nbsp; I think this, too, was partially internet-needs driven but also I think the technologies were just ripe.&amp;nbsp; OLEDB was born during these years and with it the BASIC access mechanism &amp;ndash; ADO.&amp;nbsp; These things seem pretty mundane on the surface but they offered much richer data access than ever before and inspired the first of increasingly popular and powerful datagrid mechanisms for both display and editing of data.&amp;nbsp; When compared to the clumsy DDX/DDV type things we had been doing it was a breath of fresh air for data programming and forms over data.&amp;nbsp; All of this would go on to influence many different types of designers and data management services, but I think the spark for that was here, in say 1997.&lt;/p&gt;
&lt;p&gt;Visual Studio 6.0 &amp;ndash; synchronized across the versions and starting to show some (distant) signs of consolidation between its various parts appeared in 1998.&amp;nbsp; It was a great release, as I wrote above, it&amp;rsquo;s still the favorite release of many.&amp;nbsp; After that, the developer division &amp;ldquo;went dark&amp;rdquo; for about 4 years, they were working on what would become &amp;ldquo;Visual Studio .NET&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905774" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 4)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/08/my-history-of-visual-studio-part-4.aspx</link><pubDate>Fri, 09 Oct 2009 00:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905165</guid><dc:creator>ricom</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9905165</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/08/my-history-of-visual-studio-part-4.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t really intend to write one of these per day but here it is day 4 and we&amp;rsquo;re still going strong.&amp;nbsp; I&amp;rsquo;d like to take a moment to thank the many people who commented on this series either here, or on their own blogs, or elsewhere.&amp;nbsp; I&amp;rsquo;m watching J&lt;/p&gt;
&lt;p&gt;I started the series by saying that this is only &amp;ldquo;My History&amp;rdquo; and I&amp;rsquo;d really love to see your histories, however much you&amp;rsquo;d care to write, even if it&amp;rsquo;s just a fond memory or a memorable aggravation.&amp;nbsp;&amp;nbsp; Many of us went through the same programmer-generation-defining experiences, so it&amp;rsquo;s fun to share them.&amp;nbsp; For instance, I was really surprised just how many people I knew spent far too much time exploring the Mandelbrot Set.&amp;nbsp; Why we all felt compelled to generate almost exactly the same pictures on our own computers, often with our own custom math library, is something I may never understand J&lt;/p&gt;
&lt;p&gt;OK back to My History of Visual Studio, I want to go back a little bit again like I did last time and cover something that I skipped that I wish I hadn&amp;rsquo;t, especially because there&amp;rsquo;s a fun story that goes with this one.&lt;/p&gt;
&lt;p&gt;As it happens, at that time, and for several years, the big show was the Software Development Conference, usually the spring one.&amp;nbsp; One of the popular attractions was competition between the major tools vendors at that time where they were all given the same challenge to produce from &amp;ldquo;scratch&amp;rdquo; (using just whatever came with their tools, including samples) some kind of modest applet that you could build in about half an hour while the audience watched.&amp;nbsp; Usually there were several &amp;ldquo;levels&amp;rdquo; and you&amp;rsquo;d get points for each level.&amp;nbsp; One year it was a bitmap viewer.&lt;/p&gt;
&lt;p&gt;After one such conference, where we had competed (and won) with Dolphin, we got to thinking that this was actually not such an exotic situation to find yourself in &amp;ndash; needing to cobble together some code from pieces you had lying around &amp;ndash; and we wanted to drive code reuse as theme in Olympus so we decided we should have something like Code Gallery.&amp;nbsp; This could very well be the birth moment of what we&amp;rsquo;d call Code Snippets today.&amp;nbsp; We had no idea how it should be built exactly but we imagined you should be able to point it at pretty much any chunk of code, make a blob, make some parts of it be variables, and then you should be able to put it elsewhere in the same or a different project.&amp;nbsp; We gave it to The New Guy (you know who you are J).&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t believe how mean we were &amp;ndash; &amp;ldquo;Here, take this vague uncooked idea that touches most of the important systems and go build it.&amp;nbsp; Let us know how you do.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I think he did ok though.&lt;/p&gt;
&lt;p&gt;The funny thing is, we figured that this would give us an unfair advantage over our competitors at the next SD conference but we also figured that having a long list of features we were banned from using (remember everyone is watching so it&amp;rsquo;s easily enforceable) was kind of a badge of honor and it really was a cool feature.&lt;/p&gt;
&lt;p&gt;Having re-read the above I feel it&amp;rsquo;s important to remind my readers that a preposition is something you should never end a sentence with.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to move forward in time now, but we&amp;rsquo;ve come to a part of the story where I didn&amp;rsquo;t have first hand knowledge.&amp;nbsp; In 1995 I changed jobs, and for 7 years I worked in MSN land.&amp;nbsp; I was busy developing the technology for &lt;a href="http://en.wikipedia.org/wiki/Sidewalk.com" mce_href="http://en.wikipedia.org/wiki/Sidewalk.com"&gt;Sidewalk.com&lt;/a&gt;&amp;nbsp;but I still had a lot of friends telling me what was going on and some of it was pretty amazing.&amp;nbsp; I think I can best describe this period with an allusion.&amp;nbsp; This is historical fiction but it kind of hits the key points in a fun way.&lt;/p&gt;
&lt;p&gt;&amp;lt;fade to black&amp;gt;&lt;/p&gt;
&lt;p&gt;A long time ago on a campus far, far away&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;lt;cue music&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="font-size: large;"&gt;SHELL WARS!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Episode 5.0:&lt;br /&gt;The Great Landgrab&lt;/p&gt;
&lt;p&gt;&amp;lt;scrolling text&amp;gt;&lt;/p&gt;
&lt;p&gt;It has been many years since the Visual Tools first came on the scene and now the many factions are vying to be &amp;ldquo;on top&amp;rdquo; as customers clamor for a Grand Unification.&amp;nbsp; All the contenders are widely regarded as Evil by the other contenders and the whole thing looks to an outsider like it belongs in a Dilbert cartoon.&lt;/p&gt;
&lt;p&gt;The VB Consortium claims that they have a crucial edge because their shell provides the most immediate feedback, their excellent design time experience is a must for any successful Unification.&amp;nbsp; But the Compiled Language Bloc, led by the notorious C++ team, claims they already have a shell that is hosting multiple languages and that the VB shell is ill-equipped to handle things like &amp;ldquo;The Mixed Mode Nightmare.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Meanwhile, unbeknownst to these factions, another, newer, shell has been born.&amp;nbsp; This Child Shell was the host of a little known system called &amp;ldquo;Blackbird&amp;rdquo;, but the Internet was coming, and all those web-developers would need tooling too.&amp;nbsp; And, perhaps, Interdev could restore balance&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;lt;/scrolling text&amp;gt;&lt;/p&gt;
&lt;p&gt;OK I&amp;rsquo;ve had my fun.&amp;nbsp; But there are some key truths in there.&amp;nbsp; There were various competitive shells and we needed to choose one.&amp;nbsp; But of course choosing one was really quite impossible because what we really needed was to cherry pick features from each of them and then consolidate the result.&amp;nbsp; A critical choice here is &amp;ldquo;which shell do you start with?&amp;rdquo; and that is largely what the fuss was all about.&lt;/p&gt;
&lt;p&gt;Visual Interdev was literally in its infancy when this was going on and I think it&amp;rsquo;s fair to say that it, ultimately, became the basis shell which integrated the others.&amp;nbsp; There are several reasons for this, mostly technical (there may be non-technical ones too but I don&amp;rsquo;t know them so they&amp;rsquo;ll have to be part of someone else&amp;rsquo;s history).&lt;/p&gt;
&lt;p&gt;One reason was that there was a hope of having a public extensibility story that made sense with that codebase.&amp;nbsp; The VB shell had very limited extensibility, and the VC++ shell, while it had tons of it (proven by the number of languages it was able to host) had a serious flaw:&amp;nbsp; when we tried to let 3rd parties extend it they completely failed because the contract between the shell and the packages was both tight and complicated.&amp;nbsp; There was an interesting design tension there, well there are&amp;nbsp;many, but let me give you just a taste of one.&lt;/p&gt;
&lt;p&gt;VC++ did not use COM for its extensions, in fact it would have been anathema for us to do so.&amp;nbsp; Our philosophy was that we needed to be able to debug COM when it wasn&amp;rsquo;t working, not rely on it to boot. But here&amp;rsquo;s a flip side &amp;ndash;&amp;nbsp;if you don&amp;rsquo;t use a registry-based activation model like COM has, then you suffer two key problems:&amp;nbsp; #1 your contracts don&amp;rsquo;t have clean separation so 3rd parties will go crazy trying to use them, and #2 you&amp;rsquo;ll find you have to load all of your extensions just to know what they do &amp;ndash; something you ultimately can&amp;rsquo;t afford.&lt;/p&gt;
&lt;p&gt;In the end the VC++ shell failed the test because while it was designed to be extensible from the start, it was designed to be extensible by us, and &lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;not&lt;/i&gt;&lt;/b&gt; by 3rd parties.&amp;nbsp; It was designed for a smallish number of extension packages which would always be loaded at startup, and that was something we couldn&amp;rsquo;t afford &amp;ndash; Visual Studio is actually in the business of not loading extensions while giving the illusion that they are loaded, including cute tricks like enabling/disabling menu items of extensions that are not loaded on their behalf.&amp;nbsp; I haven&amp;rsquo;t name dropped to this point but I can&amp;rsquo;t not mention the guy who is most responsible for solving these problems, and I&amp;rsquo;m about to link you to &lt;a href="http://mschnlnine.vo.llnwd.net/d1/ch9/0/DougHodgesVSSDK_2MB_ch9.wmv" mce_href="http://mschnlnine.vo.llnwd.net/d1/ch9/0/DougHodgesVSSDK_2MB_ch9.wmv"&gt;his video&lt;/a&gt; so, you can give Doug Hodges a word of thanks if you ever meet him (which I highly recommend).&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s fair to say though, that at the time, not everyone agreed this was the right choice and, at the time, I would have not agreed myself.&amp;nbsp; But in retrospect, I would have been wrong.&amp;nbsp; But I was working on Sidewalk anyway so nobody asked me J&lt;/p&gt;
&lt;p&gt;Now, getting everyone onto a new shell doesn&amp;rsquo;t happen overnight and as I mentioned, the ultimate winner of this contest was still just nascent at this time. So it would be a while before we&amp;rsquo;d see the changes that were in the works.&amp;nbsp; The Visual Studio brand was alive at this point but it wasn&amp;rsquo;t much more than some lashed together boxes.&lt;/p&gt;
&lt;p&gt;There were other pretty cool things going on at this as well.&lt;/p&gt;
&lt;p&gt;I have to mention Visual J++ at this point because I think it was just too darn important to the future of Visual Studio and the .NET Framework to omit.&amp;nbsp; Remember we had been thinking about simpler language models, and simpler programming models, for years, at virtually every offsite. &amp;nbsp;But how do we move our users to it? &amp;nbsp;Why would they want to change languages? What might motivate that?&amp;nbsp; How do you sell the benefits? And then along came Java.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to keep the discussion focused on interesting technical things that affected the history of VS, the rest of the checkered history of our relationship with Java I have no first-hand, or even second-hand&amp;nbsp;knowledge of anyway.&lt;/p&gt;
&lt;p&gt;Java is a managed language, already that drives a bunch of choices, and, additionally while it doesn&amp;rsquo;t &lt;em&gt;require&lt;/em&gt; a JIT compiler that&amp;rsquo;s pretty much the best/only way to get world class performance out of a JVM.&amp;nbsp; You might think, so what? Whatever. Managed schmanaged, it compiles to native and runs, what&amp;rsquo;s the big deal?&lt;/p&gt;
&lt;p&gt;Well it&amp;rsquo;s true that running managed code does look a lot like regular running native code but the similarity is only superficial from the tool&amp;rsquo;s perspective.&amp;nbsp; Let me talk about it from the perspective I know best &amp;ndash; debugging &amp;ndash; to highlight those differences.&amp;nbsp; Keeping in mind that the reason I&amp;rsquo;m mentioning this now is because I think Visual J++ was the system that forced us to think about these things and get solutions in place as early as we did.&amp;nbsp; .NET would have many of the same problems and so the experience would be helpful, even if the code and people&amp;nbsp;were all different.&lt;/p&gt;
&lt;p&gt;OK one problem with managed memory is that there&amp;rsquo;s a garbage collector, and good garbage collectors compact and that means objects move around.&amp;nbsp; OK so what, so objects move around; &amp;nbsp;the contents of some pointer variables might change or something right?&amp;nbsp; That happens all the time while debugging anyway, it's called &amp;ldquo;running&amp;rdquo;, how is this a new thing?&lt;/p&gt;
&lt;p&gt;Well for instance, if you&amp;rsquo;re debugging and you tell the debugger &amp;ldquo;stop anytime the contents of this global variable&amp;nbsp;changes&amp;rdquo; then what it likes to do is say &amp;ldquo;ok the address of that global variable is 0x12345678 I&amp;rsquo;ll just use a hardware register to tell the CPU to interrupt me if the contents of that memory are altered and I&amp;rsquo;m done&amp;rdquo;&amp;nbsp; Oops, that doesn&amp;rsquo;t work so good anymore, the contents might be altered by garbage collector at pretty much any time without actually logically changing (the global just points to the same object which is now somewhere else) and worse still, the global itself might move so that lovely fixed address you used to have 0x12345678 could itself change at any time.&amp;nbsp; Joy.&amp;nbsp; We&amp;rsquo;ll have to handle all of that.&lt;/p&gt;
&lt;p&gt;OK, so, data moves, great.&amp;nbsp; What about JIT compilation, does that do anything important?&amp;nbsp; It sure does. In regular code, or even code that&amp;rsquo;s been compiled in the normal way to p-code (we supported that remember?), the address of code doesn&amp;rsquo;t change from run to run.&amp;nbsp; It might be relocated as a chunk but within any given DLL the offsets remain the same.&amp;nbsp; That means one set of symbolic information is all you need to find any given method, or to determine which method contains the current instruction pointer.&amp;nbsp; When you JIT, that doesn&amp;rsquo;t work;&amp;nbsp; instead you have to remember where you put every given method from run to run, and you can&amp;rsquo;t assume the method exists as native code just because you loaded the IL for it, it might be not jitted yet &amp;ndash; so that means that if&amp;nbsp;a user asks for a breakpoint you have to wait for it be jitted then insert it&amp;hellip;&lt;/p&gt;
&lt;p&gt;All this jitting and data motion makes an already complicated task, like coming up with a calllstack that shows method names and parameter values, a lot more challenging.&amp;nbsp; But it had to be done and those challenges were met.&amp;nbsp; I think VJ++ drove a lot of that.&lt;/p&gt;
&lt;p&gt;I think the need to interrogate the runtime state to find object information, and to get notification of things like garbage collection, is most likely the reason why they chose a soft-mode debugging strategy and why ultimately the .NET framework got the same strategy. &amp;nbsp;Personally, I would have gone hard-mode all the way but it wasn&amp;rsquo;t my call, and arm-chair quarterbacks don&amp;rsquo;t have to deal with the Blitz so I should just probably shut up about that.&amp;nbsp; Likewise that JVM provided great experience building a garbage collector.&lt;/p&gt;
&lt;p&gt;I think I&amp;rsquo;ll change gears a bit for the end of this posting.&amp;nbsp; While all this was going on: managed future, shell consolidation, etc. etc.&amp;nbsp; The individual language teams continued to produce very cool things.&amp;nbsp; We started using Visual Basic&amp;rsquo;s new ability to create compiled executables to make web pages written in interwoven BASIC, that looked exactly like .asp files, but that we preprocessed into VB projects and compiled into ISAPI DLLS.&amp;nbsp; And you could debug them with a native debugger and get seamless cross language debugging!&amp;nbsp; Very cool.&lt;/p&gt;
&lt;p&gt;And, in the C++ space, another micracle was occurring.&amp;nbsp; I have almost no idea how they pulled this off, even though I did get a few peeks at the secret sauce, those guys took incremental linking and compiling one step further and delivered general purpose Edit and Continue for C++, maybe for the first time ever in any production system.&amp;nbsp; My 20 minute test failures on web servers running C++ had suddenly had dreamy debugging.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I was lucky enough to be one of few that could call the guy that wrote the code and say to him: &lt;b style="mso-bidi-font-weight: normal;"&gt;&amp;ldquo;DO YOU HAVE ANY IDEA HOW MUCH TIME YOU JUST SAVED ME!&amp;nbsp; I LOVE YOU!!&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It was that good.&amp;nbsp; Like &amp;ldquo;Thunder.&amp;rdquo;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905165" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item><item><title>My History of Visual Studio (Part 3)</title><link>http://blogs.msdn.com/b/ricom/archive/2009/10/07/my-history-of-visual-studio-part-3.aspx</link><pubDate>Thu, 08 Oct 2009 02:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9904642</guid><dc:creator>ricom</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/ricom/rsscomments.aspx?WeblogPostID=9904642</wfw:commentRss><comments>http://blogs.msdn.com/b/ricom/archive/2009/10/07/my-history-of-visual-studio-part-3.aspx#comments</comments><description>&lt;p&gt;[All the other Parts: &lt;a href="http://blogs.msdn.com/ricom/archive/tags/History+of+Visual+Studio/default.aspx"&gt;History of Visual Studio&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;I was going to go forward again in this installment but I got some requests to talk about some older things again before I did that.&amp;nbsp; You might be getting bored of the distant past so I&amp;rsquo;ll try to keep that part short.&lt;/p&gt;
&lt;p&gt;There were some other key pieces of technology floating around back in the early 90s:&amp;nbsp; One of them was this thing called Codeview for Windows (CVW).&amp;nbsp; This thing was substantially written by my racquetball partner (no name dropping, but I haven&amp;rsquo;t forgotten) and it was the &amp;ldquo;hard mode&amp;rdquo; debugger for windows.&amp;nbsp; Remember how I said you couldn&amp;rsquo;t debug Win16 the normal way because you can&amp;rsquo;t stop it?&amp;nbsp; Well you can if you have a debugger that has a whole alternate UI based on &amp;ldquo;COW&amp;rdquo; that runs on its own monochrome character-mode-only monitor (usually a &lt;a href="http://en.wikipedia.org/wiki/Hercules_Graphics_Card" mce_href="http://en.wikipedia.org/wiki/Hercules_Graphics_Card"&gt;Hercules Graphics Card&lt;/a&gt;, remember those?)&lt;/p&gt;
&lt;p&gt;You thought multi-mon was a new feature but no, in this flavor it&amp;rsquo;s very, very, old.&amp;nbsp; :)&lt;/p&gt;
&lt;p&gt;This baby could give you true symbolic debugging for all kinds of Windows programs for which you had source code and debug info, but if you wanted even lower level stuff you could always hook up a serial cable to a dumb terminal and use wdeb386.&amp;nbsp; &lt;a href="http://support.microsoft.com/kb/72379" mce_href="http://support.microsoft.com/kb/72379"&gt;Wdeb386&lt;/a&gt; is your buddy!&lt;/p&gt;
&lt;p&gt;CVW was the main debugger that we used to debug &amp;ldquo;Sequoia&amp;rdquo;, which I alluded to but didn&amp;rsquo;t go into the details of earlier.&amp;nbsp; &amp;ldquo;Sequoia&amp;rdquo; (that&amp;rsquo;s a lot of vowels, huh) was a before-its-time IDE that we worked on around the time of PWB 2.0.&amp;nbsp; Ultimately it was cancelled because it was &lt;em&gt;too&lt;/em&gt; ahead of its time I think, but, as I&amp;rsquo;m fond of telling my wife, being ahead of your time is just one of the more creative ways of being fundamentally wrong.&amp;nbsp; That quip didn&amp;rsquo;t make me feel any better then, either.&lt;/p&gt;
&lt;p&gt;Anywho, Sequoia was interesting for lots of reasons but one of the most interesting things about it was that it's commanding&amp;nbsp;was entirely based on the same BASIC engine that drives VB.&amp;nbsp;Everything, everywhere, was a basic command in disguise so you could record anything.&amp;nbsp; It had a flexible editor that used a &lt;a href="http://www.cs.unm.edu/~crowley/papers/sds/node15.html" mce_href="http://www.cs.unm.edu/~crowley/papers/sds/node15.html"&gt;piece-table&lt;/a&gt; structure for space and had cool font support, coloring, and outlining.&amp;nbsp; It had a source code debugger with the beginnings of a soft-mode solution, and it had graphical build environment, and graphical program visualizations.&amp;nbsp; It was pretty slick.&amp;nbsp; Of course it was seriously incomplete and it had a tight dependence on some technologies (especially that BASIC) that were not going to be available on the 32 bit OS anytime soon and we needed those to ship.&amp;nbsp; We also needed all hands on deck for VC++ 1.0 &amp;ldquo;Caviar&amp;rdquo; and so Sequoia got scrapped.&lt;/p&gt;
&lt;p&gt;A lot of the Sequoia&amp;nbsp;ideas came back later in different versions of the IDE, some of them are just happening now in VS2010 but I guess that&amp;rsquo;s par for the course in cancelled projects.&amp;nbsp; Perhaps, when viewed as a research project, it wasn&amp;rsquo;t so dumb.&amp;nbsp; It wasn&amp;rsquo;t that many people and it wasn&amp;rsquo;t for that long, and it was quite an education. &amp;nbsp;Unlike QCW, it was written in C++, with its own framework, so it provided a great test case for the C++ compiler (C7) and it influenced both COM and MFC.&lt;/p&gt;
&lt;p&gt;I planted a &lt;a href="http://en.wikipedia.org/wiki/Sequoiadendron" mce_href=" http://en.wikipedia.org/wiki/Sequoiadendron "&gt;Giant Sequoia&lt;/a&gt; in my backyard in its honor (I called it Sequoia 0.1) and, true to its name, it&amp;rsquo;s quite big after 15 years.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Another funny story about Sequoia is the series of codename changes as we cut features before finally cancelling it altogether, it went from &amp;ldquo;Sequoia&amp;rdquo;, to &amp;ldquo;Bonsai&amp;rdquo;, to &amp;ldquo;Bonfire&amp;rdquo; &amp;ndash; One of the best things about that project was how nice the specifications were, I still have some. Thanks for those &amp;ndash; you know who you are Calibri; mso-hansi-theme-font: minor-latin; mso-char-type: symbol; mso-symbol-font-family: Wingdings;"&amp;gt;J&lt;/p&gt;
&lt;p&gt;Speaking of codenames, did you know that the various milestones of C7 had interesting codenames?&amp;nbsp; There were far too many of them of course because that was a hard release to get under control:&amp;nbsp; John, Paul, George, and Ringo were 4 of them; We were still in need of Beatles after that so we added Stu and then &amp;ldquo;The Long and Winding Road&amp;rdquo;&amp;nbsp; (though I bet the memos all said LWR) and finally shipped with &amp;ldquo;Let It Be.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Ok let&amp;rsquo;s get back to the more recent past.&lt;/p&gt;
&lt;p&gt;After &amp;ldquo;Dolphin&amp;rdquo; we had achieved a pretty significant miracle I think.&amp;nbsp; The shell actually worked as intended and we shipped other languages that lit up the splash screen (and more) &amp;ndash; multi-language project creation, browsing, and debugging all in the same core bits.&amp;nbsp; Basically all of the compiled languages could participate but we still had a lot of ambition.&lt;/p&gt;
&lt;p&gt;The next release began as &amp;ldquo;Olympus&amp;rdquo; Visual C++ 3.0 &amp;ndash; but we soon renumbered it to 4.0 to align it with MFC so that we didn&amp;rsquo;t have to say VC++ 1.0 with MFC 2.0, then VC++ 2.0 with MFC 3.0&amp;hellip; This time it was going to be VC++ 4.0 with MFC 4.0.&amp;nbsp; In retrospect this was highly stupid, especially because MFC ended up locking down on version 4.2 when backwards compatibility became a more valuable feature than anything else we could add &amp;ndash; and so it stayed for a very long time.&lt;/p&gt;
&lt;p&gt;I handed off responsibility for the debugging components in Olympus and with a few close friends we put together some very cool improvements for the tool chain.&amp;nbsp; Incremental Linking, Incremental Compilation, and Minimal Rebuild (I was mostly involved with the latter).&amp;nbsp; We had done something like this before in the original 1988 C# &amp;ndash; it had all of those features &amp;ndash; so we had some idea how we would want to do them in the mainstream tools, and actually ship them this time.&lt;/p&gt;
&lt;p&gt;In case you don&amp;rsquo;t know what those things are let me quickly describe them:&amp;nbsp; Incremental Linking is where you make a modest change to some small fraction of your source files, creating a few new .obj files, and instead of totally relinking the resulting executable you &amp;ldquo;simply&amp;rdquo; patch it in place.&amp;nbsp; Sounds not so hard, the thing is already logically organized and the linker knows where it put stuff, you just leave a little room for additions in the .exe and away you go right?&amp;nbsp; Err, not so much no, what are you going to do about all the debug information, that has to be patched too, new offsets, new line numbers, etc.&amp;nbsp; What about the browser info?&amp;nbsp; You could easily spend as much time on other collateral pieces figuring out what to patch as you would have just redoing the whole thing.&amp;nbsp; Some cleverness is required.&lt;/p&gt;
&lt;p&gt;Incremental Compilation is where you make a minor changing in one or more source files and rather than regenerating the entire .obj file you &amp;ldquo;simply&amp;rdquo; recompile only those portions (usually methods) that have changed and leave the other object code in place, thereby giving the back end much less work and saving you parsing time.&amp;nbsp; This is especially tricky because it has the same &amp;ldquo;what about the auxiliary files?&amp;rdquo; problem as incremental linking and you already have PCH helping you to do this fast, so the .obj files need to be largish to come out ahead.&lt;/p&gt;
&lt;p&gt;And last, but not least, Minimal Rebuild.&amp;nbsp; This is motivated by the kinds of edits that Class Wizard made. This guy notices that you&amp;rsquo;ve changed a popular .h file, and you&amp;rsquo;ve changed a single .cpp file (usually adding a method in both the code and header file) and although many files depend on the .h file only one file actually depends on the specific change you made, usually the one you modified.&amp;nbsp; The others could be skipped.&amp;nbsp; This has great potential to save compilation time and paid off big in larger projects but it too has complications associated with the auxiliary files &amp;ndash; the debug information has to be patched in files you didn&amp;rsquo;t touch and so forth.&amp;nbsp; We actually started with a version of this feature that had Class Wizard telling us what files had been changed for Class Wizard edits and then generalized it so that we could determine what was different by looking at the debug information for the previous version of a build and then the new version of a build and from there conclude what we could skip.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The slick thing about Minimal Rebuild is that it turns out that keeping the full dependency tree for a large project around is just too expensive.&amp;nbsp; We kept a set of approximately correct&amp;nbsp;dependencies with a &lt;a href="http://en.wikipedia.org/wiki/Bloom_filter" mce_href="http://en.wikipedia.org/wiki/Bloom_filter"&gt;Bloom Filter&lt;/a&gt; data structure and by tolerating a small false positive rate we were able to realize the bulk of the savings.&amp;nbsp; Using the existing debugger information to do the change analysis was probably the most clever bit of all.&lt;/p&gt;
&lt;p&gt;While all of this was going on, an equal effort was going into the compiler back-end and they were wanting to unify their system on a tuple representation so that they could use more of the same optimizations in more places and generally get better code quality.&amp;nbsp; Such is the way of compilers, huge efforts to squeeze out maybe another 5%.&amp;nbsp; 10% improvements are a thing of dreams.&lt;/p&gt;
&lt;p&gt;Olympus was getting quite large and it now used enough memory that it was affecting the compiler&amp;rsquo;s ability to get its job done.&amp;nbsp; If there isn&amp;rsquo;t enough RAM (we&amp;rsquo;re talking about say 4M here) to hold the IDE and the PCH in the disk cache then performance suffers.&amp;nbsp; I went on a working set jihad and got the IDE&amp;rsquo;s working set (while building) under 64k (it was 13 pages).&amp;nbsp; Back then you did really insane stuff to squeeze out every page &amp;ndash; I even turned off the carat flashing in the output window when I found it caused extra code to run during the build!&lt;/p&gt;
&lt;p&gt;Other things were going on in the industry but one thing was really on our minds often, mentioned at many offsite retreats &amp;ndash; C++ programming is too hard.&amp;nbsp; We really could use a different language/system that would make this a lot easier.&amp;nbsp; Delphi was being fairly successful.&amp;nbsp; Visual Basic was still strong.&amp;nbsp; But now it&amp;rsquo;s 1995&amp;hellip; The web is coming, and with it, Java.&lt;/p&gt;
&lt;p&gt;[See &lt;a href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/" mce_href="http://channel9.msdn.com/shows/VisualStudioDocumentary/The-Visual-Studio-Documentary-Part-One/"&gt;The Documentary&lt;/a&gt;&amp;nbsp;on Channel 9!]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9904642" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ricom/archive/tags/visual+studio/">visual studio</category><category domain="http://blogs.msdn.com/b/ricom/archive/tags/History+of+Visual+Studio/">History of Visual Studio</category></item></channel></rss>
