<?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>Fabulous Adventures In Coding : Best Of FAIC</title><link>http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx</link><description>Tags: Best Of FAIC</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>References are not addresses</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx</link><pubDate>Tue, 17 Feb 2009 21:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9428097</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>75</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/9428097.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=9428097</wfw:commentRss><description>&lt;DIV class=mine&gt;
&lt;P&gt;[NOTE: Based on some insightful comments I have updated this article to describe more clearly the relationships between references, pointers and addresses. Thanks to those who commented.]&lt;/P&gt;
&lt;P&gt;I review a fair number of C# books; in all of them of course the author attempts to explain the difference between reference types and value types. Unfortunately, most of them do so by saying something like "&lt;EM&gt;a variable of reference type &lt;STRONG&gt;stores the&lt;/STRONG&gt; &lt;STRONG&gt;address&lt;/STRONG&gt; of the object&lt;/EM&gt;". I always object to this. The last time this happened the author asked me for a more detailed explanation of why I always object, which I shall share with you now:&lt;/P&gt;
&lt;P&gt;We have the abstract concept of "a reference". If I were to write about "Beethoven's Ninth Symphony", those two-dozen characters are not a 90-minute long symphonic masterwork with a large choral section. They're a reference to that thing, not the thing itself. And this reference itself contains references -- the word "Beethoven" is not a long-dead famously deaf Romantic Period composer, but it is a reference to one.&lt;/P&gt;
&lt;P&gt;Similarly in programming languages we have the concept of "a reference" distinct from "the referent". 
&lt;P&gt;The inventor of the C programming language, oddly enough, chose to not have the concept of references at all. Rather, Ritchie chose to have "pointers" be first-class entities in the language. A pointer in C is like a reference in that it refers to some data by tracking&amp;nbsp;its location, but there are more smarts in a pointer; you can perform arithmetic on a pointer as if it were a number, you can take the difference between two pointers that are both in the interior of the same array and get a sensible result,&amp;nbsp;and so on. 
&lt;P&gt;Pointers are strictly "more powerful" than references; &lt;STRONG&gt;anything you can do with references you can do with pointers&lt;/STRONG&gt;, but not vice versa. I imagine that's why there are no references in C -- it's a deliberately austere and powerful language. 
&lt;P&gt;The down side of pointers-instead-of-references is that pointers are hard for many novices to understand, and make it very very very easy to shoot yourself in the foot. 
&lt;P&gt;Pointers are typically &lt;EM&gt;implemented&lt;/EM&gt; as &lt;STRONG&gt;addresses&lt;/STRONG&gt;. An address is a number which is an offset into the "array of bytes" that is the entire virtual address space of the process (or, sometimes, an offset into some well-known portion of that address space -- I'm thinking of "near" vs. "far" pointers in win16 programming. But for the purposes of this article let's assume that an address is a byte offset into the whole address space.) Since addresses are just numbers you can easily perform pointer arithmetic with them. 
&lt;P&gt;Now consider C#, a language which has &lt;STRONG&gt;both references and pointers&lt;/STRONG&gt;. There are some things you can only do with pointers, and we want to have a language that allows you to do those things (under carefully controlled conditions that call out that you are doing something that possibly breaks type safety, hence "unsafe".)&amp;nbsp; But we also do not want to force anyone to have to understand pointers in order to do programming with references. 
&lt;P&gt;We also want to avoid some of the optimization nightmares that languages with pointers have. Languages with heavy use of pointers have a hard time doing garbage collection, optimizations, and so on, because it is infeasible to guarantee that no one has an interior pointer to an object, and therefore the object must remain alive and immobile. 
&lt;P&gt;For all these reasons we do not describe references as addresses in the specification. The spec just says that a variable of reference type "stores a reference" to an object, and leaves it completely vague as to how that might be implemented. Similarly, a pointer variable stores "the address" of an object, which again, is left pretty vague. Nowhere do we say that references are the same as addresses. 
&lt;P&gt;So, in C# a reference is some vague thing that lets you reference an object. You cannot do anything with a reference except dereference it, and compare it with another reference for equality. And in C# a pointer is identified as an address. 
&lt;P&gt;By contrast with a reference, you can do much more with a&amp;nbsp;pointer that contains an address.&amp;nbsp;Addresses can be manipulated mathematically; you can subtract one from another, you can add integers to them, and so on. Their legal operations indicate that they are "fancy numbers" that index into the "array" that is the virtual address space of the process. 
&lt;P&gt;Now, behind the scenes, the CLR actually &lt;EM&gt;does&lt;/EM&gt; implement managed object references as addresses to objects owned by the garbage collector, but &lt;EM&gt;that is an implementation detail.&lt;/EM&gt; There's no reason why it has to do that other than efficiency and flexibility. &lt;STRONG&gt;C# references could be implemented by opaque handles that are meaningful only to the garbage collector&lt;/STRONG&gt;, which, frankly, is how I prefer to think of them. That the "handle" happens to actually be an address at runtime is an implementation detail which I should neither know about nor rely upon. (Which is the whole point of encapsulation; the client doesn't have to know.) 
&lt;P&gt;I therefore have three reasons why authors should not explain that "references are addresses". 
&lt;P&gt;1) &lt;STRONG&gt;It's close to a lie.&lt;/STRONG&gt; References cannot be &lt;EM&gt;treated&lt;/EM&gt; as addresses by the user, and in fact, they do not &lt;EM&gt;necessarily&lt;/EM&gt; contain an address in the implementation. (Though our implementation happens to do so.) 
&lt;P&gt;2) &lt;STRONG&gt;It's an explanation that explains nothing to novice programmers.&lt;/STRONG&gt; Novice programmers probably do not know that an "address" is an offset into the array of bytes that is all process memory. To understand what an "address" is with any kind of depth, the novice programmer &lt;EM&gt;already has to understand pointer types and addresses&lt;/EM&gt; -- basically, they have to understand the memory model of many implementations of C. This is one of those "it's clear only if it's already known" situations that are so common in books for beginners. 
&lt;P&gt;3) If these novices eventually learn about pointer types in C#, their confused understanding of references will probably make it &lt;STRONG&gt;harder, not easier&lt;/STRONG&gt;, to understand how pointers work in C#. The novice could sensibly reason "&lt;EM&gt;If a reference is an address and a pointer is an address, then I should be able to cast any reference to a pointer in unsafe code, right?&lt;/EM&gt;"&amp;nbsp; But you cannot. 
&lt;P&gt;If you think of a reference is actually being an opaque GC handle then it becomes clear that to find the address associated with the handle you have to somehow "fix" the object. You have to tell the GC "until further notice, the object with this handle must not be moved in memory, because someone might have an interior pointer to it". (There are various ways to do that which are beyond the scope of this screed.) 
&lt;P&gt;Basically what I'm getting at here is that &lt;STRONG&gt;an understanding of the&amp;nbsp;meaning of "addresses" in any language requires a moderately deep understanding of the memory model of that language&lt;/STRONG&gt;. If an author does not provide an explanation of the memory model of either C or C#, then explaining references in terms of addresses becomes an exercise in question begging. It raises more questions than it answers. 
&lt;P&gt;This is one of those situations where the author has the hard call of deciding whether an &lt;STRONG&gt;inaccurate oversimplification&lt;/STRONG&gt; serves the larger pedagogic goal better than an &lt;STRONG&gt;accurate digression&lt;/STRONG&gt; or a &lt;STRONG&gt;vague hand-wave&lt;/STRONG&gt;. 
&lt;P&gt;In the counterfactual world where I am writing a beginner C# book, I would personally opt for the vague hand-wave.&amp;nbsp; If I said anything at all I would say something like "a reference is actually implemented as a small chunk of data which contains information used by the CLR to determine precisely which object is being referred to by the reference". That's both vague and accurate without implying more than is wise.&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9428097" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Books/default.aspx">Books</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Memory+Management/default.aspx">Memory Management</category></item><item><title>C# In Depth</title><link>http://blogs.msdn.com/ericlippert/archive/2008/04/28/c-in-depth.aspx</link><pubDate>Mon, 28 Apr 2008 17:19:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8423437</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/8423437.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=8423437</wfw:commentRss><description>&lt;div class="mine"&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Good morning, we interrupt our irregular and unscheduled ramblings with this breaking news bulletin: I am pleased to pass on news of the &lt;a href="http://msmvps.com/blogs/jon.skeet/archive/2008/04/24/c-in-depth-it-s-really-real.aspx"&gt;availability of Jon Skeet's new book "C# in Depth"&lt;/a&gt;.  &lt;p&gt;&lt;a href="http://www.manning.com/skeet/"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="193" alt="skeet_cover" src="http://blogs.msdn.com/blogfiles/ericlippert/WindowsLiveWriter/CInDepth_13D12/skeet_cover_3.jpg" width="154" border="0"&gt;&lt;/a&gt;  &lt;p&gt;I had the privilege of being the technical editor of this book. But I've gotta tell you, when I unzipped the files sent from the publisher, the flattery began immediately. The "front matter" placeholder page read:  &lt;blockquote&gt; &lt;p&gt;FOREWORD: To be written by someone really prominent, hopefully – Eric Lippert, perhaps?&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Hah! Don't think I went easy on the book because you buttered me up, Jon.  &lt;p&gt;In all seriousness, I was very pleased and honoured to be asked to write the foreword to Jon's excellent book. This was by far the least work and most fun I've had doing technical editing, and the foreword practically wrote itself. Here's what I whipped up:  &lt;hr&gt; There are two kinds of pianists.  &lt;p&gt;There are some pianists who play not because they enjoy it, but because their parents force them to take lessons. Then there are those who play the piano because it pleases them to create music. They don’t need to be forced; on the contrary, they sometimes don’t know when to stop.  &lt;p&gt;Of the latter kind, there are some who play the piano as a hobby. Then there are those who play for a living. That requires a whole new level of dedication, skill and talent. They may have some degree of freedom about what genre of music they play and the stylistic choices they make in playing it, but fundamentally those choices are driven by the needs of the employer or the tastes of the audience.  &lt;p&gt;Of the latter kind, there are some who do it primarily for the money.&amp;nbsp; Then there are those professionals who would want to play the piano in public even if they weren’t being paid. They enjoy using their skills and talents to make music for others. That they can have fun and get paid for it is so much the better.  &lt;p&gt;Of the latter kind, there are some who are self-taught, who “play by ear”, who might have great talent and ability but cannot really communicate that intuitive understanding to others except through the music itself. Then there are those who have formal training in both theory and practice. They can explain what techniques the composer used to achieve the intended emotional effect, and use that knowledge to shape their interpretation of the piece.  &lt;p&gt;Of the latter kind, there are some who have never looked inside their pianos. Then there are those who are fascinated by the clever escapements that lift the damper felts a fraction of a second before the hammers strike the strings. They own key levelers and capstan wrenches. They take delight and pride in being able to understand the mechanisms of an instrument that has five to ten thousand moving parts.  &lt;p&gt;Of the latter kind, there are some who are content to master their craft and exercise their talents for the pleasure and profit it brings. Then there are those who are not just artists, theorists and technicians; somehow they find the time to pass that knowledge on to others as mentors.  &lt;p&gt;I have no idea if Jon Skeet is any kind of pianist. But from my email conversations with him as one of the C# team’s Most Valuable Professionals over the years, from reading his blog and from reading every word of this book at least three times, it has become clear to me that Jon is that latter kind of software developer: enthusiastic, knowledgeable, talented, curious and analytical; a teacher of others.  &lt;p&gt;C# is a highly pragmatic and rapidly evolving language. Through the addition of query comprehensions, richer type inference, a compact syntax for anonymous functions, and so on, I hope that we have enabled a whole new style of programming while still staying true to the statically typed, component-oriented approach that has made C# a success.  &lt;p&gt;Many of these new stylistic elements have the paradoxical quality of feeling very old (lambda expressions go back to the very foundations of computer science in the first half of the twentieth century) and yet at the same time feeling new and unfamiliar to developers used to a more modern object-oriented approach.  &lt;p&gt;Jon gets all that. This book is ideal for professional developers who have a need to understand the “what” and “how” of the latest revision to C#. But it is also for those developers whose understanding is enriched by exploring the “why” of the language's design principles.  &lt;p&gt;Being able to take advantage of all that new power will require some new ways of thinking about data, functions, and the relationship between them. It’s not unlike trying to play jazz after years of classical training – or, perhaps, vice versa. Either way, I am looking forward to finding out what sorts of functional compositions the next generation of C# programmers come up with. Happy composing, and thanks for choosing the key of C# to do it in.  &lt;p&gt;Eric Lippert &lt;br&gt;Seattle, Washington &lt;br&gt;February 2008&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8423437" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Books/default.aspx">Books</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category></item><item><title>How to not get a question answered</title><link>http://blogs.msdn.com/ericlippert/archive/2008/02/20/how-to-not-get-a-question-answered.aspx</link><pubDate>Wed, 20 Feb 2008 18:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7726212</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>18</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/7726212.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=7726212</wfw:commentRss><description>&lt;DIV class=mine&gt;
&lt;P mce_keep="true"&gt;Raymond has had lots of great posts over the years on how to not get a question answered. Some of the ways he points out that help ensure that a question goes unanswered are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use a &lt;A href="http://blogs.msdn.com/oldnewthing/archive/2008/01/23/7203582.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2008/01/23/7203582.aspx"&gt;difficult&lt;/A&gt; or &lt;A href="http://blogs.msdn.com/oldnewthing/archive/2007/01/18/1488858.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2007/01/18/1488858.aspx"&gt;meaningless&lt;/A&gt; subject line. 
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/oldnewthing/archive/2007/11/08/5973122.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2007/11/08/5973122.aspx"&gt;Ask a grammatically&amp;nbsp;unclear question&lt;/A&gt;. 
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/oldnewthing/archive/2007/09/12/4872632.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2007/09/12/4872632.aspx"&gt;Forget to actually ask a question&lt;/A&gt; (&lt;A class="" href="http://blogs.msdn.com/oldnewthing/archive/2007/03/15/1883515.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2007/03/15/1883515.aspx"&gt;this&lt;/A&gt; is a personal favourite of mine; back when I was working on scripting I would practically daily get an email consisting of a stack trace and a crash report, with &lt;EM&gt;no indication whatsoever&lt;/EM&gt; of what the sender wanted me to do with it. Investigate it? Commiserate? Give career advice?) 
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/oldnewthing/archive/2007/04/13/2106139.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2007/04/13/2106139.aspx"&gt;Ask an unanswerable question over and over again&lt;/A&gt;.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I would add&amp;nbsp;that&amp;nbsp;&lt;A href="http://blogs.msdn.com/ericlippert/archive/2003/11/03/53333.aspx" mce_href="http://blogs.msdn.com/ericlippert/archive/2003/11/03/53333.aspx"&gt;phrasing the question&amp;nbsp;in terms of the&amp;nbsp;attempted solution&amp;nbsp;rather than&amp;nbsp;the underlying&amp;nbsp;problem&lt;/A&gt; is a great way to&amp;nbsp;have a question remain unanswered. But I already did that. Today's rant, rather, is:&lt;/P&gt;
&lt;P&gt;A great way to not get your question answered is to &lt;STRONG&gt;treat the person that you're asking to share their time and knowledge like they're not a human being&lt;/STRONG&gt;. &lt;/P&gt;
&lt;P&gt;I understand that this is easy to do.&lt;/P&gt;
&lt;P&gt;I understand that when someone is asking a technical question, it is almost always because they're &lt;EM&gt;deeply frustrated&lt;/EM&gt; by their inability to make some important specific complicated thing work the way they'd expect. &lt;/P&gt;
&lt;P&gt;I understand that software makers are a big source of frustration in a more general sense. We all use imperfect software every day; little frustrations mentally accumulate in a way that little victories do not.&lt;/P&gt;
&lt;P&gt;I understand that programming languages and software in general is often &lt;EM&gt;counterintuitive&lt;/EM&gt;, and that understanding the complex reasoning behind a counterintuitive result is often seemingly of little practical import compared to just getting the problem at hand solved.&lt;/P&gt;
&lt;P&gt;I understand that it is very easy to use an email client as an &lt;EM&gt;impersonal and&amp;nbsp;automatic information resource&lt;/EM&gt; something like a search engine, where you just type in your query, you get your result back, and you move on with your day.&lt;/P&gt;
&lt;P&gt;I understand that there is an inherent and pervasive bias in pure-text communication&amp;nbsp;which makes statements intended to be &lt;EM&gt;good-humoured &lt;/EM&gt;sound &lt;EM&gt;sophomoric&lt;/EM&gt;, makes statements which were intended to be &lt;EM&gt;friendly &lt;/EM&gt;sound &lt;EM&gt;smarmy&lt;/EM&gt;, makes statements which were intended to be &lt;EM&gt;enthusiastic&lt;/EM&gt; sound &lt;EM&gt;brash&lt;/EM&gt;, makes statements intended to be &lt;EM&gt;helpful&lt;/EM&gt; sound&amp;nbsp;&lt;EM&gt;condescending&lt;/EM&gt;, makes statements which were intended to be &lt;EM&gt;precise and accurate&lt;/EM&gt; sound &lt;EM&gt;brusque and pedantic, &lt;/EM&gt;makes statements which were intended to be &lt;EM&gt;positive&lt;/EM&gt; sound &lt;EM&gt;neutral&lt;/EM&gt;, and makes statements which were intended to be &lt;EM&gt;neutral&lt;/EM&gt; seem downright &lt;EM&gt;hostile&lt;/EM&gt;. &lt;/P&gt;
&lt;P&gt;(Boy, do I ever understand that. For over four years I have deliberately tried to pitch the tone of this blog as good-humoured, friendly, enthusiastic, helpful, precise, accurate and positive; &lt;STRONG&gt;I suspect that most of the time I fail badly&amp;nbsp;at most or all&amp;nbsp;of those&lt;/STRONG&gt;. Writing is &lt;EM&gt;hard&lt;/EM&gt;.)&lt;/P&gt;
&lt;P&gt;I understand all that, from both sides; I've certainly been on both the sending and receiving ends of all of the above, many times.&lt;/P&gt;
&lt;P&gt;Which is why I try very hard to be helpful to the &lt;EM&gt;complete strangers&lt;/EM&gt; who send me &lt;EM&gt;overtly rude&lt;/EM&gt; and &lt;EM&gt;frequently profane&lt;/EM&gt; emails capped off with a request for me to to take time out of my day to explain something to them. &lt;/P&gt;
&lt;P&gt;I try to see an upset or confused user as an opportunity to make a good impression; sometimes people do a complete 180 when you help them out and are appreciative and grateful. Sometimes they even send an unsolicited note to your manager, which is always pleasant.&lt;/P&gt;
&lt;P&gt;But more often, I never hear from them again after their question is answered.&lt;/P&gt;
&lt;P&gt;None of this is in their own best interests. It makes the human&amp;nbsp;information sources they rely upon less likely to help them now and in the future.&lt;/P&gt;
&lt;P&gt;So, just a friendly reminder. (A &lt;STRONG&gt;friendly, good-humoured, helpful, enthusiastic, positive&lt;/STRONG&gt; reminder!) The people you are sending email to about your technical problems are &lt;EM&gt;people&lt;/EM&gt;. It would be &lt;STRONG&gt;smart&lt;/STRONG&gt; to briefly introduce yourself, describe your problem without insulting the people who created it, indicate what you've done to attempt to solve it yourself, actually &lt;EM&gt;ask&lt;/EM&gt; for help, and later say thank-you for their time whether they manage to actually help you or not. &lt;/P&gt;
&lt;P&gt;It's smart because doing so is in your own best interests.&lt;/P&gt;
&lt;P&gt;It would also be &lt;STRONG&gt;nice&lt;/STRONG&gt;, but I actually am not particularly concerned about "nice" today. &lt;EM&gt;Nice&lt;/EM&gt; is &lt;EM&gt;nice&lt;/EM&gt; to have I suppose. But not being &lt;EM&gt;smart&lt;/EM&gt; is just&amp;nbsp;&lt;EM&gt;dumb&lt;/EM&gt;.&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7726212" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Rants/default.aspx">Rants</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category></item><item><title>C++ and the Pit Of Despair</title><link>http://blogs.msdn.com/ericlippert/archive/2007/08/14/c-and-the-pit-of-despair.aspx</link><pubDate>Tue, 14 Aug 2007 18:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4385879</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/4385879.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=4385879</wfw:commentRss><description>&lt;DIV class=mine&gt;
&lt;P&gt;&lt;A class="" href="http://blogs.msdn.com/oldnewthing/archive/2007/08/14/4374222.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2007/08/14/4374222.aspx"&gt;Raymond has an interesting post today&lt;/A&gt; about two subtle aspects of C#: how order of&amp;nbsp;evaluation in an expression&amp;nbsp;is specified as strictly left-to-right, and how the rules&amp;nbsp;regarding local shadowing ensure that an identifier has exactly one meaning in a local scope. He makes an educated guess that the reason for these sorts of rules is to "&lt;EM&gt;reduce the frequency of a category of subtle bugs&lt;/EM&gt;".&lt;/P&gt;
&lt;P&gt;I'd like to take this opportunity to both confirm that guess and to expand upon it a bit.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Eliminating Subtle Bugs&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You remember in &lt;EM&gt;The Princess Bride&lt;/EM&gt; when Westley wakes up and finds himself&amp;nbsp;locked in&amp;nbsp;&lt;A class="" href="http://www.wavcentral.com/movies/pbride.html" mce_href="http://www.wavcentral.com/movies/pbride.html"&gt;The Pit Of Despair&lt;/A&gt;&amp;nbsp;with a hoarse&amp;nbsp;albino and the sinister six-fingered man, Count Rugen?&amp;nbsp;The principle&amp;nbsp;idea of a pit of despair is twofold.&amp;nbsp;First, that it is a &lt;EM&gt;pit&lt;/EM&gt;, and therefore easy to fall into but&amp;nbsp;difficult work to climb out of. And second, that it induces &lt;EM&gt;despair&lt;/EM&gt;. Hence the name.&lt;/P&gt;
&lt;P&gt;I often think of C++ as my own personal Pit of Despair Programming Language.&amp;nbsp;Unmanaged C++ makes it so easy to fall into traps. Think buffer overruns, memory leaks, double frees, mismatch between allocator and deallocator, using freed memory, umpteen dozen ways to trash the stack or heap -- and those are just some of the memory issues. There are lots more "gotchas" in C++. C++ often throws you into the Pit of Despair and you have to climb your way up the Hill of Quality. (Not to be confused with scaling the Cliffs of Insanity. That's different.)&lt;/P&gt;
&lt;P&gt;Now, &lt;A class="" href="http://blogs.msdn.com/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx" mce_href="http://blogs.msdn.com/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx"&gt;as I've said before, the design of C# is not a subtractive process&lt;/A&gt;.&amp;nbsp;It is not "C++ with the stupid parts taken out". But that said, it would be rather foolish of us to not look at what problems people have typically had with&amp;nbsp;other languages and work to ensure that those exact same problems do not crop up&amp;nbsp;for C# users. I would like C# to be a "Pit of Quality" language, &lt;EM&gt;a language where its rules encourage you to write correct code in the first place&lt;/EM&gt;. You have to work quite hard to write a buffer overrun bug into a&amp;nbsp;C# program, and that's on purpose. &lt;/P&gt;
&lt;P&gt;I have never written a buffer overrun in C#. I have never written a bug where I accidentally shadowed a variable in another scope in C#. I have never used stack memory after the function returned in C#. I've done all those things in C++ multiple times, and it's not because I'm an idiot, it's because C++ makes it easy to do all those things accidentally and C# makes it very hard. Making it easy to do good stuff is obviously goodness; &lt;EM&gt;thinking about how to make it hard to do bad is actually more important.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Now, given that the design of C# is not subtractive, we have to consider the pros and cons of each decision. Is there any compelling user &lt;EM&gt;benefit&lt;/EM&gt; in a &lt;EM&gt;deliberate&lt;/EM&gt;&amp;nbsp;&lt;EM&gt;failure&lt;/EM&gt; to specify what order functions in an expression are evaluated?&amp;nbsp;The only benefit I can think of is "not breaking some existing users of two existing incompatible implementations by declaring one of the implementations to be wrong", which is the situation that the C&amp;nbsp;standardization committee frequently found itself in, I'm sure. When C# was a new language that wasn't an issue, so we were free to pin that down early. Doing so has compelling benefits; it prevents subtle bugs, and as I'll discuss in a moment, there are other benefits as well.&lt;/P&gt;
&lt;P&gt;So, long story short, yes, designing the language so as to&amp;nbsp;prevent certain categories of subtle bugs is a huge priority for us.&amp;nbsp;However, there are other reasons too. For instance:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Uncertainty sometimes has high value but only in special contexts&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Like Vroomfondel said, "&lt;EM&gt;we demand rigidly defined areas of doubt and uncertainty!&lt;/EM&gt;" Ideally, those areas should be small and should afford some way for users to eliminate the uncertainty. Nondeterministic finalization is a good example. We deliberately do not specify when and in what order finalizers run because: &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;the vast majority of the time it makes no difference,&lt;/LI&gt;
&lt;LI&gt;relying on a particular timing or ordering of finalization some small percentage of the time is probably a subtle bug waiting to happen,&lt;/LI&gt;
&lt;LI&gt;specifying it would require us to simplify the implementation to the point where it actually could be specified, thereby destroying much of its value; there is value in that complexity&lt;/LI&gt;
&lt;LI&gt;specifying it ties our hands to make algorithm improvements in the future&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;But we do provide a mechanism (the "using" statement) whereby if you do need to ensure that a finalizer runs at a particular point, there is an easy syntax for it.&lt;/P&gt;
&lt;P&gt;With the possible exception of point 2, the order of evaluation of sub-expressions does not have these problems. It often does make a difference, the implementation is already simple enough that the specification is trivial, and its&amp;nbsp;unlikely that we are going to come up with some incredible improvement in the algorithm which determines what order subexpressions are evaluated in. And if by some miracle we do, the specification does take care to call out that if we can prove that out-of-order evaluation cannot introduce subtle bugs, then we reserve the right to do it.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Uncertainty is hard on the language implementation team&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;When I am implementing part of the language specification, of course I want great freedom to decide &lt;EM&gt;how to implement&lt;/EM&gt; a particular chunk of semantics. The language specification is not in the business of telling me whether we should be using a hand-written recursive descent parser or a parser-generator that consumes the grammar, etc. But I hate, hate, &lt;EM&gt;hate&lt;/EM&gt; when I'm reading the specification and I'm left with a choice of &lt;EM&gt;what semantics to implement&lt;/EM&gt;. I &lt;EM&gt;will&lt;/EM&gt; choose wrong. I know this, because &lt;A class="" href="http://blogs.msdn.com/ericlippert/archive/2006/06/27/648681.aspx" mce_href="http://blogs.msdn.com/ericlippert/archive/2006/06/27/648681.aspx"&gt;when I ask you guys what the "intuitively obvious" thing to do is, significant fractions of the population disagree&lt;/A&gt;! &lt;/P&gt;
&lt;P&gt;Uncertainty is also hard on our testers -- they would like to know whether the language is correct, and being told "the specification is unclear, therefore whatever we do is correct" makes their jobs harder because that's a lie. Crashing horribly is probably not correct. Deadlocking is probably not correct. Somewhere on that spectrum between clearly correct behaviour and clearly incorrect behaviour is a line, and one of testing's jobs is to ensure that the developers produced an implementation that falls on the "correct" side of that line. Not knowing precisely where the line is creates unnecessary work for them, and they are overworked already.&lt;/P&gt;
&lt;P&gt;And uncertainty is hard on our user education people. They want to be able to write documentation which clearly describes what semantics the implementation actually implements, and they want to be able to write sample programs to illustrate it.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Uncertainty&amp;nbsp;erodes confidence&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And finally, uncertainty erodes confidence in our users that we have a quality product that was designed with deep thought, implemented with care, and behaves predictably and sensibly. People entrust the operation of multi-million dollar businesses to their C# code; they're not going to do that if we can't even reliably tell them what "(++i) + i +&amp;nbsp;(i++)" does!&lt;/P&gt;
&lt;P&gt;*****&lt;/P&gt;
&lt;P&gt;Next time on FAIC I think I'll talk a bit about a related principle of language design: how we think about issues involving "breaking changes". I'll be expanding upon &lt;A class="" href="http://blogs.msdn.com/nealho/archive/2005/11/22/496101.aspx" mce_href="http://blogs.msdn.com/nealho/archive/2005/11/22/496101.aspx"&gt;an excellent article written a couple of years ago by my colleague Neal&lt;/A&gt;, so you might want to start there.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4385879" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx">precedence</category></item><item><title>Talking About The Weather, Part Two</title><link>http://blogs.msdn.com/ericlippert/archive/2007/08/03/talking-about-the-weather-part-two.aspx</link><pubDate>Fri, 03 Aug 2007 17:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4191068</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/4191068.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=4191068</wfw:commentRss><description>&lt;DIV class=mine&gt;
&lt;P&gt;What we’re missing is a phenomenon that probably &lt;EM&gt;was&lt;/EM&gt; described correctly by your high school science teacher, namely, the phenomenon of “&lt;STRONG&gt;latent heat&lt;/STRONG&gt;” (which is what I was taught, though “enthalpy” would be the more modern term.)&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I said that the temperature of a substance is the average amount of energy in it.&lt;STRONG&gt; I lied; it is possible to add energy to water without changing the temperature.&lt;/STRONG&gt; Liquid water requires “extra” energy to vaporize that is not reflected in the temperature of the water. You may recall doing a science experiment which ended up with a &lt;A class="" href="http://www.sciencebyjones.com/heating_curve1.htm" mce_href="http://www.sciencebyjones.com/heating_curve1.htm"&gt;graph like this one&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;As you can see from the graph, when the water reaches the point where it is about to&amp;nbsp;melt or&amp;nbsp;boil&amp;nbsp;the temperature stops going up for a while, even though more and more energy is being added to the mix. The liquid water requires an extra little boost of energy to liberate the molecule from the liquid. That amount of energy is roughly 540 calories per gram of water thusly liberated.&lt;/P&gt;
&lt;P&gt;Let me be very clear on two points here. First, &lt;STRONG&gt;liquid water evaporates at any temperature, not just the boiling point&lt;/STRONG&gt;. Obviously puddles dry up even though they are not boiling! The boiling point is simply the point at which the liquid water has so much heat, and the vapor pressure is sufficiently low, that all of it is going to rapidly turn into vapor in short order. And second, with that in mind it should be clear that the 540 calories required per gram of vaporized water is 540 calories per gram &lt;STRONG&gt;no matter what temperature the water is at when it is vaporizing&lt;/STRONG&gt;. (There may be some small variation in the latent heat required based on the temperature, but it'll be on the near order of 540 calories per gram&amp;nbsp;in the kind of temperature ranges we're talking about here.)&lt;/P&gt;
&lt;P&gt;One way to think about the latent heat is this: liquid water has way more entropy – more randomness – than solid water. The position and speed of each molecule in a liquid is way more random than in a solid. And similarly, water vapor has way more entropy than liquid water. Adding heat makes entropy; it disorders a structure. If you want to make water more entropic by evaporating it, you’re going to have to add a whole load of heat to it to account for the increase in entropy.&amp;nbsp;540 calories per gram, in fact.&lt;/P&gt;
&lt;P&gt;But this process goes the other way too. When you&amp;nbsp;export entropy from&amp;nbsp;water vapor by turning it back into a liquid, those 540 calories per gram have to go somewhere. That entropy is exported from the water in the form of heat. When you put your finger in the steam rising from a boiling kettle, it's the enormous&amp;nbsp;latent heat of the vapor&amp;nbsp;condensing on your relatively cold finger&amp;nbsp;that really scalds you. Even if you happened to be in atmospheric conditions where the condensation happened to a much lower-temperature vapor, the latent heat would still hurt a lot.&lt;/P&gt;
&lt;P&gt;So now let’s revisit our look at a nice fluffy cloud. The sun adds 540 calories to a gram of surface water, liberating it into the atmosphere. That gram of water winds its way up into the sky where it hits a region of sufficiently low temperature and high pressure as that it flashes back into liquid form. &lt;STRONG&gt;Without changing the temperature of the water further, 540 calories is suddenly liberated into the bottom of the cloud, heating up the surrounding air.&lt;/STRONG&gt; Hot air rises. An updraft forms in the middle of the cloud, sucking some of the water droplets higher into the atmosphere. &lt;STRONG&gt;The cloud gets taller.&lt;/STRONG&gt; Eventually the updraft cools off and the cooler air moves outwards and slowly subsides.&amp;nbsp;You'll get a&amp;nbsp;sort of doughnut-shaped circulation of air&amp;nbsp;around the exterior of the cloud as the falling air then gets sucked back in the bottom.&lt;/P&gt;
&lt;P&gt;Meanwhile, the bottom of the cloud is getting hotter and hotter from the latent heat of more water evaporated from the lake surface turning back into liquid. The bottom of the cloud has an updraft in it, so it is pulling more and more water vapor from the wet atmosphere below it into the bottom of the cloud. The process is accelerating. If the cloud happens to be over a huge body of warm water then&amp;nbsp;this can accelerate very rapidly. &lt;/P&gt;
&lt;P&gt;The latent heat of fusion liberated when a gram of liquid water turns into ice is another 333 calories on top of the 540 calories that was from the latent heat of condensation. Imagine what happens to our cloud if the strong updraft makes the cloud so tall that the extremely cold atmosphere up there&amp;nbsp;glaciates the&amp;nbsp;lifted droplets into a cirrus cloud at the top. Cirrus clouds are made out of ice crystals.&amp;nbsp;The water (now in the form of ice) escapes from the cloud out the top and potentially stays up there for a long time.&amp;nbsp;The ice drifts slowly&amp;nbsp;away from the top of what is now probably looking like a pretty threatening cloud. Essentially the cirrus cloud is extracting all the latent heat from the water, depositing the heat&amp;nbsp;in the cloud, and exporting the resulting coldness out the top in the form of ice.&lt;/P&gt;
&lt;P&gt;Now imagine what happens if a bit of the water vapor in the cloud gets cold enough to freeze in the middle of the cloud. It liberates its latent heat of fusion into the updraft, making it stronger. The updraft&amp;nbsp;sucks the ice fragment up through hundreds of meters of cold wetness. When it gets to the top, maybe it is heavy enough to fall back down through more cold wetness in the outer part of the&amp;nbsp;cloud, only to get sucked up by the updraft again when it reaches the bottom. &lt;STRONG&gt;The ice fragment gets bigger and bigger, liberating more and more energy into the updraft as it goes around in vertical circles.&lt;/STRONG&gt; Eventually the updraft is not strong enough to hold it up and all that cold gets exported out the bottom of the cloud in the form of hail. &lt;/P&gt;
&lt;P&gt;And &lt;EM&gt;that&lt;/EM&gt; is how thunderclouds concentrate massive amounts of energy; they move&amp;nbsp;huge quantities of latent heat that the sun puts into warm surface water into their interiors to power the very updrafts that suck in more vapor from below, concentrating the heat even more. The average heat keeps going up because&amp;nbsp;coldness is exported in the form of cirrus clouds out the top and hail (or cold rain) out the bottom. &lt;/P&gt;
&lt;P&gt;Now imagine the effect of hundreds of such clouds forming over a relatively small area. The suction from the updrafts is immense, and easily moves around millions of tonnes of air that we then experience as high winds. And when the updrafts are insufficient to hold the water up, you get torrential rains and hail falling out of the sky. It’s an amazing phenomenon, and it is all thanks to the fact that our planet is almost entirely covered by a substance which has high latent heat and can be solid, liquid and gas in a relatively small temperature and pressure&amp;nbsp;range. &lt;BR&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4191068" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Science/default.aspx">Science</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Weather/default.aspx">Weather</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Non-computer/default.aspx">Non-computer</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category></item><item><title>Talking About The Weather, Part One</title><link>http://blogs.msdn.com/ericlippert/archive/2007/08/02/talking-about-the-weather-part-one.aspx</link><pubDate>Thu, 02 Aug 2007 17:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4178992</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/4178992.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=4178992</wfw:commentRss><description>&lt;DIV class=mine&gt;
&lt;P&gt;No technology today; just talking about the weather. &lt;/P&gt;
&lt;P&gt;I &lt;EM&gt;love&lt;/EM&gt; talking about the weather.&lt;/P&gt;
&lt;P&gt;I mentioned the other day that I had just returned from my ancestral homeland on the shores of Lake Huron, the great inland sea of southwestern Ontario. We got some rip-roaring thunderstorms this year. I love thunderstorms on the lake. They are extremely dramatic, particularly at sunset.&lt;/P&gt;
&lt;P&gt;Think about&amp;nbsp;this for a minute: even small thunderstorms must move around literally &lt;EM&gt;millions&lt;/EM&gt; of tonnes of air and water, often at high speed. Storms are &lt;EM&gt;massive&lt;/EM&gt; concentrations of energy. Where does the energy come from? How does it get so concentrated?&lt;/P&gt;
&lt;P&gt;Coincidentally, I&amp;nbsp;had just started reading&amp;nbsp;Frank Bethwaite’s book “&lt;A class="" href="http://www.amazon.com/High-Performance-Sailing-Frank-Bethwaite/dp/0070057990" mce_href="http://www.amazon.com/High-Performance-Sailing-Frank-Bethwaite/dp/0070057990"&gt;High Performance Sailing&lt;/A&gt;”. Bethwaite is not just an amazing sailboat designer, but also a professional meteorologist. As someone who knows next to nothing about the weather I found it fascinating&amp;nbsp;to learn just why it is that thunderstorms are so powerful.&lt;/P&gt;
&lt;P&gt;Understanding this phenomenon required me to first be disabused of an incorrect notion that I’ve held probably since the fourth grade. You were probably taught this too, in your elementary school or high school science classes: “&lt;EM&gt;the reason clouds form when moist air cools is because &lt;STRONG&gt;cold air can hold less water than warm air&lt;/STRONG&gt;&lt;/EM&gt;”. &lt;/P&gt;
&lt;P&gt;Nope. Not true. &lt;STRONG&gt;Your science teacher was wrong&lt;/STRONG&gt;. That statement, though arguably&amp;nbsp;not &lt;EM&gt;entirely&lt;/EM&gt; false, is sufficiently misleading as to work against a correct understanding of the weather. Nitrogen and oxygen, the gasses which make up most of the atmosphere, have no ability to “hold” anything. Their molecules are way too far apart to hold onto anything. Furthermore, phenomena such as cloud formation can be explained entirely without this idea, so just based solely upon Occam's razor we should dispense with the notion that the air has something to do with it.&lt;/P&gt;
&lt;P&gt;Ironically, the actual situation is not really very difficult to understand. First, consider the behaviour at the molecular level:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A molecule of liquid water will vaporize when its energy is high enough. &lt;/LI&gt;
&lt;LI&gt;Conversely, a molecule of water vapor will condense into liquid when its energy is low enough.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Now consider the aggregate behaviour of zillions of individual molecules. We call the average energy of many molecules the “temperature”. When in gaseous form, that energy manifests itself as the molecules exerting force on their surroundings by slamming into things at high speed. We measure the number of molecules which inhabit a given region at a given temperature by measuring this force, which we call “pressure”. &lt;/P&gt;
&lt;P&gt;Since temperature is an average, obviously some of the molecules in the sample will have less energy than average, some will have more. If the temperature is high, then a higher percentage of the liquid molecules will have enough energy to vaporize and a lower percentage of vapor molecules will have low enough energy to condense. A warm puddle of water evaporates faster than a cold puddle of water for this reason.&amp;nbsp;And when you sweat, you cool down -- the warmest water molecules on your skin are evaporating and taking their heat with them, away from you.&lt;/P&gt;
&lt;P&gt;Since pressure (at a given temperature) is proportional to how many vapor molecules there are in a given amount of space, it should be equally clear that at high pressure, there are more molecules available to condense than at low pressure. So we should expect that, all else being equal, the higher the vapor pressure, the more condensation we’ll see. “Damp air” – air that has a lot of water vapor pressure - condenses onto a cold window a lot faster than dry air.&lt;/P&gt;
&lt;P&gt;With that simple molecular explanation, cloud formation can now be understood with no reference whatsoever to nonsense like “the water-holding capacity of the air”. Why should we mention the air at all? The air has nothing to do with it, aside from the fact that heating up the air also heats up the water vapor in it. Clouds would form equally well if our atmosphere was a mixture of helium and water vapor, or for that matter, just pure water vapor. &lt;STRONG&gt;All that matters is the temperature of the water and the vapor pressure in the region.&lt;/STRONG&gt; A cloud is exactly that portion of the atmosphere where the vapor pressure is high enough and the temperature is low enough that a significant quantity of water condenses.&lt;/P&gt;
&lt;P&gt;(To be nit-picky, yes, there are other factors. Foreign substances mixed into the liquid water, whether any of the water is in solid ice form, whether the liquid water is in round droplets or flat sheets, and so on, influence the rate of vaporization and condensation as well. My point though is simply that the "holding capacity" of the non-water part of the air is not relevant right now.)&lt;/P&gt;
&lt;P&gt;With that in mind let’s look at the larger picture of how a cumulus cloud forms. &lt;/P&gt;
&lt;P&gt;The sun heats the surface of a body of water.&amp;nbsp;Say, my beloved Lake Huron. The temperature of the surface rises, so the rate of vaporization increases.&amp;nbsp;Some warm vapor rises until it encounters a region of the atmosphere where the temperature is low enough and the vapor pressure is high enough that the water vapor turns back into liquid water. The liquid molecules combine into droplets which we can see. If the droplets get big enough then&amp;nbsp;they fall back to earth in the form of rain. &lt;/P&gt;
&lt;P&gt;That explains clouds and rain but does not explain the phenomenon I’m trying to understand here: why&amp;nbsp;thunderstorms are so energetic. It seems like what we’re doing is moving the energy from the sunlight into the lake surface, then into the atmosphere via evaporation, and then that energy is transferred randomly into to the rest of the atmosphere when the cloud cools and condenses. After all, that’s what “cooling” is – moving heat energy to somewhere else. If this explanation is right then clouds should be dispersing energy, not concentrating it.&amp;nbsp; Something else is going on here. What are we missing?&lt;/P&gt;
&lt;P&gt;Next time on FAIC: Entropy!&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4178992" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Science/default.aspx">Science</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Weather/default.aspx">Weather</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Non-computer/default.aspx">Non-computer</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category></item><item><title>How to make little girls scream like… well, like little girls</title><link>http://blogs.msdn.com/ericlippert/archive/2005/11/03/how-to-make-little-girls-scream-like-well-like-little-girls.aspx</link><pubDate>Thu, 03 Nov 2005 20:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:488743</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/488743.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=488743</wfw:commentRss><description>&lt;FONT face="lucida sans unicode"&gt;&lt;FONT color=#800080 size=2&gt;
&lt;P&gt;[No technology today, so if you're only here for the witty banter about programming languages, skip this one.]&lt;/P&gt;
&lt;P&gt;Leah and I spent the week before Halloween volunteering at &lt;/FONT&gt;&lt;A href="http://nightmareatbeaverlake.com/event.html"&gt;&lt;U&gt;&lt;FONT color=#0000ff size=2&gt;Nightmare At Beaver Lake&lt;/U&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#800080 size=2&gt;, a haunted-house-style attraction that runs along the trails in Beaver Lake Park, just on the other side of Lake Sammamish from Microsoft's main campus. I had never done any kind of acting before whatsoever and it was an enormous amount of fun to learn what scares people.&lt;/P&gt;
&lt;P&gt;I was fortunate enough to be given my dream role every night: not just a zombie, but the very first big scare on the trail. As victims came down the trail and rounded a slight corner they saw a fog-shrouded graveyard full of glow-in-the-dark tombstones, and in the distance, a vampire-infested haunted house. They would stop to read the witty saying on the tombstone and then I, in full zombie makeup, lurched out from behind it with a big old RAAARGH! &lt;/P&gt;
&lt;P&gt;That worked pretty well, but my co-zombies and I did a lot of fine-tuning as we figured out what scared people and what didn't. We had over 6000 opportunities over the week, so eventually we got it down to a science. As a public service to future aspiring zombies, here's some stuff that we learned works:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Listen &lt;/STRONG&gt;to the people coming down the trail. Their conversations will often tell you which people you should go after for maximum scare potential. If someone says &lt;EM&gt;"I'm totally scared of things jumping out at me&lt;/EM&gt;", jump out at them with a huge RAAARGH! If they say &lt;EM&gt;"I'm totally scared of things creeping up on me"&lt;/EM&gt;, creep up on them and then right in their ear give a little groan. If they say that they're scared of things following them, follow them. And so on. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;I probably heard fifty times a night "you go first, I'm too scared, no, I don't want to be &lt;EM&gt;last&lt;/EM&gt; either" as a group was rounding the corner. If you've got a large party coming down the trail &lt;STRONG&gt;always go for the middle&lt;/STRONG&gt;; that's where the most easily scared people are. Also, that way the people in front get scared from behind, the people in the middle get scared from the side, and the people in back get scared from the front. If you go for either end then the people at the other end don't get scared at all. Moreover, the women in the center often link arms. This means that when one of them leaps backwards and screams, they all fall backwards, which is hilarious. (Try not to laugh, it ruins the illusion.) 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;If you can scare people into running one way, &lt;STRONG&gt;have a second zombie in the woods&lt;/STRONG&gt; on the other side to scare them&amp;nbsp;again. Do this as long as it works. We had one little girl, maybe eleven years old who I scared, she screamed and took off down the trail directly towards the other zombie, who jumped out, scared her, she ran back towards me, I jumped out &lt;EM&gt;again&lt;/EM&gt;, she ran the other way, and finally one of the brides of Dracula jumped out from behind yet a third tombstone – it was like playing pinball. And believe me, to freaked out people two zombies and a bride might as well be a horde. You feel totally surrounded. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;Creeping up on people&lt;/STRONG&gt; is a harder and more dangerous – sometimes people will instinctively swing at you when they are startled, though this didn't happen to me. But it can be &lt;EM&gt;very&lt;/EM&gt; effective. If someone stopped to read the tombstones I would try to very quietly get right beside them so that when they turned to look up and continue the trail, I'd be about six inches from their face. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Making a brief hissing or groaning or gurgling noise to &lt;STRONG&gt;get people creeped out before the RAAARGH&lt;/STRONG&gt;! can be highly effective but you've got to get the timing just right. Too long and you'll telegraph your location, too short and it gets lost in the RAAARGH! 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;You can't startle everyone&lt;/STRONG&gt;, they're just coming too fast. We had 2100+ people through in four hours one night.&amp;nbsp;Remember that&amp;nbsp;there are 40 other volunteers down the trail who will try to startle them, and some will succeed. If you miss a chance to startle a group, you can still creep them out while you lurch back to your hiding place. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;Sniff at people&lt;/STRONG&gt;. It is incredibly creepy to have someone smell you, particularly if they then act hungry. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;If you can &lt;STRONG&gt;scream like the nazgul&lt;/STRONG&gt; from the TLotR movie, that really works but you get hoarse after four hours of it. (I cannot but one of my co-zombies had a wicked scream.) 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;Always stay in character&lt;/STRONG&gt;. One time I jumped out and scared a woman so badly that she dropped the cell phone she was (inexplicably) holding and took off at a run. Fortunately she ran right into the vampire house, so while the brides and Dracula were freaking her out even more I grabbed the phone, opened it up so that it would light up, and ran around to the exit of the vampire house. But you can't just say "hey lady, you dropped your cell phone, here you go", you've got to lurch towards her, groaning, and hand her the cell phone like a zombie would. Similarly, if you see your friends then&amp;nbsp;stay in character, you can chat with them later. Breaking character ruins it for everyone else. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Speaking of which, if you are an audience member in a haunted house, &lt;STRONG&gt;do not talk on your freakin' cell phone!&lt;/STRONG&gt; You're ruining it for everyone else. You wouldn't do that in a movie or a play, so don't do it in a haunted house either. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Teaming up two scary zombies works well, but &lt;STRONG&gt;teaming up a scary monster with a speaking part&lt;/STRONG&gt; can also be very effective. In Leah's area she was the little old hillbilly lady on the porch who would engage the victims with humour, and then as soon as they were distracted, her "son", the six-foot-eight guy with the pig's head and the chainsaw would jump out of the shack.&amp;nbsp;This is particularly effective against teenagers who are sassing back to the old lady: they are maximally off their guard. 
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Finally, a couple things about difficult customers.&amp;nbsp; First, if a customer really, truly is not having a good time, just let them go. Sometimes we got small children, teenagers and even adults who were so scared that they stopped having a good time and had to leave.&amp;nbsp;One girl, maybe thirteen years old, just stood still and started yelling "IWANTMYMOMIWANTMYMOM" over and over again, would not move, and had to be removed by security.&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Second, if an idiot teenage boy sees you hide and announces where you are, or you have a "tour guide" who has been on the trail before telling everyone where the scares are then &lt;STRONG&gt;they've already ruined it for themselves&lt;/STRONG&gt; and their entire groups. There is &lt;EM&gt;nothing&lt;/EM&gt; you can do to make it scary at that point, so just &lt;STRONG&gt;ignore them&lt;/STRONG&gt;, keep hiding, wait for the group to go by, and get the next group. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Anyone else have any suggestions for aspiring zombies?&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=488743" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Non-computer/default.aspx">Non-computer</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Haunted+House/default.aspx">Haunted House</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Zombies/default.aspx">Zombies</category></item><item><title>Through the Looking Glass</title><link>http://blogs.msdn.com/ericlippert/archive/2005/08/22/through-the-looking-glass.aspx</link><pubDate>Mon, 22 Aug 2005 23:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:454209</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>17</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/454209.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=454209</wfw:commentRss><description>&lt;FONT face="lucida sans unicode" color=purple size=2&gt;
&lt;P&gt;I'm back, I'm married, we had a fabulous time, and now I'm setting up new machines and figuring out what the heck I'm doing on the C# team. Today, we'll get back into it with some non-tech fun.&lt;/P&gt;
&lt;P&gt;A regular flat mirror seems like it ought to be perfectly symmetrical in its operations. So why is it that mirrors produce an image which reverse left and right, but not, say, top and bottom?&amp;nbsp; (A concave mirror, like the inside of a spoon, reverses top and bottom, but let’s worry about only flat mirrors for the duration of this article.) How does the mirror know which way is left-right?&lt;/P&gt;
&lt;P&gt;Think about that for a while before you read on. See if you can figure it out for yourself.&lt;/P&gt;
&lt;P&gt;Stuck?&amp;nbsp; Try this.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Get a mirror.&amp;nbsp; 
&lt;LI&gt;Stand in the place where you live. 
&lt;LI&gt;Now face &lt;STRONG&gt;north&lt;/STRONG&gt;. 
&lt;LI&gt;Think about direction.&amp;nbsp; Wonder why you haven’t before. 
&lt;LI&gt;Hold the mirror out in front of you with your &lt;STRONG&gt;left&lt;/STRONG&gt; hand. 
&lt;LI&gt;Point &lt;STRONG&gt;east&lt;/STRONG&gt; with your &lt;STRONG&gt;right&lt;/STRONG&gt; hand. 
&lt;LI&gt;The “person in the mirror” is still pointing &lt;STRONG&gt;east&lt;/STRONG&gt;, and towards the &lt;STRONG&gt;right&lt;/STRONG&gt; side of the mirror (from your perspective), but doing so with their &lt;STRONG&gt;left&lt;/STRONG&gt; hand while facing &lt;STRONG&gt;south&lt;/STRONG&gt;.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Wait a minute.&amp;nbsp; The mirror not only produces an image which reverses left and right but not up and down; apparently it also reverses north and south but not east and west! &lt;/P&gt;
&lt;P&gt;It’s more productive to think of a mirror as actually producing an image which reverses &lt;STRONG&gt;front and back&lt;/STRONG&gt;. If you’re facing north then “front and back” is the same as “north and south”.&amp;nbsp;If the mirror is on the floor&amp;nbsp;then “front and back” is the same as “up and down”. Note that if you took a movie of someone and flipped the movie film front-back when you showed it, you’d get the same effect.&lt;/P&gt;
&lt;P&gt;But why then do we all think of mirrors as reversing left and right, if in fact they reverse front-back?&amp;nbsp; Psychologically, humans see a front-back-reversed human as a left-right reversed human.&amp;nbsp; That image of a south-facing person smiling back at you is not an image of a &lt;EM&gt;human being&lt;/EM&gt; at all. Their DNA spirals the wrong way. All their body fat is made out of indigestible Olestra.&amp;nbsp; Their heart is on the wrong side of the body. If we could somehow create a real being who produced exactly that image, down to the front-back-reversed internal structure, there’s no way that they could produce viable offspring with a non-reversed human.&lt;/P&gt;
&lt;P&gt;But none of these is apparent at a glance. Since humans have almost perfect left-right symmetry it is extremely easy to interpret an image of a back-front-reversed human as a left-right reversed human. After all, if you were trying to act to look like the person in the mirror, that’s what you’d do – simply reverse your left and right behaviour.&amp;nbsp;You decide what is “slippable” and what isn’t.&amp;nbsp; If you are trying to look like the image in the mirror looks, you’d ignore all that stuff about your DNA and internal organs and reverse left and right, because that happens to produce the image that looks most similar. If humans had different symmetries then mirrors would not appear to reverse left-right at all, because our psychology would be different.&lt;/P&gt;
&lt;P&gt;Imagine a race of super-intelligent fishes that look like eels with a perfectly circular cross-section.&amp;nbsp; Our fishes have a blue fin on one side, a red fin on the other side, one eye in the very front of their face. These eely fishes can swim with their fins rotated in any direction they choose.&amp;nbsp; That’s a weird looking fish, but bear with me. Such a fish looking in a mirror would probably see the back-front reversed image as being not left-right reversed – because, what’s left-right to a symmetrical fish? – but rather as &lt;STRONG&gt;rotated 180 degrees&lt;/STRONG&gt;.&amp;nbsp; That’s what a fish would have to do in order to imitate the fish in the mirror.&amp;nbsp; The super-intelligent fish version of this blog entry would be “why do mirrors rotate images?”&lt;/P&gt;
&lt;P&gt;Similarly we could come up with bizarre creatures whose various lines of symmetry would cause them to see mirror images as top-bottom reversals. Even more bizarre, suppose human males and females were more or less exactly the same in their outward physical characteristics, except that men had both arms on the right side of their body, and women had both arms on the left side of their body.&amp;nbsp; We’d then be asking why mirrors change sex! And who knows what &lt;A href="http://www.memory-alpha.org/en/wiki/Let_That_Be_Your_Last_Battlefield"&gt;inhabitants of the planet Cheron&lt;/A&gt; would think?&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=454209" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Science/default.aspx">Science</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Non-computer/default.aspx">Non-computer</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Mirrors/default.aspx">Mirrors</category></item><item><title>What I Did On My Summer Vacation</title><link>http://blogs.msdn.com/ericlippert/archive/2004/07/12/what-i-did-on-my-summer-vacation.aspx</link><pubDate>Tue, 13 Jul 2004 01:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:181265</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>29</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/181265.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=181265</wfw:commentRss><description>&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;I'm back, and I've almost made it through the 525 not-automatically-sorted email messages, caught up on my blog reading, and so on.&amp;nbsp; There are a number of interesting technical questions in my backlog that I'll start getting to later this week once I dig myself out of the pile of bug reports that accumulated during my absence.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Until then, again, this was just too precious to not share.&amp;nbsp; If you only want technical stuff, stop reading now.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;One of the highlights of my twice-annual return to my ancestral home is spending time with my cousins.&amp;nbsp; My five-year-old cousin Zephy takes great delight in taunting me.&amp;nbsp; Every year she teaches the small army of munchkins that she hangs out with some ditty which is to be shouted repeatedly whenever I come into view.&amp;nbsp; This year it was "&lt;B&gt;&lt;SPAN&gt;Eric is evil!&amp;nbsp; Eric is evil!&amp;nbsp; Eeeeevil!"&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp; It's quite the experience, believe me.&amp;nbsp; I suspect that the root of this behaviour has something to do with the fact that I once convinced her that Lake Huron is chock-full of &lt;B&gt;&lt;SPAN&gt;Great Canadian Beaver-Sharks&lt;/SPAN&gt;&lt;/B&gt; -- giant buck-toothed, flat-tailed&amp;nbsp;sharks which subsist on a diet of driftwood, canoe paddles, wooden sailboats and little girls -- and then repeatedly threatened to throw her in the lake.&amp;nbsp;In retrospect, maybe that wasn't such a good idea.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Her older sister Victoria does not believe in Beaver-Sharks.&amp;nbsp; At one point she and her friend Kelsey ran up to me (ten year old girls run &lt;I&gt;&lt;SPAN&gt;everywhere&lt;/SPAN&gt;&lt;/I&gt;) to ask if they could borrow my pair of kayaks.&amp;nbsp; "Sure.&amp;nbsp; You can always borrow the kayaks even if I'm not around as long as you tell a responsible adult that you're going out on the lake," I said.&amp;nbsp; Kelsey got a slightly worried look -- &lt;B&gt;&lt;SPAN&gt;"Is my mother a responsible adult?"&lt;/SPAN&gt;&lt;/B&gt; she deadpanned.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;For future reference: unless otherwise noted, &lt;B&gt;&lt;SPAN&gt;all mothers are responsible adults&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;And finally, Vic has a "mad crush" on a boy, who will remain unnamed.&amp;nbsp; She wasn't sure what to do about that, and since apparently &lt;A title=http://blogs.msdn.com/ericlippert/archive/2004/05/11/130128.aspx href="http://blogs.msdn.com/ericlippert/archive/2004/05/11/130128.aspx"&gt;I'm an internationally recognized expert on getting boys to like you&lt;/A&gt;, she asked my advice.&amp;nbsp; I wasn't sure what to say -- the first girl I ever had a mad crush on I ended up dating for seven years, which is probably atypical -- so I've started surveying every 8-12 year old girl that I meet as to what they do about mad crushes.&amp;nbsp; I met an eight-year-old girl named Heather at a barbecue over the weekend and asked her.&amp;nbsp; Her detailed off-the-cuff reply showed that she'd already put a lot of thought into this question, though she had not actually needed to test her theories yet.&amp;nbsp; Allow me to quote from memory:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;"There are two things you can do if you have a mad crush on a boy, you can ask him to propose marriage and if he won't, then beat him up, then send him to an island, then surround the island with huge rocks so that he can't escape, then send him Valentine's cards that say 'I HATE YOU!' but if he &lt;I&gt;&lt;SPAN&gt;does&lt;/SPAN&gt;&lt;/I&gt; propose marriage then you can kiss him and marry him and move into an apartment and have a baby and bake him a cake that says 'YOU ARE MY FAVOURITE BOYFRIEND' in the icing."&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Sounds like a good plan! Any current or former 8-12 girls out there who have additional advice for surviving a mad crush (who I suppose happen to also be interested in programming language design if you're reading my blog&amp;#8230;) please leave comments and I'll forward them on.&amp;nbsp; Run-on sentences are fine.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=181265" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Non-computer/default.aspx">Non-computer</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Best+Of+FAIC/default.aspx">Best Of FAIC</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Relationships/default.aspx">Relationships</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/vacation/default.aspx">vacation</category></item></channel></rss>