<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The Wayward WebLog : Language</title><link>http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx</link><description>Tags: Language</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Rotten to the Multi-Core</title><link>http://blogs.msdn.com/mattwar/archive/2007/06/05/rotten-to-the-multi-core.aspx</link><pubDate>Wed, 06 Jun 2007 03:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3106714</guid><dc:creator>mattwar</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/3106714.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=3106714</wfw:commentRss><description>Everyone’s trying to figure out the next big software gimmick that’s going to make utilizing your multi-core machines super easy.  Let’s face it, having to write code with locks and threads is not going to be it.  We’ve had that capability for a long time and only the cream of the crop developers even dared to tread there, and even fewer were actually capable of getting it right.  The average programmer, including me on most days when I’m not hyper caffeinated, need a better mouse trap to make writing and executing code in parallel an everyday task.  

...(&lt;a href="http://blogs.msdn.com/mattwar/archive/2007/06/05/rotten-to-the-multi-core.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3106714" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category></item><item><title>IQueryable’s Deep Dark Secret</title><link>http://blogs.msdn.com/mattwar/archive/2007/06/01/iqueryable-s-deep-dark-secret.aspx</link><pubDate>Fri, 01 Jun 2007 23:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3029463</guid><dc:creator>mattwar</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/3029463.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=3029463</wfw:commentRss><description>I love the IQueryable interface, but it’s got a dark checkered past that most of you might not know about.  IQueryable is a great way to expose your API or domain model for querying or provide a specialized query processor that can be used directly by LINQ.  It defines the pattern for you to gather-up a user’s query and present it to your processing engine as a single expression tree that you can either transform or interpret.  It’s the way LINQ becomes ‘integrated’ for many LINQ to XXX products.  Yet it was not supposed to be that way; with all that ease of use, plugging automatically into LINQ with an abundance of pre-written query operators at your disposal. You were not supposed to use it for your own ends. It was not meant for you at all.

...(&lt;a href="http://blogs.msdn.com/mattwar/archive/2007/06/01/iqueryable-s-deep-dark-secret.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3029463" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Object+Relational/default.aspx">Object Relational</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Data/default.aspx">Data</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/PDC/default.aspx">PDC</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>The Origin of LINQ to SQL</title><link>http://blogs.msdn.com/mattwar/archive/2007/05/31/the-origin-of-linq-to-sql.aspx</link><pubDate>Thu, 31 May 2007 21:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3011630</guid><dc:creator>mattwar</dc:creator><slash:comments>28</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/3011630.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=3011630</wfw:commentRss><description>LINQ to SQL, possibly Microsoft’s first OR/M to actually ship in ten years of trying, was never even supposed to exist.  

...(&lt;a href="http://blogs.msdn.com/mattwar/archive/2007/05/31/the-origin-of-linq-to-sql.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3011630" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Object+Relational/default.aspx">Object Relational</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Life/default.aspx">Life</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Data/default.aspx">Data</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/SQL/default.aspx">SQL</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/PDC/default.aspx">PDC</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Beyond Dynamic Languages</title><link>http://blogs.msdn.com/mattwar/archive/2006/04/28/585910.aspx</link><pubDate>Fri, 28 Apr 2006 19:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:585910</guid><dc:creator>mattwar</dc:creator><slash:comments>27</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/585910.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=585910</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Everywhere I turn, all I read about is dynamic languages. Apparently, there is a small yet growing contingent of programmers that think dynamic is the only way to go. These guys are frustrated with the shackles of static type systems that force them to write clean code. And apparently, there is also a small and growing contingent of media types that think “hey, there’s a buzzword I haven’t heard before, let’s use it until we wear it out.” And they have. Believe me, its paper thin and about to be ripped through like a rubber eraser pulling double duty.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;However, I’m not here to debate the virtues of dynamic languages. Some of these languages have really cool features, but that’s beside the point. It’s the dynamism that’s at issue and for some purposes dynamism is simply the better model. When you are dynamic you don’t have to know upfront the correctness of any particular thing. You just do what feels right and let the runtime figure out the rest.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;That’s why I’m here today advocating the next logical step. It’s not enough to simply have dynamic languages. Sure, they make some of your programming tasks a bit easier to perform, but how much time do you spend programming anyway? Most developers produce on average one line of quality code per week. It’s not that they are lazy; it’s just that the ‘coding time’ turns out to be a small fraction of the overall product cycle.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;So as you can see,&amp;nbsp;what we really need to do is to take the advancements that dynamism brings to programming languages and apply them to those other things that busy your day.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;STRONG&gt;Dynamic Meetings&lt;/STRONG&gt; – Don’t plan specific meetings with agendas.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Just show up in a meeting room at the same time everyday.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;It doesn’t have to be the same room, just pick one at random. At five after the hour, go around the room and ask each person that happened to show up in the same room as you what they’d like to talk about, write it down on a whiteboard in some order and then have at it. It doesn’t matter if you don’t have enough context to have a meaningful discussion. No one is listening anyway. It’s a good meeting if someone spontaneously decided to bring donuts.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;STRONG&gt;Dynamic Design&lt;/STRONG&gt; – This works best as part of a dynamic meeting. Take notes, but not too many. You wouldn’t want to fence your ideas in too soon.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Doodling helps the creativity flow; be sure to use multiple colors. Don’t worry about getting agreement or buy-in from others, they aren’t paying attention anyway. They are working on their own ideas and drawing their own cartoon stick figures. When you think you’ve got a good concept, go away and write some code. Eventually, everyone will figure out something to do and will be busy writing code too. Don’t worry about integrating it all together. Its all just code, ones and zeros, adds, shifts and branches. The runtime knows what to do with it.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;STRONG&gt;Dynamic Testing&lt;/STRONG&gt; – Don’t make a plan. Don’t do code coverage, write unit tests or abide by any particular testing methodology. Let the runtime do it for you. Just load the program in ‘Test Mode’ and execute. The runtime will proceed to apply a series of random tire-kicking algorithms that will give the dynamic code a good workout.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Believe me; you couldn’t have planned it anyway. With dynamic code you’re never quite sure what it does until you run it.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;STRONG&gt;Dynamic Debugging&lt;/STRONG&gt; – Yes, even dynamic programs will have bugs, though you might not ever know for sure. If you think the code is acting flaky, you may want to do something to fix it. It will probably mean looking at the code or some facsimile of it in some tool that will help you understand it. The old-school way would have been to use a debugger, set some breakpoints and walk through it, observing the behavior, looking at variables, etc. But that would require too much static knowledge about the code, things like specific variables, types, and ‘lines’. Since we’ve done away with these antiquated notions we’ll need a new style debugger that will help us deduce the problem without actually using any particular facts, a precognition engine if you will that uses advanced artificial intelligence techniques to divine the future. It’s either that or printing out text.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;You see, if we take dynamism just one step further, we can vastly simplify the work we do now, by offsetting the part about doing a good job and getting it right until sometime later when hopefully we've moved on to another project.&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;But I digress&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=585910" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category></item><item><title>Beyond the Query</title><link>http://blogs.msdn.com/mattwar/archive/2006/04/19/beyond-the-query.aspx</link><pubDate>Wed, 19 Apr 2006 10:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:578791</guid><dc:creator>mattwar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/578791.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=578791</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;I have been working a long time to bring queries into a modern programming language. Seven years ago I looked beyond ORM and saw the next horizon, a new world where boundaries between data are blurred and popular paradigms from different disciplines combine. Many have tried to convince me that it is simply a mirage, and maybe in some respects it is, but as with anything else there is often a lot of utility born out of imperfection. I have been marching steadily toward that horizon ever since.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;I also realize much of it has been done before. From academic languages to real world database scripting engines, the concept of the query itself is nothing new. Yet, it has never been mainstream before, baked in as a first-class feature of a general purpose programming language.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;It is no longer a novelty, applicable to only a single domain, each domain with its own variant, bound in shackles, caged like&amp;nbsp;a dangerous animal. It is becoming something real, something you can reason about and rely on, a permanent fixture of the natural programming environment, a part of its substrate.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;And I’m not just out to promote a particular language. In a few years, there won’t be a language without queries. Eventually, queries will become one of the most used tools in your toolbox. And not just for databases; all aspects of your application will be queryable to some degree, allowing you the freedom to apply set-like operations anywhere and everywhere. Queries will bring power through simplicity and abstraction. What was once proscriptive will become descriptive, pushing more and more of the gritty details down into the runtime. And still the benefit will go beyond merely your personal productivity boost. The next horizon is already in sight. Queries will eventually become runtime optimized. They will enable automatic parallelism, scaling and distributed processing. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Yet,&amp;nbsp;we are&amp;nbsp;not there yet. With the help of a lot of other people, I’ve only just arrived at that first horizon, a place where the mirage forms into solid shapes and the world that I only imagined becomes substantive, where I can look out across the landscape of all that was devised and see it functioning, its clockwork gears spinning, its implications twinkling like dew upon fields of freshly grown grass. And I can simply query it, all of it, the grass, the trees, anything identifiable and enumerable. And it just works. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Yet in the midst of all that, I am overcome with another thought. Another horizon has opened up in my mind and I can see a bit further, beyond the benefits and the boosts, beyond the query itself. I can see now that it was only the first stepping stone. Something much bigger is out there. A paradigm shift is coming, where all things become fluid, all boundaries dissolve and intent becomes first class. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;And it has certainly all been done before.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=578791" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Object+Relational/default.aspx">Object Relational</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Data/default.aspx">Data</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/PDC/default.aspx">PDC</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>YODA the Programming Language</title><link>http://blogs.msdn.com/mattwar/archive/2005/10/09/yoda-the-programming-language.aspx</link><pubDate>Mon, 10 Oct 2005 08:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:479008</guid><dc:creator>mattwar</dc:creator><slash:comments>41</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/479008.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=479008</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Now that LINQ is out the door, so to speak, I can start focusing my efforts on the next next technology here at Microsoft. Ever since I joined up with the C# team nearly two years ago I’ve been frustrated by my inability to wax poetic about all the goodness we were working on. I was sworn to secrecy. Mum was the word. Perhaps if you were paying attention to the work in C# 2.0 and C-Omega, you may have guessed what was to come. Looking back, it’s easy enough to recognize it in the design of Generics, Iterators and Anonymous methods. The existence of Nullables in there as well should have made it obvious. We were planning ahead for the big pay off, language integrated query.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;You may be amazed that so much planning goes on in the features that we roll out version to version. Sometimes big ideas and far-reaching visions take many releases to come to fruition. You cannot always do them in one release. Sometimes you have to take a risk and dole them out piece by piece. This may cause a bit of confusion at first, when no one can truly understand why a particular feature was included and not others, or why one design was chosen. Yet once all the pieces are together you can finally make sense of it all, and then as if by magic it all just seems right.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Of course, this time is no different than the last. We planned ahead and baked in features into C# 3.0 that will lay the foundation for the next big thing. LINQ is only the start of the revolution. Yet, unlike last time, the features we added now make it rather obvious what is&amp;nbsp;coming next. If you connect the dots in your mind and extrapolate just a bit you’ll see what I’m getting at. You’ll begin to notice that’s its not just about query in the language, or first order functions or everything else that seems to be borrowed from languages of yore.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;No, these pieces are just stepping stones for what is yet to come, something truly original; a next generation programming language.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;The evidence is there right now, plain to see. The query expression exhibits it quite clearly. Yet, that’s just for starters. Eventually, the same degree of innovation will influence the rest of the language, and then you’ll have something quite different, a language the likes of which you have not seen before, one that is simple and elegant, yet secretly powerful: a YODA-like programming language.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;You see, putting the ‘from’ ahead of the ‘select’ was not by accident. Soon the whole language will be re-arranged in an effort to make expressing intent easier and more logical.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Instead of the cryptic c-like syntax below:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;public&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:place&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;Main&lt;/SPAN&gt;&lt;/st1:place&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;[] args) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt; tab-stops: 3.5in"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;Console&lt;/SPAN&gt;.WriteLine(“Hello World”);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;We will now have eloquent YODA-like syntax:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;(args of &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; many are they) &lt;/SPAN&gt;&lt;st1:place&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;Main&lt;/SPAN&gt;&lt;/st1:place&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt; is what they seek yet &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; they do not. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;Brace&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt; you must &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Written it is, the &lt;SPAN style="COLOR: teal"&gt;Console&lt;/SPAN&gt;. “Hello World”&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;I know it’s difficult to believe, as strange as it seems. Yet, sometime in the future, everyone will be writing software this way. Knowing this, it makes my work so much more invigorating. I can literally feel the electricity in the air around here. It’s like some queer energetic force. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;But I digress&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=479008" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/PDC/default.aspx">PDC</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>What the World is saying about LINQ</title><link>http://blogs.msdn.com/mattwar/archive/2005/09/21/what-the-world-is-saying-about-linq.aspx</link><pubDate>Thu, 22 Sep 2005 04:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:472590</guid><dc:creator>mattwar</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/472590.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=472590</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“LINQ is totally awesome. It’s like this thing that you use to condense your entire application into one line of demo code. Sweet!” - &lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:City w:st="on"&gt;&lt;st1:place w:st="on"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;Stanley&lt;/I&gt;&lt;/st1:place&gt;&lt;/st1:City&gt;&lt;I style="mso-bidi-font-style: normal"&gt; Morgan&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“LINQ is divine but DLINQ is a delinquent. It gives programmers too much power and makes programming against data way too easy. Is nothing sacred anymore?” – &lt;I style="mso-bidi-font-style: normal"&gt;Ned Flanders&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“Lambdas are old school. LISP had these decades ago. If all you want to do is be a sheep then go right ahead. I prefer ACME.” – &lt;I style="mso-bidi-font-style: normal"&gt;Wyle E Coyote&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“I can’t remember what they are called, but those things you make to build up a result out of a bunch of braces and stuff are really cool.” - &lt;I style="mso-bidi-font-style: normal"&gt;Anonymous&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“LINQ will change the way we think about thinking about programs without requiring us to actually think about them.” – &lt;I style="mso-bidi-font-style: normal"&gt;National Research Council&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“LINQ puts the 3GL back in the 4GLs, together making a 7GL!” – &lt;I style="mso-bidi-font-style: normal"&gt;Guy Steele&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“LINQ is the next best thing since sliced bread. Before LINQ we had to cut those database loaves up ourselves. It was a mess. Now programming against data is as easy as simply selecting the slices we want. Anyone seen that plastic doodad that holds the bag closed?” – &lt;I style="mso-bidi-font-style: normal"&gt;Heimlich&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;“LINQ is the best party game I’ve played in a long time.”&lt;EM&gt; – Jeff Bezos&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/EM&gt;&lt;A href="http://www.amazon.com/exec/obidos/tg/detail/-/B0002TGC38/ref=pd_cps_t_1/102-2997619-1491357?v=glance&amp;amp;s=toys" mce_href="http://www.amazon.com/exec/obidos/tg/detail/-/B0002TGC38/ref=pd_cps_t_1/102-2997619-1491357?v=glance&amp;amp;s=toys"&gt;&lt;EM&gt;&lt;IMG src="http://images.amazon.com/images/P/B0002TGC38.01._SCMZZZZZZZ_.jpg" width=32 mce_src="http://images.amazon.com/images/P/B0002TGC38.01._SCMZZZZZZZ_.jpg"&gt;&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;EM&gt;&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=472590" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Object+Relational/default.aspx">Object Relational</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Data/default.aspx">Data</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/PDC/default.aspx">PDC</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>XML Generics</title><link>http://blogs.msdn.com/mattwar/archive/2005/07/24/xml-generics.aspx</link><pubDate>Sun, 24 Jul 2005 11:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:442611</guid><dc:creator>mattwar</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/442611.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=442611</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;Designing a programming language is like inventing a metaphor for thought.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Most of the time you struggle to find just the right metaphor, hoping the one you eventually choose will be the best at communicating the idea it is meant to represent.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;So you can imagine the process of language design leaves a lot of dead ideas on the floor as it refines itself toward the ultimate goal of intuitive expression.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This can happen for many reasons, but often it turns out to be just that some representations are better than others due to the way they evoke immediate recognition, understanding and emotional attachment.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Often the best representations have nothing to do with logic or consistency.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Sometimes they are just better. 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;That's why we got so much immediate flak internally when we first introduced XML Generics. It was hard to understand the logic in them, but the emotional draw was undeniable.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;They just seemed to be the right thing.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;It's not that we did not care to hear the feedback from others, it was just that we knew going in that those closest to us were too tainted/attached to the current design.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Developers and most other logically minded folk have a difficult time detaching from what they know, stepping back and taking in the bigger picture.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;And believe me the design for XML generics was going to be a big change, one that would be very difficult to understand without a deep appreciation for where we were going with the language.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Likewise, it was anticipated that many in the blogging community would have a similar reaction, so we decided early on that we would need to reach out to the community directly, explain our approach, and gather what feedback we could before launching into a full scale marketing push on the unification of XML and Generics.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Some of the more touchy-feely readers out there might start to see it already.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The intuitive leap needed to bridge the two ideas together is one that must be made emotionally not logically.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;On the surface, the two might seem to have nothing to do with each other, but if you dig deeper you soon realize that the two are fundamentally linked,&amp;nbsp;both concepts actually compliments of one another.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;To bring the rest of you up to speed, let’s first take a look at &lt;EM&gt;generics&lt;/EM&gt;, a new feature in C# 2.0 that allows you to define parameterized types. A &lt;EM&gt;generic&lt;/EM&gt; type is defined using the syntax below.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The name ‘T’ refers to the type that parameterizes Foo.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Generic types can have one or more parameters that are substituted on use with actual types.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;public &lt;FONT style="BACKGROUND-COLOR: #0000ff"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;class&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt; &lt;/FONT&gt;Foo&amp;lt;T&amp;gt; { … }&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;When you refer to a &lt;EM&gt;generic&lt;/EM&gt; type, you do so in a similar way, replacing the parameter with the type you would like to use instead, such as in the variable declaration below.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Courier New"&gt;Foo&amp;lt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/STRONG&gt;&amp;gt; x;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;As anyone can clearly see &lt;EM&gt;generic&lt;/EM&gt; types have a striking resemblance to XML.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Both represent parameterized data.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Both are descriptive and declarative.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Courier New"&gt;&amp;lt;Foo x=”…” /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;We realized intuitively that a greater generalization could exist that tied the two together.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Since this is a quality we strive for when&amp;nbsp;designing the language we knew we were on to something if we just could find the right metaphor to bring the two together in the syntax.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;And that’s when it hit me.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The solution was right there, obvious all along.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;As it turns out, it was the reason that the whole thing was intuitive in the first place.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;It was the brackets, the angle-brackets.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;They were the key. So you can understand how the syntax had to change, to evolve, to make the two into one.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Courier New"&gt;Foo&amp;lt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;int &lt;/FONT&gt;&lt;/STRONG&gt;x = “…” /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;It was beautiful.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;That’s why I’m so annoyed that it got dropped for something better.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;I mean really, do you think pure genius like this grows on trees?&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;But I digress&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Matt&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=1&gt;This post rated: &lt;STRONG&gt;AH&amp;nbsp;-&lt;/STRONG&gt; Attempt at Humor&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=442611" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category></item><item><title>Refashioning Software</title><link>http://blogs.msdn.com/mattwar/archive/2004/10/14/242402.aspx</link><pubDate>Thu, 14 Oct 2004 21:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:242402</guid><dc:creator>mattwar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/242402.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=242402</wfw:commentRss><description>&lt;P&gt;In our never ending quest to provide you with better, faster, more powerful products and tools, we some time find it necessary to redo a little of what was done before, to revamp it so-to-speak, to spruce it up, to splash on a new coat of paint and add new life to the old tried-and-true features that just seem to lack the luster of the new fangled frontiers that we foresee for the future as we scrawl upon&amp;nbsp;our whiteboards and plot how the industry will be shaped by our &lt;STRIKE&gt;devious&lt;/STRIKE&gt;, &lt;STRIKE&gt;conniving&lt;/STRIKE&gt;, forthright innovations.&lt;/P&gt;
&lt;P&gt;Sometimes, however, we find the glitter of new graphics insufficient&amp;nbsp;or the haphazard cobbling of&amp;nbsp;incremental features too stifling for the visions we hold of our grand new design.&amp;nbsp; And its at these times that we propose major shifts in the architecture, sea changes if you will, that develop into new corporate directions, coin a plethora of new acronyms and buzzwords and become overtly evangelized by the enormity of our marketing force.&lt;/P&gt;
&lt;P&gt;Of course, not all new visions are as groundbreaking as others, and not all are as grandiose or sweeping in their changes.&amp;nbsp; Sometimes even small facets of products undergo independent upheavals that might have otherwise gone unnoticed unless you dared to look.&amp;nbsp; Surely, the designers of these pieces&amp;nbsp;were motivated by the same zeal that drives the big boys to reinvent, recast and reissue their offerings.&amp;nbsp; It's easy to see how they can get caught up in it.&amp;nbsp; It's not as if our modern culture dissuades us from this practice.&amp;nbsp; In fact, we are actually encouraged by the media to remake ourselves, to remodel our lives around ever increasing fickleness in design and fashion.&amp;nbsp; As consumers we have not only come to expect it, we&amp;nbsp;demand it.&lt;/P&gt;
&lt;P&gt;Recognizing this trend in human behavior, we at Microsoft have built in the mechanisms of change into&amp;nbsp;the .Net platform right from the beginning.&amp;nbsp; No longer do you have to wait for entire new platforms shifts before major improvements in subsystems and API's can be brought to you by the hard working developers here.&amp;nbsp; You've seen some of this already, those little compiler warnings when you've errantly used a feature that has been redone, remolded into its&amp;nbsp;sparkly newness.&amp;nbsp; That has been our way of alerting you to the fact that the API has been revised, and that if you continue to rely on the old, outdated one, you stand a chance of being caught running code that is now inexcusably out of fashion.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Believe me, this has provided a valuable service to multitudes of &lt;STRIKE&gt;shoppers,&lt;/STRIKE&gt; programmers out there, as evidenced by the tremendous amount of feedback we have received since the shipment of the 1.1 version of the .Net framework.&amp;nbsp;&amp;nbsp;We take this information seriously, so it should come as no surprise that&amp;nbsp;we&amp;nbsp;find it necessary to devise&amp;nbsp;improvements to&amp;nbsp;even the mechanism by which we alert you to changes.&amp;nbsp; As it turns out, many of you found the warnings of feature obsolescence unexpected and abrupt.&amp;nbsp; You felt cheated in not knowing until so late in the cycle, unable to avoid the embarrassing disclosure that your code may no longer be bleeding edge.&lt;/P&gt;
&lt;P&gt;So we plan to introduce a new obsoleting mechanism that is more descriptive and will alert you sooner to potential changes, giving you a chance to prepare for&amp;nbsp;future re-alignments that could catch you off guard.&amp;nbsp;The new mechanism still comes in the form of an code attribute that you can use to decorate your own sources, but it has been renamed and moved into a new namespace.&amp;nbsp; There is a new option on the attribute allowing the specification of not only the degree of obsolescence but the time frame by which it should invariably become so.&amp;nbsp; For example, you will now be able to determine precisely how many months into the future that the current code usage will be considered in style and by what degree you will appear foolish for having used it beyond its freshness date.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The next release of the framework will come completely redone using the new mechanism.&amp;nbsp; Each and every class will be outfitted with the new attribute, giving you the information necessary to predict when each individual feature will eventually fall out of favor.&amp;nbsp; The compilers will also change, giving&amp;nbsp;you&amp;nbsp;cumulative feedback on the desirability and estimated fashion sense of your software.&amp;nbsp; There will also be a tool that you can use to run against and rate precompiled modules from other vendors, so you will be able to accurately determine your softwares total degree of compliance and qualify for the new 'Microsoft Seal of Freshness'.&lt;/P&gt;
&lt;P&gt;Of course, you will still be able to use the old obsolete, obsoleting attribute in your code, it just won't be as effective as the new design.&amp;nbsp; But don't worry, there will be a compiler warning alerting you to this fact.&lt;/P&gt;
&lt;P&gt;But I digress&lt;/P&gt;
&lt;P&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=242402" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Lunacy/default.aspx">Lunacy</category></item><item><title>Code Shock</title><link>http://blogs.msdn.com/mattwar/archive/2004/09/17/230941.aspx</link><pubDate>Fri, 17 Sep 2004 17:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:230941</guid><dc:creator>mattwar</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/230941.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=230941</wfw:commentRss><description>&lt;p&gt;The first time I ever saw code written in Java, it scared me.&amp;nbsp; The code looked awful.&amp;nbsp; I mean it.&amp;nbsp; There was no way this stuff could be for real.&amp;nbsp; The source code I saw looked as bug prone as anything I could imagine.&amp;nbsp; There were 'new's flying around everywhere, no clean up&amp;nbsp;code, no error cases, no asserts, no assumptions, no sanity checks what so ever.&amp;nbsp; I wondered what kind of novice wrote this stuff.&amp;nbsp; I mean, it looked like something that&amp;nbsp;was written by a computer science prof.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt; &lt;p&gt;You obviously couldn't ship code like that.&amp;nbsp; But even as a sample it was so flagrantly bad it was dangerous.&amp;nbsp; I had downloaded the code to take a look at it.&amp;nbsp; (Those were my pre Microsoft days.)&amp;nbsp; I thought it sounded cool and new and I'd give it a look, yet after wading through the quagmire of source for&amp;nbsp;only a few minutes I was certain that I'd never give it another look again.&amp;nbsp; So I walked away from it that day, turned of the PC and left it behind.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Fortunately, I changed my mind.&lt;/p&gt; &lt;p&gt;You see, what had happened&amp;nbsp;was that I looked at that source through the eyes of a professional C programmer, and everywhere I looked I saw all the rules being broken.&amp;nbsp; The language looked like C, sort of, so it had to behave like C, right?&amp;nbsp; Wrong!&amp;nbsp; I had let all my assumptions get in the way.&amp;nbsp; There were new things going on that I had not even considered.&amp;nbsp; The next time around I dove into the language spec and learned about the garbage collector, the&amp;nbsp;exception handling, the pcode validator, etc, all these things that when added together gave you something quite different.&amp;nbsp; That code I had scoffed at on first inspection had in fact been abiding by all the rules.&amp;nbsp; The rules had just changed, that's all.&lt;/p&gt; &lt;p&gt;Years later, with lots of experience working in managed environments, Java and .Net, I've grown accustom to all those services and practices that at one time seemed not only alien, but flat out wrong.&amp;nbsp; Now, I find myself completely on the other side of the&amp;nbsp;fence.&amp;nbsp; I find myself now looking at C code, unmanaged, raw, savage, and I cringe.&amp;nbsp; Not because the code is poor or violates any rules, it's just running without the safety net.&amp;nbsp; Whenever I see a fixed sized buffer on the stack, a flurry of asterisks or&amp;nbsp;even an innocent looking&amp;nbsp;'new', I get&amp;nbsp;a&amp;nbsp;bit nervous.&amp;nbsp; I start to wonder if the code was written correctly, if all the cases were handled, and if some errant state in a far off function will&amp;nbsp;suddenly go astray, launching the processor into a tantrum, wreaking havoc across the codescape, a whirlwind of destruction that will quickly lay waste to even the cleanest lines of logic.&lt;/p&gt; &lt;p&gt;Matt&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=230941" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category></item><item><title>Style is Serious</title><link>http://blogs.msdn.com/mattwar/archive/2004/09/14/229786.aspx</link><pubDate>Wed, 15 Sep 2004 05:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:229786</guid><dc:creator>mattwar</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/229786.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=229786</wfw:commentRss><description>&lt;p&gt;It's been difficult to focus on work lately, let alone find the time to contemplate something worthy of a blog post.&amp;nbsp; The distraction of the presidential race is too compelling.&amp;nbsp; My wife and I are glued to the television, CNN, FOX, MSNBC.&amp;nbsp; I'm starting to have lucid dreams about dastardly swifti-boat word documents.&amp;nbsp; Just make it stop.&amp;nbsp; Just make it stop!&lt;/p&gt; &lt;p&gt;Those of you outside the U.S. probably find all this a bit humorous, but its actually rather serious business.&amp;nbsp; There has been so much media coverage lately and the mood around here is so pro civic duty, I actually spent a few minutes today thinking about who I might vote for in the upcoming election.&amp;nbsp; Generally, I start by making a&amp;nbsp;list of the pros and cons for each candidate, highlighting the ones that most correspond to and diverge from&amp;nbsp;my own personal views, and then I wad it up into a ball and toss it in the waste basket, because when it comes down to it there is only one factor that matters to me any more, and that's style.&amp;nbsp; &lt;/p&gt; &lt;p&gt;It doesn't matter so much what each candidate believes, what programs they are for or against, or their history of executing on them.&amp;nbsp; It doesn't matter what system they are affiliated with or what platform they choose to build upon.&amp;nbsp; It's just about style.&amp;nbsp; A candiate with a good style, easy to understand, direct and to the point gets my vote every time.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I realize you may find this a bit unorthodox, but in my experience bad style is a sure sign of an unfocused mind; sloppiness leads to a whole host of potential problems.&amp;nbsp; So before I punch my chit this November I want to have&amp;nbsp;a few&amp;nbsp;questions answered by both Bush and Kerry.&amp;nbsp; Do you put the open curly on the same line or the next?&amp;nbsp; Do you indent?&amp;nbsp; How many characters? 4? 2? 8?!!&amp;nbsp; Whitespace or tabs?&amp;nbsp; &lt;/p&gt; &lt;p&gt;Style is serious.&lt;/p&gt; &lt;p&gt;But I digress.&lt;/p&gt; &lt;p&gt;Matt&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=229786" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Lunacy/default.aspx">Lunacy</category></item><item><title>Focused on the Customer</title><link>http://blogs.msdn.com/mattwar/archive/2004/07/29/200871.aspx</link><pubDate>Thu, 29 Jul 2004 17:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:200871</guid><dc:creator>mattwar</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/200871.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=200871</wfw:commentRss><description>&lt;P&gt;The top level management at Microsoft spend a lot of time keeping the rest of us focused on the mission, making sure that we never lose sight of the end goal, and that its all about the 'customer', not the fantastical whims of a few developers.&amp;nbsp; Still, being one of those fantasy&amp;nbsp;led whimsical developers, I have got to admit the siren song of self gratification is hard to keep at bay.&amp;nbsp; Every time I sit down at my desk or stare at a white board I am compelled to imagine products and features that likely have no place in the real world.&amp;nbsp; I just can't help it.&amp;nbsp; I'm like&amp;nbsp;a kid in a candy shop.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Knowing this about myself and others, I expect&amp;nbsp;that as a group we can easily succumb to unnecessary distraction.&amp;nbsp; So its quite telling to&amp;nbsp;take a look at the proceeding of an average C# design meeting from an analytical perspective.&amp;nbsp; You see, before I showed up on the scene, before the product team started focusing on data, there was a sort of apathy toward customers.&amp;nbsp; Now it has all changed.&amp;nbsp; I can tell by taking a look at past meeting notes.&amp;nbsp; You'd be hard pressed to find a customer anywhere in them at all.&lt;/P&gt;
&lt;P&gt;Now, if you could take a look at my track record here at the company, you'd find a strong customer focus.&amp;nbsp; The time working on Xen/C-Omega, the ObjectSpaces years, the .Net data and XML frameworks, and even good ol' abused but used&amp;nbsp;ADO.&amp;nbsp; Every time we talked about these guys, every time we designed a feature or examined a flaw, it was always about the customer, customer, customer!&lt;/P&gt;
&lt;P&gt;Imagine my surprise when I joined up with the C# rabble.&amp;nbsp; In these meetings, nary a customer in sight.&amp;nbsp; When someone walked up to the board to write down a snippet of code, it was always the same old anti-customer, developer whimsy that got spit out.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;public class&amp;nbsp;&lt;/FONT&gt;Foo {&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;public int&lt;/FONT&gt; X;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&amp;nbsp;string&lt;/FONT&gt; Y;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Foo?&amp;nbsp; What the heck is a Foo?&amp;nbsp; That's the sort of self gratifying stuff I'm talking about; not even an attempt at grounding the discussion on real customer needs. That all changed when I started slapping down code up on the board.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;public class&lt;/FONT&gt; Customer {&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;public int&lt;/FONT&gt; Id;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;public string&lt;/FONT&gt; Name;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Finally,&amp;nbsp;we were talking about customers.&amp;nbsp; People starting asking the hard questions, like what about 'Bar', customers don't have Bar's, they have things like addresses and orders, don't they?&amp;nbsp; I could see it their faces.&amp;nbsp; It was like a light suddenly turned on.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The next day everyone showed up wearing Khakis and Polo shirts.&lt;/P&gt;
&lt;P&gt;But I digress.&lt;/P&gt;
&lt;P&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=200871" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Humor/default.aspx">Humor</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Lunacy/default.aspx">Lunacy</category></item><item><title>Warped Weaving</title><link>http://blogs.msdn.com/mattwar/archive/2004/07/27/199035.aspx</link><pubDate>Tue, 27 Jul 2004 21:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:199035</guid><dc:creator>mattwar</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/199035.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=199035</wfw:commentRss><description>&lt;P&gt;Aspect oriented programming uses a technique called 'weaving' to merge together and/or modify portions of functional/procedural code, to produce code that at the same time is both&amp;nbsp;highly efficient and easy to understand in cases where normal procedural composition would have prohibited clean unification of these separate concepts.&amp;nbsp; The general idea is that you the programmer get to write snippets of code called 'aspects' that do particular jobs by making modifications or whatnot to the rest of the code tree (usually during compilation.)&amp;nbsp; This might sound like a brand new concept, but it is actually something&amp;nbsp;that happens already inside of compilers, the only difference here is that now you get to define your own.&lt;/P&gt;
&lt;P&gt;And that's really the crux of the problem.&amp;nbsp; On the surface, all this sounds like a huge benefit, you can write your own style of transformations and/or optimizations of the code tree to achieve ends people have not even imagined yet.&amp;nbsp; Unfortunately,&amp;nbsp;it can quickly go awry when you try to combine multiple aspects together.&lt;/P&gt;
&lt;P&gt;A compiler does this kind of 'weaving' during separate phases often referring to them as rewrites of the tree; validation, optimization, transformation, these are all steps that may in fact rewrite the semantic program tree before code generation.&amp;nbsp;&amp;nbsp;Whenever a language&amp;nbsp; introduces concepts that are no longer one-to-one with the underlying processor architecture, it must in fact decompose/rewrite that semantic node as a series of more primitive instructions that the processor can understand.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;But lets ignore the CPU for a moment, and imagine a perfect world where the language has already been parsed and bound into its most pure semantic form that can be analyzed, inspected, modified by other code.&amp;nbsp; We can imagine a set of operations that we might want to do against this tree, patterns to match, rewrite to occurs, that still leave the tree in a full semantic state, swapping some semantic nodes for others, basically a closed semantic set with onto mappings.&amp;nbsp; Even doing this, we still find ourselves in a state where our rewrites exchange some nodes for others, usually&amp;nbsp;exchanging single nodes for a variety of equivalent&amp;nbsp;decomposed ones.&lt;/P&gt;
&lt;P&gt;This guarantees that after one&amp;nbsp;rewrite occurs, the overall semantics may remain the same, yet the tree itself has changed in physical ways that are near impossible to reverse, to reconstruct the original form.&amp;nbsp; That means any rewrites that may follow see a different tree than the first.&amp;nbsp; Of course, you would have expected this, and actually intended it.&amp;nbsp; However, if the second rewrite is looking for particular nodes and/or patterns now clouded by the operation of the first rewrite it is unlikely to perform as expected, if at all.&lt;/P&gt;
&lt;P&gt;This means that in any system that may be expected to perform multiple rewrites, the order of execution of these rewrites is paramount to their operating effectively.&amp;nbsp; You cannot in general develop a rewriting procedure that operates in isolation of the rest of the system.&amp;nbsp; You must consider the rewrites that may have occurred before and those that are yet to come.&amp;nbsp; A compiler designer working&amp;nbsp;with only a few built in rewrites has a immensely difficult time grafting these together.&amp;nbsp; Can you imagine how&amp;nbsp;near impossible it would be to allow for just any rewriting procedures to be strung together?&lt;/P&gt;
&lt;P&gt;Of course, you would have to limit your rewrites to those that only made orthogonal non-disruptive changes to the tree, adding a node here or there, preserving the physical tree at the same level of node granularity.&amp;nbsp; Maybe that's why when people talk about AOP they always point out trivial examples like doing method call logging.&amp;nbsp; Certainly, that's a rewrite that only adds a few orthogonal instructions.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=199035" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category></item><item><title>Xen meets its Omega</title><link>http://blogs.msdn.com/mattwar/archive/2004/07/14/183096.aspx</link><pubDate>Wed, 14 Jul 2004 16:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:183096</guid><dc:creator>mattwar</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/183096.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=183096</wfw:commentRss><description>&lt;P&gt;I got a surprise in my inbox this morning.&amp;nbsp;&amp;nbsp; An email from Erik Meijer read:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;The impossible has happened: X# became Xen, Xen became Comega, and Comega has shipped.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;A href="http://www.research.microsoft.com/research/downloads/default.aspx" target=_blank&gt;http://www.research.microsoft.com/research/downloads/default.aspx&lt;/A&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Enjoy&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Matt&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=183096" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Rave/default.aspx">Rave</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Data/default.aspx">Data</category></item><item><title>Stuck in the Slow Lane</title><link>http://blogs.msdn.com/mattwar/archive/2004/06/10/153069.aspx</link><pubDate>Thu, 10 Jun 2004 22:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:153069</guid><dc:creator>mattwar</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/mattwar/comments/153069.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattwar/commentrss.aspx?PostID=153069</wfw:commentRss><description>&lt;P&gt;Been writing in C++ lately.&amp;nbsp; Man, I feel disconnected, alone, naked.&amp;nbsp; So many pointers, deref'ing, addresses, pseudo-maniacal linked lists all over the place.&amp;nbsp; Where's ArrayList when you need it, or managed arrays.&amp;nbsp; I want my managed code back.&amp;nbsp; Please, give it back.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Was this what is was like to program, you know, before?&amp;nbsp; I don't remember it being so harsh.&amp;nbsp; I suppose you never do until after you've been shown the way.&amp;nbsp; Then everything becomes so much easier, you get so much more productive, your brain is happy, and you forget the past, forget the struggle, the fight against the machine, the compiler and the language.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Header files.&amp;nbsp; Need I say more?&amp;nbsp; Giant header files, ever member function listed.&amp;nbsp; Monstrous class declarations, poorly factored code.&amp;nbsp; It's a nightmare.&amp;nbsp; You laugh.&amp;nbsp; You think you are free of the horror.&amp;nbsp; But just wait.&amp;nbsp; It sneaks back up on you.&amp;nbsp; Before you know it your back in the hard-cruel world, stuck in the slow lane waiting for a compile.&lt;/P&gt;
&lt;P&gt;Wouldn't it be grand if the operating system refused to load apps written in anything but IL?&lt;/P&gt;
&lt;P&gt;Matt&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=153069" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattwar/archive/tags/Language/default.aspx">Language</category><category domain="http://blogs.msdn.com/mattwar/archive/tags/Code/default.aspx">Code</category></item></channel></rss>