<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Generalities &amp; Details: Adventures in the High-tech Underbelly</title>
    <link>http://www.bluebytesoftware.com/blog/</link>
    <description>Joe Duffy's Weblog</description>
    <language>en-us</language>
    <copyright>Joe Duffy</copyright>
    <lastBuildDate>Mon, 18 Feb 2013 06:33:34 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.2</generator>
    <managingEditor>joe@bluebytesoftware.com</managingEditor>
    <webMaster>joe@bluebytesoftware.com</webMaster>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=31909f09-acd3-4b96-898d-e3541f11d63a</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,31909f09-acd3-4b96-898d-e3541f11d63a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I sincerely apologize that comments are disabled on my blog right now.
   </p>
        <p>
      I dislike one way conversations.
   </p>
        <p>
      However, it turns out that spammers have caught up to the technology my blog used
      circa 2010 to filter out nasty and wretched comments. I simply can't keep up with
      deleting them by hand any longer.
   </p>
        <p>
      I am, of course, always interested in your emails and feedback. Please feel free to
      shoot me a note at joedu AT microsoft DOT com if you are so inclined. I promise to
      read and respond.
   </p>
        <p>
      And I sincerely hope that within the next month I'll manage to upgrade my blog software.
      It seems like a daunting task for some reason, even though it is trivial in nature.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=31909f09-acd3-4b96-898d-e3541f11d63a" />
      </body>
      <title>Comments disabled ... sorry</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,31909f09-acd3-4b96-898d-e3541f11d63a.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2013/02/18/CommentsDisabledSorry.aspx</link>
      <pubDate>Mon, 18 Feb 2013 06:33:34 GMT</pubDate>
      <description>&lt;p&gt;
   I sincerely apologize that comments are disabled on my blog right now.
&lt;/p&gt;
&lt;p&gt;
   I dislike one way conversations.
&lt;/p&gt;
&lt;p&gt;
   However, it turns out that spammers have caught up to the technology my blog used
   circa 2010 to filter out nasty and wretched comments. I simply can't keep up with
   deleting them by hand any longer.
&lt;/p&gt;
&lt;p&gt;
   I am, of course, always interested in your emails and feedback. Please feel free to
   shoot me a note at joedu AT microsoft DOT com if you are so inclined. I promise to
   read and respond.
&lt;/p&gt;
&lt;p&gt;
   And I sincerely hope that within the next month I'll manage to upgrade my blog software.
   It seems like a daunting task for some reason, even though it is trivial in nature.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=31909f09-acd3-4b96-898d-e3541f11d63a" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=9113a9aa-d98b-446c-b9ae-63d1926d2a27</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,9113a9aa-d98b-446c-b9ae-63d1926d2a27.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <title>Work fun</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,9113a9aa-d98b-446c-b9ae-63d1926d2a27.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2012/07/18/WorkFun.aspx</link>
      <pubDate>Wed, 18 Jul 2012 00:49:08 GMT</pubDate>
      <description>&lt;p&gt;
   It's been quite some time since I blogged.
&lt;/p&gt;
&lt;p&gt;
   The reason is simple, as always: I'm having the time of my life at work.
&lt;/p&gt;
&lt;p&gt;
   I will try to do better blogwise in the coming months. But in the meantime ...
&lt;/p&gt;
&lt;p&gt;
   If you'd like to join me, &lt;a href="http://blog.adamnathan.net/"&gt;Adam&lt;/a&gt;, and &lt;a href="http://blogs.msdn.com/b/kcwalina/"&gt;Krzysztof&lt;/a&gt; in
   our quest to build the best APIs and developer platform known to mankind, please &lt;a href="mailto:joedu@microsoft.com"&gt;shoot
   me an email with you resume&lt;/a&gt;. Or just &lt;a href="https://careers.microsoft.com/jobdetails.aspx?ss=&amp;pg=0&amp;so=&amp;rw=1&amp;jid=74196&amp;jlang=EN"&gt;apply&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   In short, you could be having the time of your life too. Why wait?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=9113a9aa-d98b-446c-b9ae-63d1926d2a27" /&gt;</description>
      <category>Miscellaneous;Technology</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=d3af3274-061f-4cb4-889f-fa92bf6792dc</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,d3af3274-061f-4cb4-889f-fa92bf6792dc.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I have several positions open on my team here at Microsoft.
   </p>
        <p>
      My team's responsibility spans multiple aspects of a research operating system’s programming
      model. The three main areas are concurrency, languages, and frameworks. When I say
      concurrency, I mean things like asynchrony and message passing, data and task parallelism,
      distributed parallelism, runtime scheduling and resource management, and heterogeneity
      and GPGPU. When I say languages, I mean type systems, mostly-functional programming,
      verified safe concurrency, and both front- and back-end compilation. And when I say
      frameworks, I mean virtually anything you could imagine wanting out of a platform
      framework: all things XML, data interoperability (database, web services, etc.), collections,
      transactions, multimaster synchronization, and even low level things, like regex,
      numerics, and globalization.
   </p>
        <p>
      Our team is 100% developers, and we have an “everybody codes, everybody loves to code”
      culture. Even managers are expected to spend a significant amount of time prolifically
      writing code.
   </p>
        <p>
      All of these components are new and built from the ground up. So self-drive and an
      ability to have a vision and make it happen are incredibly important.
   </p>
        <p>
      We are always happy to hire great, hard-working people, regardless of years of experience.
      If you’re extremely strong in one or more of the abovementioned areas, more of a generalist,
      are an amazing coder, or all of the above, you’d fit in perfectly. This is the most
      amazing team of people I’ve ever worked with. If you are interested, please email
      your resume to me at joedu AT microsoft DOT com.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=d3af3274-061f-4cb4-889f-fa92bf6792dc" />
      </body>
      <title>We are hiring</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,d3af3274-061f-4cb4-889f-fa92bf6792dc.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2010/09/18/WeAreHiring.aspx</link>
      <pubDate>Sat, 18 Sep 2010 18:42:27 GMT</pubDate>
      <description>&lt;p&gt;
   I have several positions open on my team here at Microsoft.
&lt;/p&gt;
&lt;p&gt;
   My team's responsibility spans multiple aspects of a research operating system’s programming
   model. The three main areas are concurrency, languages, and frameworks. When I say
   concurrency, I mean things like asynchrony and message passing, data and task parallelism,
   distributed parallelism, runtime scheduling and resource management, and heterogeneity
   and GPGPU. When I say languages, I mean type systems, mostly-functional programming,
   verified safe concurrency, and both front- and back-end compilation. And when I say
   frameworks, I mean virtually anything you could imagine wanting out of a platform
   framework: all things XML, data interoperability (database, web services, etc.), collections,
   transactions, multimaster synchronization, and even low level things, like regex,
   numerics, and globalization.
&lt;/p&gt;
&lt;p&gt;
   Our team is 100% developers, and we have an “everybody codes, everybody loves to code”
   culture. Even managers are expected to spend a significant amount of time prolifically
   writing code.
&lt;/p&gt;
&lt;p&gt;
   All of these components are new and built from the ground up. So self-drive and an
   ability to have a vision and make it happen are incredibly important.
&lt;/p&gt;
&lt;p&gt;
   We are always happy to hire great, hard-working people, regardless of years of experience.
   If you’re extremely strong in one or more of the abovementioned areas, more of a generalist,
   are an amazing coder, or all of the above, you’d fit in perfectly. This is the most
   amazing team of people I’ve ever worked with. If you are interested, please email
   your resume to me at joedu AT microsoft DOT com.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=d3af3274-061f-4cb4-889f-fa92bf6792dc" /&gt;</description>
      <category>Miscellaneous;Technology</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=b18b1acb-e992-49e7-a7a8-c7ce146006f0</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,b18b1acb-e992-49e7-a7a8-c7ce146006f0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      My team is hiring.  For example:
   </p>
        <p>
          <a href="https://careers.microsoft.com/JobDetails.aspx?jid=7594&amp;lang=en">https://careers.microsoft.com/JobDetails.aspx?jid=7594&amp;lang=en</a>
        </p>
        <p>
      As the job description says, we are focused mainly concurrency &amp; parallelism
      at each layer of the system: kernel-mode, user-mode, frameworks, languages, compilers,
      ...
   </p>
        <p>
      The sky is the limit and nothing is off the table.  I've never had so much fun
      in my life as I am having right now, and couldn't imagine a better <a href="http://blogs.msdn.com/cbrumme/">g</a><a href="http://en.wikipedia.org/wiki/Pavel_Curtis">r</a><a href="http://www.informatik.uni-trier.de/~ley/db/indices/a-tree/t/Tarditi:David.html">o</a><a href="http://srl.cs.jhu.edu/~shap/">u</a><a href="http://steensgaard.org/bjarne/">p</a> of <a href="http://texteditors.org/cgi-bin/wiki.pl?action=browse&amp;diff=1&amp;id=TurboText&amp;diffrevision=5">p</a><a href="http://blog.robjsoftware.org/">e</a><a href="http://www.ps.uni-sb.de/~kornstae/">o</a><a href="http://blogs.msdn.com/danlehen/">p</a><a href="http://blogs.msdn.com/slavao/">l</a><a href="http://www.informatik.uni-trier.de/~ley/db/indices/a-tree/t/Tribble:Eric_Dean.html">e</a> to
      do it with.  I think this is what NT <a href="http://www.amazon.com/Show-Stopper-Breakneck-Generation-Microsoft/dp/0029356717">must
      have felt like</a>.
   </p>
        <p>
      If you're interested, email me at joedu AT microsoft DOT com, or apply via that link.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=b18b1acb-e992-49e7-a7a8-c7ce146006f0" />
      </body>
      <title>Jobs</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,b18b1acb-e992-49e7-a7a8-c7ce146006f0.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2009/10/31/Jobs.aspx</link>
      <pubDate>Sat, 31 Oct 2009 21:02:15 GMT</pubDate>
      <description>&lt;p&gt;
   My team is hiring.&amp;nbsp; For example:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="https://careers.microsoft.com/JobDetails.aspx?jid=7594&amp;amp;lang=en"&gt;https://careers.microsoft.com/JobDetails.aspx?jid=7594&amp;amp;lang=en&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   As the job description says,&amp;nbsp;we are focused&amp;nbsp;mainly concurrency &amp;amp; parallelism
   at each layer of the system: kernel-mode, user-mode, frameworks, languages, compilers,
   ...
&lt;/p&gt;
&lt;p&gt;
   The sky is the limit and nothing is off the table.&amp;nbsp; I've never had so much fun
   in my life as I am having right now, and couldn't imagine a better &lt;a href="http://blogs.msdn.com/cbrumme/"&gt;g&lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/Pavel_Curtis"&gt;r&lt;/a&gt;&lt;a href="http://www.informatik.uni-trier.de/~ley/db/indices/a-tree/t/Tarditi:David.html"&gt;o&lt;/a&gt;&lt;a href="http://srl.cs.jhu.edu/~shap/"&gt;u&lt;/a&gt;&lt;a href="http://steensgaard.org/bjarne/"&gt;p&lt;/a&gt; of &lt;a href="http://texteditors.org/cgi-bin/wiki.pl?action=browse&amp;amp;diff=1&amp;amp;id=TurboText&amp;amp;diffrevision=5"&gt;p&lt;/a&gt;&lt;a href="http://blog.robjsoftware.org/"&gt;e&lt;/a&gt;&lt;a href="http://www.ps.uni-sb.de/~kornstae/"&gt;o&lt;/a&gt;&lt;a href="http://blogs.msdn.com/danlehen/"&gt;p&lt;/a&gt;&lt;a href="http://blogs.msdn.com/slavao/"&gt;l&lt;/a&gt;&lt;a href="http://www.informatik.uni-trier.de/~ley/db/indices/a-tree/t/Tribble:Eric_Dean.html"&gt;e&lt;/a&gt; to
   do it with.&amp;nbsp; I think this is what NT &lt;a href="http://www.amazon.com/Show-Stopper-Breakneck-Generation-Microsoft/dp/0029356717"&gt;must
   have felt like&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   If you're interested, email me at joedu AT microsoft DOT com, or apply via that link.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=b18b1acb-e992-49e7-a7a8-c7ce146006f0" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=07d734a8-245e-4b83-9295-9fdc18081dc8</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,07d734a8-245e-4b83-9295-9fdc18081dc8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      A developer from the Parallel Extensions team, <a href="http://www.igoro.com/">Igor
      Ostrovsky</a>, recently whipped together a really neat Silverlight game.  It's
      called <a href="http://www.robozzle.com/">RoboZZle</a>, and he calls it a "social
      puzzle game":
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
      "RoboZZle is an online puzzle game that challenges players to program a robot to pick
      up all stars on a game board. The game mechanics are simple, yet allow for a wide
      variety of challenges that call for very different solution approaches." (from <a href="http://robozzle.com/blog/?p=3">the
      blog entry</a> introducing it.)
   </p>
        </blockquote>
        <p>
      The coolest feature of this game is that you win by programming.  And there's
      a whole community surrounding it, complete with forums, the ability to create your
      own games, a ranking system, its own blog and continuously updated news, etc. 
      Check it out.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=07d734a8-245e-4b83-9295-9fdc18081dc8" />
      </body>
      <title>RoboZZle: a new social puzzle game</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,07d734a8-245e-4b83-9295-9fdc18081dc8.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2009/03/06/RoboZZleANewSocialPuzzleGame.aspx</link>
      <pubDate>Fri, 06 Mar 2009 23:36:36 GMT</pubDate>
      <description>&lt;p&gt;
   A developer from the Parallel Extensions team, &lt;a href="http://www.igoro.com/"&gt;Igor
   Ostrovsky&lt;/a&gt;, recently whipped together a really neat Silverlight game.&amp;nbsp; It's
   called &lt;a href="http://www.robozzle.com/"&gt;RoboZZle&lt;/a&gt;, and he calls it a "social
   puzzle game":
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   "RoboZZle is an online puzzle game that challenges players to program a robot to pick
   up all stars on a game board. The game mechanics are simple, yet allow for a wide
   variety of challenges that call for very different solution approaches." (from &lt;a href="http://robozzle.com/blog/?p=3"&gt;the
   blog entry&lt;/a&gt; introducing it.)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   The coolest feature of this game is that you win by programming.&amp;nbsp; And there's
   a whole community surrounding it, complete with forums, the ability to create your
   own games, a ranking system, its own blog and continuously updated news, etc.&amp;nbsp;
   Check it out.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=07d734a8-245e-4b83-9295-9fdc18081dc8" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=f9c31afc-bd38-482f-9eb3-cfd04fe15f97</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,f9c31afc-bd38-482f-9eb3-cfd04fe15f97.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I just returned from TechEd Australia, which was a lot of fun.
   </p>
        <p>
      I have a fair number of additional speaking engagements coming up:
   </p>
        <ul>
          <li>
         JAOO in Aarhus, Denmark (next week) [<a href="http://jaoo.dk/conference/">http://jaoo.dk/conference/</a>]:
         Parallel Extensions</li>
          <li>
         PDC in LA (precon on Oct 26) [<a href="http://www.microsoftpdc.com/">http://www.microsoftpdc.com/</a>]:
         Concurrency pre-con</li>
          <li>
         TechEd EMEA in Barcelona (Nov 10-14) [<a href="http://www.microsoft.com/emea/teched2008/">http://www.microsoft.com/emea/teched2008/</a>]:
         Parallel Extensions</li>
          <li>
         QCON in San Francisco, (Nov 19-21) [<a href="http://qconsf.com/sf2008/conference/">http://qconsf.com/sf2008/conference/</a>]:
         Functional programming and parallelism</li>
        </ul>
        <p>
      As of the PDC <a href="http://www.bluebytesoftware.com/books/winconc/winconc_book_resources.html">the
      book</a> will also be readily available.  Wahoo!
   </p>
        <p>
      If you'll be at any of the conferences and want to meet up, please drop me a
      line.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=f9c31afc-bd38-482f-9eb3-cfd04fe15f97" />
      </body>
      <title>Upcoming talks</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,f9c31afc-bd38-482f-9eb3-cfd04fe15f97.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2008/09/26/UpcomingTalks.aspx</link>
      <pubDate>Fri, 26 Sep 2008 19:12:01 GMT</pubDate>
      <description>&lt;p&gt;
   I just returned from TechEd Australia, which was a lot of fun.
&lt;/p&gt;
&lt;p&gt;
   I have a fair number of additional speaking engagements coming up:
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      JAOO in Aarhus, Denmark (next week) [&lt;a href="http://jaoo.dk/conference/"&gt;http://jaoo.dk/conference/&lt;/a&gt;]:
      Parallel Extensions&lt;/li&gt;
   &lt;li&gt;
      PDC in LA (precon on Oct 26) [&lt;a href="http://www.microsoftpdc.com/"&gt;http://www.microsoftpdc.com/&lt;/a&gt;]:
      Concurrency pre-con&lt;/li&gt;
   &lt;li&gt;
      TechEd EMEA in Barcelona (Nov 10-14) [&lt;a href="http://www.microsoft.com/emea/teched2008/"&gt;http://www.microsoft.com/emea/teched2008/&lt;/a&gt;]:
      Parallel Extensions&lt;/li&gt;
   &lt;li&gt;
      QCON in San Francisco, (Nov 19-21) [&lt;a href="http://qconsf.com/sf2008/conference/"&gt;http://qconsf.com/sf2008/conference/&lt;/a&gt;]:
      Functional programming and parallelism&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   As of the PDC &lt;a href="http://www.bluebytesoftware.com/books/winconc/winconc_book_resources.html"&gt;the
   book&lt;/a&gt; will also be readily available.&amp;nbsp; Wahoo!
&lt;/p&gt;
&lt;p&gt;
   If you'll be at any of the conferences and&amp;nbsp;want to meet up, please drop me a
   line.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=f9c31afc-bd38-482f-9eb3-cfd04fe15f97" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=3a50fe54-2633-41d1-abb3-657211719a5c</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,3a50fe54-2633-41d1-abb3-657211719a5c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I have two new positions open on my team.
   </p>
        <ol>
          <li>
            <a href="http://members.microsoft.com/careers/search/details.aspx?JobID=955B4B91-F863-492C-B839-63964E7966B9">http://members.microsoft.com/careers/search/details.aspx?JobID=955B4B91-F863-492C-B839-63964E7966B9</a>
          </li>
          <li>
            <a href="http://members.microsoft.com/careers/search/details.aspx?JobID=6B22807F-71BF-4939-ACB4-EC380106AFBF">http://members.microsoft.com/careers/search/details.aspx?JobID=6B22807F-71BF-4939-ACB4-EC380106AFBF</a>
          </li>
        </ol>
        <p>
      If you want to shape the future of the runtimes, languages, and libraries that millions
      of developers use every day, this is a perfect opportunity.
   </p>
        <p>
      And you'll get to <a href="http://www.microsoft.com/presspass/exec/de/Callahan/default.mspx">work</a><a href="http://www.microsoft.com/presspass/exec/techfellow/Smith/default.mspx">with</a><a href="http://www.microsoft.com/presspass/exec/de/Lucco/default.mspx">some</a><a href="http://www.microsoft.com/presspass/exec/techfellow/hejlsberg/default.mspx">amazing</a><a href="http://channel9.msdn.com/shows/Going+Deep/Inside-Parallel-Extensions-for-NET-2008-CTP-Part-1/">people</a> too.
   </p>
        <p>
      You can submit your resume on the website or just email me at joedu @ you-know-where
      dot com.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=3a50fe54-2633-41d1-abb3-657211719a5c" />
      </body>
      <title>New parallel computing jobs</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,3a50fe54-2633-41d1-abb3-657211719a5c.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2008/07/30/NewParallelComputingJobs.aspx</link>
      <pubDate>Wed, 30 Jul 2008 20:46:39 GMT</pubDate>
      <description>&lt;p&gt;
   I have two new positions open on my team.
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      &lt;a href="http://members.microsoft.com/careers/search/details.aspx?JobID=955B4B91-F863-492C-B839-63964E7966B9"&gt;http://members.microsoft.com/careers/search/details.aspx?JobID=955B4B91-F863-492C-B839-63964E7966B9&lt;/a&gt; 
   &lt;li&gt;
      &lt;a href="http://members.microsoft.com/careers/search/details.aspx?JobID=6B22807F-71BF-4939-ACB4-EC380106AFBF"&gt;http://members.microsoft.com/careers/search/details.aspx?JobID=6B22807F-71BF-4939-ACB4-EC380106AFBF&lt;/a&gt;
   &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   If you want to shape the future of the runtimes, languages, and libraries that millions
   of developers use every day, this is a perfect opportunity.
&lt;/p&gt;
&lt;p&gt;
   And you'll get to &lt;a href="http://www.microsoft.com/presspass/exec/de/Callahan/default.mspx"&gt;work&lt;/a&gt; &lt;a href="http://www.microsoft.com/presspass/exec/techfellow/Smith/default.mspx"&gt;with&lt;/a&gt; &lt;a href="http://www.microsoft.com/presspass/exec/de/Lucco/default.mspx"&gt;some&lt;/a&gt; &lt;a href="http://www.microsoft.com/presspass/exec/techfellow/hejlsberg/default.mspx"&gt;amazing&lt;/a&gt; &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Inside-Parallel-Extensions-for-NET-2008-CTP-Part-1/"&gt;people&lt;/a&gt; too.
&lt;/p&gt;
&lt;p&gt;
   You can submit your resume on the website or just email me at joedu @ you-know-where
   dot com.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=3a50fe54-2633-41d1-abb3-657211719a5c" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=a24857cc-3c28-48be-aeac-5d092783acda</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,a24857cc-3c28-48be-aeac-5d092783acda.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I've been very remiss with blogging lately.  This was mostly due to travel
      (5 weeks out of the past 2 months), but also because I'm focused intensely
      on <a href="http://www.bluebytesoftware.com/books/winconc/winconc_book_resources.html">the
      book</a>, and have been super busy working on <a href="http://msdn.microsoft.com/concurrency/">Parallel
      Extensions</a>: <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;displaylang=en">the
      December CTP</a>, <a href="http://www.bluebytesoftware.com/blog/2007/07/21/WantANewJob.aspx">hiring
      for our team</a>, planning what we do in the next year, designing stuff, implementing
      stuff, ... it's been a lot of fun.  I've also been trying to learn classical
      guitar after 15 years of playing electric and some acoustic (metal, rock, blues). 
      It's more challenging than I anticipated... I guess I should have <a href="http://en.wikipedia.org/wiki/Andr%C3%A9s_Segovia">started
      when I was six</a>.
   </p>
        <p>
      Somewhere in there, I recorded an episode of .NET Rocks with Carl and Richard about
      Parallel Extensions: <a href="http://www.dotnetrocks.com/default.aspx?showNum=301">check
      it out</a>.  I haven't listened to it yet, but I distinctly remember having a
      lot of fun.  When the hour was up, I couldn't believe how quickly the time had
      passed.
   </p>
        <p>
      Happy New Year, everybody.  I promise to blog more in the coming months. 
      Famous last words, eh?  ;)
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=a24857cc-3c28-48be-aeac-5d092783acda" />
      </body>
      <title>Happy New Year &amp; .NET Rocks!</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,a24857cc-3c28-48be-aeac-5d092783acda.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2008/01/02/HappyNewYearNETRocks.aspx</link>
      <pubDate>Wed, 02 Jan 2008 18:54:04 GMT</pubDate>
      <description>&lt;p&gt;
   I've been very remiss with blogging lately.&amp;nbsp; This was&amp;nbsp;mostly due to travel
   (5 weeks&amp;nbsp;out of&amp;nbsp;the past 2 months), but also because I'm focused intensely
   on &lt;a href="http://www.bluebytesoftware.com/books/winconc/winconc_book_resources.html"&gt;the
   book&lt;/a&gt;, and have been super busy working on &lt;a href="http://msdn.microsoft.com/concurrency/"&gt;Parallel
   Extensions&lt;/a&gt;: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;amp;displaylang=en"&gt;the
   December CTP&lt;/a&gt;, &lt;a href="http://www.bluebytesoftware.com/blog/2007/07/21/WantANewJob.aspx"&gt;hiring
   for our team&lt;/a&gt;, planning what we do in the next year, designing stuff, implementing
   stuff, ... it's been a lot of fun.&amp;nbsp; I've also been trying to learn classical
   guitar after 15 years of playing electric and some acoustic&amp;nbsp;(metal, rock, blues).&amp;nbsp;
   It's more challenging than I anticipated... I guess I should have &lt;a href="http://en.wikipedia.org/wiki/Andr%C3%A9s_Segovia"&gt;started
   when I was six&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   Somewhere in there, I recorded an episode of .NET Rocks with Carl and Richard&amp;nbsp;about
   Parallel Extensions: &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=301"&gt;check
   it out&lt;/a&gt;.&amp;nbsp; I haven't listened to it yet, but I distinctly remember having a
   lot of fun.&amp;nbsp; When the hour was up, I couldn't believe how quickly the time had
   passed.
&lt;/p&gt;
&lt;p&gt;
   Happy New Year, everybody.&amp;nbsp; I promise to blog more in the coming months.&amp;nbsp;
   Famous last words, eh?&amp;nbsp; ;)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=a24857cc-3c28-48be-aeac-5d092783acda" /&gt;</description>
      <category>Miscellaneous;Technology</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=0d6bf371-87cb-44de-b529-67fae2231e1f</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,0d6bf371-87cb-44de-b529-67fae2231e1f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      My book, Concurrent Programming on Windows, is shaping up quite nicely.  (Given
      that I've been working on it for over a year now, I suppose it had better be!) 
      I’ve been surprised at the amazing level of anticipation and excitement from
      blog readers, coworkers, and Microsoft customers, and I really can’t wait for it to
      be finished.  Thanks for the patience so far.
   </p>
        <p>
      I feel like I’m almost on the home stretch.  End of September is my current target
      for completion.  It’s looking like it’ll contain 18 chapters, with 3 appendices,
      and will have a total running length of somewhere around 700 pages.  The reasons
      it has taken so long are numerous, but the primary reason is that the content is quite
      deep and detail-oriented—more than I expected at the start—and I’ve wanted to take
      the time to get it just right rather than cut corners.  My editors recently gave
      me feedback that there will be very little developmental editing required, since I’m
      (ahem) very, uhh, meticulous when it comes to writing.  And feedback from technical
      reviewers has been very positive as well.  I think both are good news.
   </p>
        <p>
      I’m confident the end product will be worth the wait.
   </p>
        <p>
      In the meantime, it seems that some of the abstractions I’ve built while writing the
      book will likely become part of a future release of the .NET Framework.  Keep
      an eye out on Channel9 for some additional details in a few months time.  Right
      now is a super exiting time to be in the field of computer science, that’s for sure... 
      Laissez les bons temps rouler!
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=0d6bf371-87cb-44de-b529-67fae2231e1f" />
      </body>
      <title>Book update</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,0d6bf371-87cb-44de-b529-67fae2231e1f.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/07/31/BookUpdate.aspx</link>
      <pubDate>Tue, 31 Jul 2007 06:37:08 GMT</pubDate>
      <description>&lt;p&gt;
   My book, Concurrent Programming on Windows, is shaping up quite nicely.&amp;nbsp; (Given
   that I've been working on it for over a year now, I suppose it had better be!)&amp;nbsp;
   I’ve been surprised at the&amp;nbsp;amazing level of anticipation and excitement from
   blog readers, coworkers, and Microsoft customers, and I really can’t wait for it to
   be finished.&amp;nbsp; Thanks for the patience so far.
&lt;/p&gt;
&lt;p&gt;
   I feel like I’m almost on the home stretch.&amp;nbsp; End of September is my current&amp;nbsp;target
   for completion.&amp;nbsp; It’s looking like it’ll contain 18 chapters, with 3 appendices,
   and will have a total running length of somewhere around 700 pages.&amp;nbsp; The reasons
   it has taken so long are numerous, but the primary reason is that the content is quite
   deep and detail-oriented—more than I expected at the start—and I’ve wanted to take
   the time to get it just right rather than cut corners.&amp;nbsp; My editors recently gave
   me feedback that there will be very little developmental editing required, since I’m
   (ahem) very, uhh, meticulous when it comes to writing.&amp;nbsp; And feedback from technical
   reviewers has been very positive as well.&amp;nbsp; I think both&amp;nbsp;are&amp;nbsp;good news.
&lt;/p&gt;
&lt;p&gt;
   I’m confident the end product will be worth the wait.
&lt;/p&gt;
&lt;p&gt;
   In the meantime, it seems that some of the abstractions I’ve built while writing the
   book will likely become part of a future release of the .NET Framework.&amp;nbsp; Keep
   an eye out on Channel9 for some additional details in a few months time.&amp;nbsp; Right
   now is a super exiting time to be in the field of computer science, that’s for sure...&amp;nbsp;
   Laissez les bons temps rouler!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=0d6bf371-87cb-44de-b529-67fae2231e1f" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=a35a1721-f2d6-40d4-a799-0c3e34fe01a9</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,a35a1721-f2d6-40d4-a799-0c3e34fe01a9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      It's coming to be that time of year at Microsoft: review time.  Actually, it's
      a multi-month process, but the first step involves assessing how well (or, in some
      cases, how poorly) you've done at certain tasks you set out to pursue a year prior. 
      Part of this process also involves discussing career aspirations with those who care
      to listen and help, which usually means your manager.
   </p>
        <p>
      So, Joe: What do you want to be when you grow up?  ;)
   </p>
        <p>
      Technical Fellow is the highest title at Microsoft awarded to technical contributors. 
      Some TFs manage people too, but most do not.  <a href="http://www.microsoft.com/presspass/exec/techfellow/">According
      to Microsoft.com, there are 18.</a>  Two people I work with closely, Anders Hejlsberg
      and Burton Smith, are TFs, and, until just recently, Jim Gray was also.  There
      are others I know and recognize, but I am not deeply familiar with all of them. 
      This lead me to wonder about the contributions and accomplishments the others have
      had throughout their careers, and so I did some reading.  Aside from causing
      a bit of depression and a realization that I have quite a long mountain to climb ahead
      of me, I ended up reading Butler Lampson’s immensely wonderful paper <a href="http://research.microsoft.com/Lampson/33-Hints/Abstract.html">“Hints
      for Computer System Design”</a> (<a href="http://research.microsoft.com/Lampson/33-Hints/WebPage.html">HTML</a>, <a href="http://research.microsoft.com/Lampson/33-Hints/Acrobat.pdf">PDF</a>).
   </p>
        <p>
      Yeah, yeah, I’m only 24 years behind the times.  In the paper, Butler provides
      many sound principles backed by concrete examples illustrating tradeoffs between
      functionality, speed, and fault-tolerance, drawn mostly from his experience building
      operating and distributed systems.  As I read it the paper, I was struck by how
      much his advice applies to building just about any kind of complicated software system,
      including frameworks.
   </p>
        <p>
      A few random teaser quotes:
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>“Designing a computer system is very different from designing an algorithm: </em>
          </p>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
            <p dir="ltr">
              <em>The external interface (that is, the requirement) is less precisely defined, more
      complex, and more subject to change.</em>
            </p>
            <p>
              <em>The system has much more internal structure, and hence many internal interfaces.</em>
            </p>
            <p>
              <em>The measure of success is much less clear.</em>
            </p>
          </blockquote>
          <p>
            <em>The designer usually finds himself floundering in a sea of possibilities, unclear
      about how one choice will limit his freedom to make other choices, or affect the size
      and performance of the entire system. There probably isn’t a ‘best’ way to build the
      system, or even any major part of it; much more important is to avoid choosing a terrible
      way, and to have clear division of responsibilities among the parts.”</em>
          </p>
          <p>
            <em>---</em>
          </p>
          <p>
            <em>“Do one thing at a time, and do it well. An interface should capture the minimum
      essentials of an abstraction. Don’t generalize; generalizations are generally wrong.” </em>
          </p>
          <p>
      ---
   </p>
          <p>
            <em>“Keep secrets of the implementation. Secrets are assumptions about an implementation
      that client programs are not allowed to make. In other words, they are things that
      can change; the interface defines the things that cannot change (without simultaneous
      changes to both implementation and client). Obviously, it is easier to program and
      modify a system if its parts make fewer assumptions about each other. On the other
      hand, the system may not be easier to design—it’s hard to design a good interface.”</em>
          </p>
          <p>
      ---
   </p>
          <p>
            <em>“One way to improve performance is to increase the number of assumptions that
      one part of a system makes about another; the additional assumptions often allow less
      work to be done, sometimes a lot less.”</em>
          </p>
          <p>
      ---
   </p>
          <p>
            <em>“When in doubt, use brute force. Especially as the cost of hardware declines,
      a straightforward, easily analyzed solution that requires a lot of special-purpose
      computing cycles is better than a complex, poorly characterized one that may work
      well if certain assumptions are satisfied.”</em>
          </p>
        </blockquote>
        <p>
      Needless to say, I strongly recommend the paper.  Now back to my career planning.
       I think I’ll start by writing a prolific and influential paper that will still
      be highly relevant, quoted, and recommended 24 years into the future.  Thankfully
      I'm still comparatively young so if I get started soon I just might be around
      to see the 24 year mark.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=a35a1721-f2d6-40d4-a799-0c3e34fe01a9" />
      </body>
      <title>Butler Lampson's "Hints for Computer System Design"</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,a35a1721-f2d6-40d4-a799-0c3e34fe01a9.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/06/09/ButlerLampsonsHintsForComputerSystemDesign.aspx</link>
      <pubDate>Sat, 09 Jun 2007 04:19:23 GMT</pubDate>
      <description>&lt;p&gt;
   It's coming to be that time of year at Microsoft: review time.&amp;nbsp; Actually, it's
   a multi-month process, but the first step involves assessing how well (or, in some
   cases, how poorly) you've done at certain tasks you set out to pursue a year prior.&amp;nbsp;
   Part of this process also involves discussing career aspirations with those who care
   to listen and help, which usually means your manager.
&lt;/p&gt;
&lt;p&gt;
   So, Joe: What do you want to be when you grow up?&amp;nbsp; ;)
&lt;/p&gt;
&lt;p&gt;
   Technical Fellow is the highest title at Microsoft awarded to technical contributors.&amp;nbsp;
   Some&amp;nbsp;TFs manage people too,&amp;nbsp;but most do not.&amp;nbsp; &lt;a href="http://www.microsoft.com/presspass/exec/techfellow/"&gt;According
   to Microsoft.com, there are 18.&lt;/a&gt;&amp;nbsp; Two people I work with closely, Anders Hejlsberg
   and Burton Smith, are TFs, and, until just recently, Jim Gray was also.&amp;nbsp; There
   are others I know and recognize,&amp;nbsp;but I am not deeply familiar with all of them.&amp;nbsp;
   This lead me to wonder about the contributions and accomplishments the others have
   had throughout their careers, and so I&amp;nbsp;did some reading.&amp;nbsp; Aside from causing
   a bit of depression and a realization that I have quite a long&amp;nbsp;mountain to climb&amp;nbsp;ahead
   of me, I&amp;nbsp;ended up reading&amp;nbsp;Butler Lampson’s immensely wonderful paper &lt;a href="http://research.microsoft.com/Lampson/33-Hints/Abstract.html"&gt;“Hints
   for Computer System Design”&lt;/a&gt; (&lt;a href="http://research.microsoft.com/Lampson/33-Hints/WebPage.html"&gt;HTML&lt;/a&gt;, &lt;a href="http://research.microsoft.com/Lampson/33-Hints/Acrobat.pdf"&gt;PDF&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
   Yeah, yeah, I’m only 24 years behind the times.&amp;nbsp; In the paper, Butler provides
   many sound principles backed by concrete examples&amp;nbsp;illustrating tradeoffs between
   functionality, speed, and fault-tolerance, drawn mostly from his experience building
   operating and distributed systems.&amp;nbsp; As I read it the paper, I was struck by how
   much his advice applies to building just about any kind of complicated software system,
   including frameworks.
&lt;/p&gt;
&lt;p&gt;
   A few random teaser quotes:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   &lt;em&gt;“Designing a computer system is very different from designing an algorithm: &lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p dir=ltr&gt;
   &lt;em&gt;The external interface (that is, the requirement) is less precisely defined, more
   complex, and more subject to change.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;The system has much more internal structure, and hence many internal interfaces.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;The measure of success is much less clear.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;em&gt;The designer usually finds himself floundering in a sea of possibilities, unclear
   about how one choice will limit his freedom to make other choices, or affect the size
   and performance of the entire system. There probably isn’t a ‘best’ way to build the
   system, or even any major part of it; much more important is to avoid choosing a terrible
   way, and to have clear division of responsibilities among the parts.”&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;---&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;“Do one thing at a time, and do it well. An interface should capture the minimum
   essentials of an abstraction. Don’t generalize; generalizations are generally wrong.” &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   ---
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;“Keep secrets of the implementation. Secrets are assumptions about an implementation
   that client programs are not allowed to make. In other words, they are things that
   can change; the interface defines the things that cannot change (without simultaneous
   changes to both implementation and client). Obviously, it is easier to program and
   modify a system if its parts make fewer assumptions about each other. On the other
   hand, the system may not be easier to design—it’s hard to design a good interface.”&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   ---
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;“One way to improve performance is to increase the number of assumptions that
   one part of a system makes about another; the additional assumptions often allow less
   work to be done, sometimes a lot less.”&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   ---
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;“When in doubt, use brute force. Especially as the cost of hardware declines,
   a straightforward, easily analyzed solution that requires a lot of special-purpose
   computing cycles is better than a complex, poorly characterized one that may work
   well if certain assumptions are satisfied.”&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Needless to say, I strongly recommend the paper.&amp;nbsp; Now back to my career planning.
   &amp;nbsp;I think I’ll start by writing a prolific and influential paper that will still
   be highly relevant, quoted, and recommended 24 years into the future.&amp;nbsp; Thankfully
   I'm still comparatively young so if I get started soon&amp;nbsp;I just might be around
   to see the 24 year mark.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=a35a1721-f2d6-40d4-a799-0c3e34fe01a9" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=66e10310-39f5-4735-bd24-2f4daeeb9214</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,66e10310-39f5-4735-bd24-2f4daeeb9214.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Long time readers will remember that I used to regularly blog about what I've been
      reading lately. (See <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,f93fcad8-d9e7-4edc-8ff9-36ae1520cc94.aspx">here</a>, <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,cf2c3c82-7161-4f47-a2ef-65d04d0b24fc.aspx">here</a>, <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,b3d395d6-6ae6-43a9-800c-5ff38bdf2c39.aspx">here</a>,
      and <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,ad453a9d-81b3-4494-a367-2b4b92cedd15.aspx">here</a> for
      examples.) Well, it's been close to a year since I've posted such a list. So here's
      a little bit of a clearance of my back- log. (And this isn't even everything! I guess
      I read a lot.) I've separated the list into geek and non-geek books.
   </p>
        <p>
          <b>Geek books:</b>
        </p>
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0316491977/bluebytesoftw-20/">The
               Soul of a New Machine</a> -- <i>Tracy Kidder</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0316491977.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  I'm only 16 years late on this one. This book is about DG's race to build a machine
                  to contend with DEC's VAX, and has some great story telling. It reads almost like
                  a fiction book, with great character building, a nice storyline running through the
                  book, etc. The geek factor is low on this one, though I suppose it _is_ a book about
                  a bunch of geeks building hardware, so it's a little up there. Evidently it won the
                  Pulitzer prize.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0201657880/bluebytesoftw-20/">Programming
               Pearls</a> -- <i>Jon Bentley</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0201657880.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  Another one in the category of "how the heck did I not read this sooner?" This book
                  is a collection of essays on various programming tasks, and gives tons of insight
                  on engineering software in general. The prose is even entertaining too. This book
                  now occupies a special place on my bookshelf.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0321349601/bluebytesoftw-20/">Java
               Concurrency in Practice</a> -- <i>Brian Goetz, et. al</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0321349601.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  This is a very down-to-earth, pragmatic overview of concurrency in Java. It even has
                  chapters on testing and debugging, which get very little coverage in most articles
                  but are clearly important. Though its focus is on Java, many of the ideas are more
                  general, and thus it's a must-read for any serious Windows or .NET concurrency programmer.
                  It's not as good as my upcoming book, but given that you can't buy mine yet, it will
                  do for now ;). 
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0321440307/bluebytesoftw-20/">The
               Old New Thing: Practical Development Throughout the Evolution of Windows</a> -- <i>Raymond
               Chen</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0321440307.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  I'm sure everybody who reads my blog reads <a href="http://blogs.msdn.com/oldnewthing/">Raymond's</a> too.
                  If you do, then the book will be quite familiar to you. It's a collection of essays,
                  most of which are edited versions of ones that have appeared on Raymond's blog in
                  the past. I really like the layout and organization of chapters. One downside: Raymond
                  apparently tried to keep it from becoming too geeky (he mentions several times, "for
                  you non-programmers, you can skip this chapter"), but c'mon: how many non-programmers
                  are actually going to read this book? IMHO he should have just let loose and never
                  looked back.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/3540430814/bluebytesoftw-20/">Software
               Pioneers</a> -- <i>Manfred Broy (editor), Ernst Denert (editor)</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/3540430814.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  This book is a collection of classic articles by precisely what the book's title suggests,
                  software pioneers: Friedrich L. Bauer (ALGOL), Ole-Johan Dahl (Simula), Niklaus Wirth
                  (Pascal), Fred Brooks (Mythical Man Month, OS/360), Alan Kay (GUIs), Rudolf Bayer
                  (B-trees), Peter Chen (E/R modeling), Edsger Dijkstra (obvious), Tony Hoare (CSPs,
                  axiomatic semantics), David Parnas, John Guttag (abstract data types), Michael Jackson
                  (JSP), Tom DeMarco (structured analysis), Michael Fagan (code inspection), Barry Boehm
                  (engineering economics) and Erich Gamma (design patterns). Most of the papers are
                  available on the net, but having them in a printed hardcover is really nice. There
                  are also some new write-ups and an accompanying CD which contains talks from all of
                  the above people. Nice. 
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0387966439/bluebytesoftw-20/">An
               APL Compiler</a> -- <i>Timothy Budd</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0387966439.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  An overview of Timothy Budd's APL compiler, from front to back end. (For those not
                  up on APL, it's a great language. See the next item.) Also contains a chapter on compiling
                  high level program statements to vector ISAs, which is quite timely and interesting. 
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0534128645/bluebytesoftw-20/">APL
               with a Mathematical Accent</a> -- <i>C. A. Reiter, W. R. Jones</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0534128645.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  This is the best overview and reference book on APL I've encountered to date. For
                  $120, you get the cheesiest binding and printing ever, so be prepared to be disappointed
                  in that department, but the content is well worth it. Covers APL from start to finish
                  and has some handy reference charts. 
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/1556151179/bluebytesoftw-20/">Inside
               OS/2</a> -- <i>Gordon Letwin</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/1556151179.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  I picked this book up after reading <a href="http://blogs.msdn.com/larryosterman/archive/2005/02/22/378174.aspx">Larry
                  Osterman's blog entry</a> about how acquiring a critical section in OS/2 effectively
                  suspended all threads in the system until it was released. Sure enough, that's how
                  it worked. Funny. Anyway, this book was fun because it takes you back in time, and,
                  since Gordon was the chief architect for OS/2, the writing gives a ton of insight
                  into software design and architecture when OS/2 was being developed. Though there
                  is plenty of detail which is fairly useless today (like how to specifically use DosCWait),
                  I enjoyed skimming it. 
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/1400082463/bluebytesoftw-20/">Dreaming
               in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One Quest for Transcendent
               Software</a> -- <i>Scott Rosenberg</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/1400082463.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>7 of 10.</b>
                  <br />
                  In the style of Soul of a New Machine (see above), this book takes you through the
                  development of Chandler, a start -up software project lead by Mitch Kapor, the founder
                  of Lotus. I generally agree with most of the reviews on Amazon: the book idea was
                  good, the writing is very good, but the project he chose to follow was crap. As far
                  as I know, Chandler is now dead, and the start-up didn't seem like a place buzzing
                  with immensely passionate people, no matter how hard the author tried to convey that.
                  He should have chosen Windows Vista or something ;).
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <p>
          <b>Non-(computer-)geek books:</b>
        </p>
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/023113312X/bluebytesoftw-20/">Molecular
               Gastronomy: Exploring the Science of Flavor</a> -- <i>Hervey This</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/023113312X.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  This is THE book on molecular gastronomy, literally. Hervey basically invented the
                  field, from what I understand, and this book is a great collection of easy-to-read
                  essays on the topic. You'll walk away with a better scientific understanding of what
                  cooking is all about, including how various new-age techniques work, and perhaps even
                  the confidence to try some of it out on your own. This is a must read for any serious
                  food geek.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0805061738/bluebytesoftw-20/">The
               Making of a Chef: Mastering Heat at the Culinary Institute</a> -- <i>Michael Ruhlman</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0805061738.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  In this book, the author enrolls at the Cullinary Institute of America (CIA) and goes
                  through basically the full cirriculum. The book is written excellently, and you feel
                  like you're right there in class with him. And you certainly walk away with a deep
                  and lucid appreciation for those who are slaves to the knife, cooking up delicious
                  food because they love it. I was considering a stint at the CIA ... until I read this
                  ... I'm now convinced that I couldn't handle it ;).
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0525949690/bluebytesoftw-20/">This
               is your Brain on Music: The Science of a Human Obsession</a> -- <i>Daniel J. Levitin</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0525949690.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  So many of you probably don't know that I'm a music geek too. I write a lot of material
                  -- actually, I've been writing a whole lot more lately -- though I don't play live
                  at all anymore. This book has some light introduction to music theory, but the great
                  part is the way the author dives into cognitive neuroscience and the effect of music
                  on people, their brains, and their psychology. The book is incredibly unique and will
                  instill a newfound appreciation of every nuance of that next breakbeat you hear.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0141001895/bluebytesoftw-20/">The
               Soul of a Chef: The Journey Toward Perfection</a> -- <i>Michael Ruhlman</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0141001895.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  Great follow-up to The Making of a Chef. The delves into the make-up of a chef, starting
                  with the master chef exam at the CIA, and then profiling two chefs: Michael Symon
                  (Lola) and Thomas Keller (French Laundry, per se). While the whole thing is great,
                  the 1/3 of the book devoted to Thomas Keller makes the book wortwhile.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/1400041201/bluebytesoftw-20/">Heat:
               An Amateur's Adventures as Kitchen Slave, Line Cook, Pasta-Maker, and Apprentice to
               a Dante-Quoting Butcher in Tuscany</a> -- <i>Bill Buford</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/1400041201.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>10 of 10.</b>
                  <br />
                  I couldn't put this book down for a whole weekend, and then I was sad when it was
                  done. The writing is extraordinary, and makes you feel like you're there, learning
                  to make various pastas, to be a line cook at Babbo in New York, to try and learn what
                  you can from Mario, and to travel to Italy to learn from some very interesting characters
                  indeed. Easily one of my favorite reads from 2006.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/1582341400/bluebytesoftw-20/">A
               Cook's Tour</a> -- <i>Anthony Bourdain</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/1582341400.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>9 of 10.</b>
                  <br />
                  After reading <a href="http://www.amazon.com/exec/obidos/ASIN/0060934913/bluebytesoftw-20/">Kitchen
                  Confidential</a>, I couldn't not read A Cook's Tour. Anthony is extremely entertaining,
                  crude, and raw. That's what he does best. This is the book version of his late TV
                  show with the same title. In it, he travels the world, tasting regional cuisines and
                  reporting "from the trenches". Lots of mouth watering street food, bizzare encounters,
                  exotic beverages, etc. If you can't afford to do a foodie world-tour yourself, this
                  is the next best thing.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0393317552/bluebytesoftw-20/">Guns,
               Germs, and Steel: The Fates of Human Societies</a> -- <i>Jared M. Diamond</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0393317552.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>9 of 10.</b>
                  <br />
                  This book needs little introduction. It won the Pulitzer prize, after all. The book
                  describes how certain socieites came to dominate various geographies of the world,
                  including (as the title suggests) the role of guns, germs (disease), and steel in
                  the process. For obvious reasons, the writing is a tad dry, but it's so jam packed
                  full of interesting data and written incredibly methodically, both of which more than
                  make up for the dryness.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/1594200823/bluebytesoftw-20/">The
               Omnivore's Dilemma: A Natural History of Four Meals</a> -- <i>Michael Pollan</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/1594200823.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>9 of 10.</b>
                  <br />
                  This book takes you through many different forms of eating, from corn and our new
                  industrialized food system, to farming, to hunting and foraging, and beyond. Each
                  section concludes with a meal characteristic of one particular style of food creation.
                  Though at times the writing gives a hint of an agenda, the writing is generally excellent,
                  and many facts are presented for consideration. 
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/B000NA6U2E/bluebytesoftw-20/">The
               Reach of a Chef: Beyond the Kitchen</a> -- <i>Michael Ruhlman</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/B000NA6U2E.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  This is the third of Ruhlman's XXX of a Chef series of books, and I really enjoyed
                  it. This one looks at chefs and their influence inside and outside of the kitchen.
                  That includes Grant Achatz (of Alinea), how he studied under Keller and became an
                  American pioneer of molecular gastronomy, various Food TV celebs, and so on. Great
                  read.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0966446119/bluebytesoftw-20/">The
               Essays of Warren Buffett: Lessons for Corporate America</a> -- <i>Warren Buffet, Lawrence
               A. Cunningham (editor)</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0966446119.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>8 of 10.</b>
                  <br />
                  Sometime in 2005, I stumbled across <a href="http://www.berkshirehathaway.com/letters/letters.html">the
                  archive of Warren Buffet's letters to the Berkshire Hathaway shareholders</a>, dating
                  back to 1977. I immediately printed them all out and have a stack of many 1,000 pages
                  in my office to this day. Though they are fairly lengthy, there are many great lessons
                  to be learned from reading them. This book is an edited down version of those essays.
                  Very edited and abridged, actually, but some of the more important points are pulled
                  out and analyzed. And the best part is that if you want to drill into more detail,
                  all of the letters are available online.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/0743247515/bluebytesoftw-20/">Judgment
               of Paris: California vs. France and the Historic 1976 Paris Tasting that Revolutionized
               Wine</a> -- <i>Michael Ruhlman</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/0743247515.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>7 of 10.</b>
                  <br />
                  All wine lovers need to read this. I gave it 7 out of 10 simply because the writing
                  style is actually pretty bad IMHO. But the content itself is great, and of historical
                  signifciance. <a href="http://en.wikipedia.org/wiki/Judgment_of_Paris_(wine)">Wikipedia
                  has a page on the event</a>, but in summary, in 1976 many Bordeaux 1st growths, etc.
                  were pitted against various California winemakers in a blind tasting. The tasting
                  was held in Paris, and the judges were all French. Everybody believed the US wines
                  would fall short, but it turned out that the US fared quite well: the book is the
                  story of events leading up to and including this tasting.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <table border="0">
          <tbody>
            <tr>
              <td valign="top" colspan="2">
                <i>
                  <a href="http://www.amazon.com/exec/obidos/ASIN/1582344515/bluebytesoftw-20/">The
               Nasty Bits: Collected Varietal Cuts, Usable Trim, Scraps, and Bones</a> -- <i>Anthony
               Bourdain</i></i>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <img height="90" src="http://images.amazon.com/images/P/1582344515.01._SCMZZZZZZZ_.jpg" width="59" align="right" />
              </td>
              <td valign="top">
                <p>
                  <b>7 of 10.</b>
                  <br />
                  To be entirely honest, this book was VERY entertaining, but fell a bit short of my
                  expectations. This is a collection of fairly disjoint essays, almost the kind of thing
                  you'd expect to see on a blog. Each reads very well on its own, but it lacked the
                  kind of cohesive feel I was looking for. Nevertheless, Anthony is always entertaining,
                  crude, funny, and makes me laugh. This book was no exception.
               </p>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=66e10310-39f5-4735-bd24-2f4daeeb9214" />
      </body>
      <title>Books in my brain</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,66e10310-39f5-4735-bd24-2f4daeeb9214.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/04/29/BooksInMyBrain.aspx</link>
      <pubDate>Sun, 29 Apr 2007 07:22:39 GMT</pubDate>
      <description>&lt;p&gt;
   Long time readers will remember that I used to regularly blog about what I've been
   reading lately. (See &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,f93fcad8-d9e7-4edc-8ff9-36ae1520cc94.aspx"&gt;here&lt;/a&gt;, &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,cf2c3c82-7161-4f47-a2ef-65d04d0b24fc.aspx"&gt;here&lt;/a&gt;, &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,b3d395d6-6ae6-43a9-800c-5ff38bdf2c39.aspx"&gt;here&lt;/a&gt;,
   and &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,ad453a9d-81b3-4494-a367-2b4b92cedd15.aspx"&gt;here&lt;/a&gt; for
   examples.) Well, it's been close to a year since I've posted such a list. So here's
   a little bit of a clearance of my back- log. (And this isn't even everything! I guess
   I read a lot.) I've separated the list into geek and non-geek books.
&lt;/p&gt;
&lt;p&gt;
   &lt;b&gt;Geek books:&lt;/b&gt;
&lt;/p&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0316491977/bluebytesoftw-20/"&gt;The
            Soul of a New Machine&lt;/a&gt; -- &lt;i&gt;Tracy Kidder&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0316491977.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               I'm only 16 years late on this one. This book is about DG's race to build a machine
               to contend with DEC's VAX, and has some great story telling. It reads almost like
               a fiction book, with great character building, a nice storyline running through the
               book, etc. The geek factor is low on this one, though I suppose it _is_ a book about
               a bunch of geeks building hardware, so it's a little up there. Evidently it won the
               Pulitzer prize.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0201657880/bluebytesoftw-20/"&gt;Programming
            Pearls&lt;/a&gt; -- &lt;i&gt;Jon Bentley&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0201657880.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               Another one in the category of "how the heck did I not read this sooner?" This book
               is a collection of essays on various programming tasks, and gives tons of insight
               on engineering software in general. The prose is even entertaining too. This book
               now occupies a special place on my bookshelf.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321349601/bluebytesoftw-20/"&gt;Java
            Concurrency in Practice&lt;/a&gt; -- &lt;i&gt;Brian Goetz, et. al&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0321349601.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               This is a very down-to-earth, pragmatic overview of concurrency in Java. It even has
               chapters on testing and debugging, which get very little coverage in most articles
               but are clearly important. Though its focus is on Java, many of the ideas are more
               general, and thus it's a must-read for any serious Windows or .NET concurrency programmer.
               It's not as good as my upcoming book, but given that you can't buy mine yet, it will
               do for now ;). 
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321440307/bluebytesoftw-20/"&gt;The
            Old New Thing: Practical Development Throughout the Evolution of Windows&lt;/a&gt; -- &lt;i&gt;Raymond
            Chen&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0321440307.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               I'm sure everybody who reads my blog reads &lt;a href="http://blogs.msdn.com/oldnewthing/"&gt;Raymond's&lt;/a&gt; too.
               If you do, then the book will be quite familiar to you. It's a collection of essays,
               most of which are edited versions of ones that have appeared on Raymond's blog in
               the past. I really like the layout and organization of chapters. One downside: Raymond
               apparently tried to keep it from becoming too geeky (he mentions several times, "for
               you non-programmers, you can skip this chapter"), but c'mon: how many non-programmers
               are actually going to read this book? IMHO he should have just let loose and never
               looked back.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/3540430814/bluebytesoftw-20/"&gt;Software
            Pioneers&lt;/a&gt; -- &lt;i&gt;Manfred Broy (editor), Ernst Denert (editor)&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/3540430814.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               This book is a collection of classic articles by precisely what the book's title suggests,
               software pioneers: Friedrich L. Bauer (ALGOL), Ole-Johan Dahl (Simula), Niklaus Wirth
               (Pascal), Fred Brooks (Mythical Man Month, OS/360), Alan Kay (GUIs), Rudolf Bayer
               (B-trees), Peter Chen (E/R modeling), Edsger Dijkstra (obvious), Tony Hoare (CSPs,
               axiomatic semantics), David Parnas, John Guttag (abstract data types), Michael Jackson
               (JSP), Tom DeMarco (structured analysis), Michael Fagan (code inspection), Barry Boehm
               (engineering economics) and Erich Gamma (design patterns). Most of the papers are
               available on the net, but having them in a printed hardcover is really nice. There
               are also some new write-ups and an accompanying CD which contains talks from all of
               the above people. Nice. 
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0387966439/bluebytesoftw-20/"&gt;An
            APL Compiler&lt;/a&gt; -- &lt;i&gt;Timothy Budd&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0387966439.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               An overview of Timothy Budd's APL compiler, from front to back end. (For those not
               up on APL, it's a great language. See the next item.) Also contains a chapter on compiling
               high level program statements to vector ISAs, which is quite timely and interesting. 
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0534128645/bluebytesoftw-20/"&gt;APL
            with a Mathematical Accent&lt;/a&gt; -- &lt;i&gt;C. A. Reiter, W. R. Jones&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0534128645.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               This is the best overview and reference book on APL I've encountered to date. For
               $120, you get the cheesiest binding and printing ever, so be prepared to be disappointed
               in that department, but the content is well worth it. Covers APL from start to finish
               and has some handy reference charts. 
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1556151179/bluebytesoftw-20/"&gt;Inside
            OS/2&lt;/a&gt; -- &lt;i&gt;Gordon Letwin&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/1556151179.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               I picked this book up after reading &lt;a href="http://blogs.msdn.com/larryosterman/archive/2005/02/22/378174.aspx"&gt;Larry
               Osterman's blog entry&lt;/a&gt; about how acquiring a critical section in OS/2 effectively
               suspended all threads in the system until it was released. Sure enough, that's how
               it worked. Funny. Anyway, this book was fun because it takes you back in time, and,
               since Gordon was the chief architect for OS/2, the writing gives a ton of insight
               into software design and architecture when OS/2 was being developed. Though there
               is plenty of detail which is fairly useless today (like how to specifically use DosCWait),
               I enjoyed skimming it. 
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1400082463/bluebytesoftw-20/"&gt;Dreaming
            in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One Quest for Transcendent
            Software&lt;/a&gt; -- &lt;i&gt;Scott Rosenberg&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/1400082463.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;7 of 10.&lt;/b&gt;
               &lt;br&gt;
               In the style of Soul of a New Machine (see above), this book takes you through the
               development of Chandler, a start -up software project lead by Mitch Kapor, the founder
               of Lotus. I generally agree with most of the reviews on Amazon: the book idea was
               good, the writing is very good, but the project he chose to follow was crap. As far
               as I know, Chandler is now dead, and the start-up didn't seem like a place buzzing
               with immensely passionate people, no matter how hard the author tried to convey that.
               He should have chosen Windows Vista or something ;).
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;
   &lt;b&gt;Non-(computer-)geek books:&lt;/b&gt;
&lt;/p&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/023113312X/bluebytesoftw-20/"&gt;Molecular
            Gastronomy: Exploring the Science of Flavor&lt;/a&gt; -- &lt;i&gt;Hervey This&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/023113312X.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               This is THE book on molecular gastronomy, literally. Hervey basically invented the
               field, from what I understand, and this book is a great collection of easy-to-read
               essays on the topic. You'll walk away with a better scientific understanding of what
               cooking is all about, including how various new-age techniques work, and perhaps even
               the confidence to try some of it out on your own. This is a must read for any serious
               food geek.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0805061738/bluebytesoftw-20/"&gt;The
            Making of a Chef: Mastering Heat at the Culinary Institute&lt;/a&gt; -- &lt;i&gt;Michael Ruhlman&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0805061738.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               In this book, the author enrolls at the Cullinary Institute of America (CIA) and goes
               through basically the full cirriculum. The book is written excellently, and you feel
               like you're right there in class with him. And you certainly walk away with a deep
               and lucid appreciation for those who are slaves to the knife, cooking up delicious
               food because they love it. I was considering a stint at the CIA ... until I read this
               ... I'm now convinced that I couldn't handle it ;).
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0525949690/bluebytesoftw-20/"&gt;This
            is your Brain on Music: The Science of a Human Obsession&lt;/a&gt; -- &lt;i&gt;Daniel J. Levitin&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0525949690.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               So many of you probably don't know that I'm a music geek too. I write a lot of material
               -- actually, I've been writing a whole lot more lately -- though I don't play live
               at all anymore. This book has some light introduction to music theory, but the great
               part is the way the author dives into cognitive neuroscience and the effect of music
               on people, their brains, and their psychology. The book is incredibly unique and will
               instill a newfound appreciation of every nuance of that next breakbeat you hear.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0141001895/bluebytesoftw-20/"&gt;The
            Soul of a Chef: The Journey Toward Perfection&lt;/a&gt; -- &lt;i&gt;Michael Ruhlman&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0141001895.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               Great follow-up to The Making of a Chef. The delves into the make-up of a chef, starting
               with the master chef exam at the CIA, and then profiling two chefs: Michael Symon
               (Lola) and Thomas Keller (French Laundry, per se). While the whole thing is great,
               the 1/3 of the book devoted to Thomas Keller makes the book wortwhile.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1400041201/bluebytesoftw-20/"&gt;Heat:
            An Amateur's Adventures as Kitchen Slave, Line Cook, Pasta-Maker, and Apprentice to
            a Dante-Quoting Butcher in Tuscany&lt;/a&gt; -- &lt;i&gt;Bill Buford&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/1400041201.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;10 of 10.&lt;/b&gt;
               &lt;br&gt;
               I couldn't put this book down for a whole weekend, and then I was sad when it was
               done. The writing is extraordinary, and makes you feel like you're there, learning
               to make various pastas, to be a line cook at Babbo in New York, to try and learn what
               you can from Mario, and to travel to Italy to learn from some very interesting characters
               indeed. Easily one of my favorite reads from 2006.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1582341400/bluebytesoftw-20/"&gt;A
            Cook's Tour&lt;/a&gt; -- &lt;i&gt;Anthony Bourdain&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/1582341400.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;9 of 10.&lt;/b&gt;
               &lt;br&gt;
               After reading &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0060934913/bluebytesoftw-20/"&gt;Kitchen
               Confidential&lt;/a&gt;, I couldn't not read A Cook's Tour. Anthony is extremely entertaining,
               crude, and raw. That's what he does best. This is the book version of his late TV
               show with the same title. In it, he travels the world, tasting regional cuisines and
               reporting "from the trenches". Lots of mouth watering street food, bizzare encounters,
               exotic beverages, etc. If you can't afford to do a foodie world-tour yourself, this
               is the next best thing.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0393317552/bluebytesoftw-20/"&gt;Guns,
            Germs, and Steel: The Fates of Human Societies&lt;/a&gt; -- &lt;i&gt;Jared M. Diamond&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0393317552.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;9 of 10.&lt;/b&gt;
               &lt;br&gt;
               This book needs little introduction. It won the Pulitzer prize, after all. The book
               describes how certain socieites came to dominate various geographies of the world,
               including (as the title suggests) the role of guns, germs (disease), and steel in
               the process. For obvious reasons, the writing is a tad dry, but it's so jam packed
               full of interesting data and written incredibly methodically, both of which more than
               make up for the dryness.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1594200823/bluebytesoftw-20/"&gt;The
            Omnivore's Dilemma: A Natural History of Four Meals&lt;/a&gt; -- &lt;i&gt;Michael Pollan&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/1594200823.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;9 of 10.&lt;/b&gt;
               &lt;br&gt;
               This book takes you through many different forms of eating, from corn and our new
               industrialized food system, to farming, to hunting and foraging, and beyond. Each
               section concludes with a meal characteristic of one particular style of food creation.
               Though at times the writing gives a hint of an agenda, the writing is generally excellent,
               and many facts are presented for consideration. 
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/B000NA6U2E/bluebytesoftw-20/"&gt;The
            Reach of a Chef: Beyond the Kitchen&lt;/a&gt; -- &lt;i&gt;Michael Ruhlman&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/B000NA6U2E.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               This is the third of Ruhlman's XXX of a Chef series of books, and I really enjoyed
               it. This one looks at chefs and their influence inside and outside of the kitchen.
               That includes Grant Achatz (of Alinea), how he studied under Keller and became an
               American pioneer of molecular gastronomy, various Food TV celebs, and so on. Great
               read.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0966446119/bluebytesoftw-20/"&gt;The
            Essays of Warren Buffett: Lessons for Corporate America&lt;/a&gt; -- &lt;i&gt;Warren Buffet, Lawrence
            A. Cunningham (editor)&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0966446119.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;8 of 10.&lt;/b&gt;
               &lt;br&gt;
               Sometime in 2005, I stumbled across &lt;a href="http://www.berkshirehathaway.com/letters/letters.html"&gt;the
               archive of Warren Buffet's letters to the Berkshire Hathaway shareholders&lt;/a&gt;, dating
               back to 1977. I immediately printed them all out and have a stack of many 1,000 pages
               in my office to this day. Though they are fairly lengthy, there are many great lessons
               to be learned from reading them. This book is an edited down version of those essays.
               Very edited and abridged, actually, but some of the more important points are pulled
               out and analyzed. And the best part is that if you want to drill into more detail,
               all of the letters are available online.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0743247515/bluebytesoftw-20/"&gt;Judgment
            of Paris: California vs. France and the Historic 1976 Paris Tasting that Revolutionized
            Wine&lt;/a&gt; -- &lt;i&gt;Michael Ruhlman&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/0743247515.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;7 of 10.&lt;/b&gt;
               &lt;br&gt;
               All wine lovers need to read this. I gave it 7 out of 10 simply because the writing
               style is actually pretty bad IMHO. But the content itself is great, and of historical
               signifciance. &lt;a href="http://en.wikipedia.org/wiki/Judgment_of_Paris_(wine)"&gt;Wikipedia
               has a page on the event&lt;/a&gt;, but in summary, in 1976 many Bordeaux 1st growths, etc.
               were pitted against various California winemakers in a blind tasting. The tasting
               was held in Paris, and the judges were all French. Everybody believed the US wines
               would fall short, but it turned out that the US fared quite well: the book is the
               story of events leading up to and including this tasting.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table border=0&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td valign=top colspan=2&gt;
            &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1582344515/bluebytesoftw-20/"&gt;The
            Nasty Bits: Collected Varietal Cuts, Usable Trim, Scraps, and Bones&lt;/a&gt; -- &lt;i&gt;Anthony
            Bourdain&lt;/i&gt;&lt;/i&gt; 
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td valign=top&gt;
            &lt;img height=90 src="http://images.amazon.com/images/P/1582344515.01._SCMZZZZZZZ_.jpg" width=59 align=right&gt;&lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;p&gt;
               &lt;b&gt;7 of 10.&lt;/b&gt;
               &lt;br&gt;
               To be entirely honest, this book was VERY entertaining, but fell a bit short of my
               expectations. This is a collection of fairly disjoint essays, almost the kind of thing
               you'd expect to see on a blog. Each reads very well on its own, but it lacked the
               kind of cohesive feel I was looking for. Nevertheless, Anthony is always entertaining,
               crude, funny, and makes me laugh. This book was no exception.
            &lt;/p&gt;
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=66e10310-39f5-4735-bd24-2f4daeeb9214" /&gt;</description>
      <category>Books;Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=3dd3eaa1-0482-48ce-a795-d099a6084334</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,3dd3eaa1-0482-48ce-a795-d099a6084334.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Prior to coming to Microsoft, I had been a developer for about 6 years.  Back
      in 2004, when contemplating moving to a different company, I decided I was ready for
      a shift in focus.  Namely, I wanted to move away from the details of writing
      code and move towards higher-level architecture, design, and strategy.  So I
      joined Microsoft as a program manager (PM).
   </p>
        <p>
      Now, less than 3 years later, I’ve moved back to being a software development engineer
      (SDE, i.e. developer).  Is it forever?  Who knows?  I didn’t move back
      because I disliked the PM job (as some might assume).  In fact, I thoroughly
      enjoyed most aspects of being a PM.  After a few months in my new role I actually
      find myself missing some of them from time to time.  There wasn’t any single
      thing that spurred the decision: it was fairly complicated, and involved a mixture
      of pursuing a specific opportunity, seeking growth, realizing I was missing many things
      that I enjoyed doing as a developer, and, I suppose, some degree of relapsing back
      to something I am more comfortable with.
   </p>
        <p>
      I've written up some details about why I decided to change.  Who knows, maybe
      it will help somebody out there choose the right role for themselves?
   </p>
        <p>
          <strong>The specific opportunity</strong>
        </p>
        <p>
      The opportunity I’m referring to was, of course, PLINQ, and it came about at
      just the right time.  I spent the year leading up to my decision gradually focusing
      more and more on PLINQ.  At first, PLINQ was just a crazy idea.  Then I
      did some prototyping in my free time, had some quick successes, and was amazed
      at how simple it was to write parallel programs with LINQ queries.  I showed
      some people, and most really latched on to the idea; they could understand the value
      of the system with just a 30 second elevator pitch.  These positive reactions
      motivated me to stick with the idea, and to keep driving hard.  Then there was
      interest from the C# team, interest from executives, a BillG ThinkWeek paper, and
      finally, somebody wanted to do it for real.
   </p>
        <p>
      In some sense, it was like a start-up.  I had an idea, figured it was
      an idea worth pursuing, did some prototyping, sold it among my peers, and
      finally convinced a VC team to fund the execution of the idea.  Well, if it truly
      were a start-up, what would I then want to do?  Code all night long, obviously! 
      I wanted to architect and design the actual product version, implement the darned
      thing, and feel the whole process from start to finish from several perspectives. 
      Doing PLINQ as a technical lead/developer seemed like a natural next step.
   </p>
        <p>
      I should also note that I had considered taking developer positions before the PLINQ
      job.  But in all of those instances, I chose not to for two reasons: I was having
      a blast as the concurrency PM on the CLR team and because the right opportunity
      hadn't arisen to steal me away.
   </p>
        <p>
      This was also a great growth opportunity for me.  Though I was a developer in
      the past, it was seldom my own idea that I was implementing, and this time it’s different. 
      I had set the ship sailing in a direction that I was happy with, and experiencing
      the consequences of that direction is something I seriously wanted.  It’s less
      about control than it is about feeling more ownership and responsibility for the direction
      in which our team is headed.  It’s also a way of putting my butt on the line,
      hopefully winning more trust and respect in the process, showing that I can actually
      follow through on good ideas (rather than just having the idea itself).  Most
      PMs certainly get a lot more of the influence and coarse-grained ownership opportunity
      than most SDEs, but my particular situation was such that my high-level contributions,
      leadership skills, and domain-experience will be more valuable and influential where
      I am now.  This last part turned out to be less of a SDE vs. PM thing (i.e. I
      could have probably had those things as a PLINQ PM too), but it played a huge role
      in my decision to change teams.
   </p>
        <p>
          <strong>I missed writing code</strong>
        </p>
        <p>
      During the many long nights of prototyping PLINQ, it also kept reminding me how
      much I loved coding and how much I missed it as a PM.  Put simply: I love programming. 
      Anybody who’s done something they love and gotten lost in it knows what “flow” is. 
      I used to experience flow when I played music, but I haven’t done that for so long
      that programming is now the only time I really feel it.  Maybe it has to
      do with the fact that I started coding when my brain was still in development (13
      years old), and so I tend to be comfortable thinking in code.  You know:
      no conscious thought, just a direct conduit from your brain to your fingertips. 
      There is a sense of time standing still, the code simply appearing on the screen in
      a magical blur, and at some point the thing actually works.  You can get up,
      stretch, make some tea, map out the next few hours for a moment, and then you’re back
      into it.  Lost in the fun of it all.  It’s just great, and nothing I ever
      did as a PM gave me this feeling.
   </p>
        <p>
      There’s an art to writing code.  Sure, there’s a non-negligible scientific and
      mathematical component to programming, but I like to think of development as
      the artful application of those formal techniques.  Inventing, structuring, and
      reifying abstractions, naming them, the careful placement of comments and whitespace,
      traversing the state space in your head, using intuition to make certain trade-offs,
      and so on.
   </p>
        <p>
      Perhaps the most creative and artistic activity as a PM that I really enjoyed was
      writing.  But to be honest, I’ve always enjoyed the kind of writing I do on my
      own time—writing blog essays and books—more than the more prevalent style of writing
      that a PM tends to do (say, design specifications).  I would get the chance to
      write a strategic or influential technical document from time to time, but the rate
      at which I will contribute such things as a SDE seems like it will be the same as
      when I was a PM.  It has been so far, at least.  If you have the insight
      and know how, when, and with whom to share and present it, people will
      listen, regardless of your title.
   </p>
        <p>
      Designing new things was also of course a creative activity I loved as a PM, but I’m
      doing more design work as a developer than when I was a PM.  Not all SDEs design
      higher-level things, but I do regularly and work closely with many architects, distinguished
      engineers, and technical fellows in the process.  Developers also get to design
      more at a slightly lower level of abstraction.  But everything's just an abstraction
      anyway, so the "level" doesn't matter much (to me) anyway.
   </p>
        <p>
      Prior to PLINQ, my Sencha interpreter/compiler (Scheme at first and later, Common
      LISP) was my hobby development project.  (And, of course, there were many late
      nights spent on TopCoder.)  I was basically spending my days as a PM and my nights
      as a developer.  To be honest, I enjoy doing both things and, aside from the
      time it took to do both, it made me very happy.  But in retrospect, it turned
      out to be rather unhealthy.  Writing code was my sole hobby, and I evicted all
      of my pre-Microsoft hobbies from my system to make room for it.  Now I get to
      write code during the day, do the components of PM that I enjoyed most, and still
      preserve my sanity.  I’m just getting back into the things I used to love doing:
      writing more than just technical blog essays and books, playing guitar, sports,
      working out, food and wine, and basically just getting outside and feeling healthier,
      both mentally and physically.  Maybe I'm getting old.
   </p>
        <p>
          <strong>Fractured role structure</strong>
        </p>
        <p>
      There are plenty of things I miss as a PM.  But I associate the absence of many
      such things with where we are with the PLINQ project.  High-level planning, becoming
      familiar with the competition and pertinent research in the area, thinking about product
      strategy, etc. are all certainly crucial activities throughout the project, but they
      are much more prevalent and involved at the outset.  As the project shifts into
      execution mode, there’s a lot of thinking about release plans, customer interaction,
      and team building and management.  I enjoy those things too, but I also love
      the design, architecture, and implementation of software.  I still get to do
      them, just not as frequently.  As a developer, you tend not to be involved in
      as many management discussions and decisions, but I can cope with this knowing I have
      a solid PM and management team working with me.  I know that if there's anything
      that requires my attention or where my feedback would be valuable, they won't hesitate
      to bring it to me.
   </p>
        <p>
      To be completely honest, I dislike the completely fractured role structure that most
      of Microsoft employs.  (And “dislike” is putting it mildly.)  I do believe
      that people need to specialize, particularly as they grow in their career.  You
      simply can’t do it all and expect to move up to the next level of your career without
      abstracting some details.  But when you get down to it, there really isn’t much
      of a difference between PM, SDE, and SDE/T.  I've been doing interviews for PM
      and SDE lately, and we expect one to have a better business- and customer-sense,
      while the other needs to be solid algorithmically and implementation-wise, but
      there's a substantial overlap.  There are obviously certain responsibilities
      which are unique to each role, but more often than not, the roles are fluid and (when
      things are going well) people are able to fill in whatever gaps happen to arise that
      they are good at filling.  I just don’t think this kind of specialization necessarily
      needs to be forced.  Maybe I'm influenced by my own style of sitting on the edge
      between the two roles.  Each project needs its own unique structure, and some
      dedicated managers, but it doesn’t happen according to some magical formula. 
      As I understand things, this is how it works at Google, and just about every research
      department I’ve ever known (including MSR).
   </p>
        <p>
      I should also mention that the grass isn't all a vibrant shade of green on the other
      side of the fence.  A PM gets to operate at a higher-level, seldom spending more
      than 10 minutes triaging and talking to a developer about any particular bug, for
      example.  In contrast, a developer must focus on details most of the time. 
      This might mean spending anywhere from 1 minute to 1 week on just a single bug. 
      Some people enjoy getting lost in details (in fact, it can help lead to flow, though
      bug fixing is more investigative work than anything else, which isn't as conducive). 
      Checking in a bug makes it really easy to quantify “success” and some people need
      this.  (Not me.)  I prefer more ambiguous tasks which usually means design
      or coding an entirely new algorithm, and I find fixing bugs tedious.  This means
      the late-in-the-game product cycle will be a little rough for me.  But that’s
      OK: the details are of course part of the engineering process, so I do it and don’t
      ever find myself thinking “wow, I dislike this” while I'm doing it.  A lot of
      developers tend to be tools geeks, too.  They love building complex ecosystems
      of engineering support tools.  I’m not into that.  I value solid engineering
      practices, but prefer things to be as simple as possible such that nothing gets in
      between me, the code, and the compiler.  Reality isn’t quite always like this,
      and tools are often the most effective means to ensure certain quality properties of
      your product, but I still strive to eliminate (or avoid adding) as much unnecessary
      obstructions as possible.  A wise man once said "keep it as simple as possible,
      but no simpler."
   </p>
        <p>
          <strong>Some final words</strong>
        </p>
        <p>
      At the end of the day, when I look at influential people I've bonded with across
      the company, most (but certainly not all) rose up through the ranks as developers. 
      That’s clearly very subjective and personal: that’s not to say there aren’t great
      PMs (past or present), only that most architects, distinguished engineers, technical
      fellows, and researchers have or are coders at heart.   Moreover, I simply
      see myself being more successful as a SDE.  Not only have I done it for longer,
      but the career skills required to move from developer to architect to distinguished
      engineer (in Microsoft) align more closely with the skills I already have.  While
      PMs can move to architecture with time, it simply looks like a much longer road from
      where I stand.
   </p>
        <p>
      And after saying all of this, I truly believe job title doesn’t matter that much at
      all.  Ability and good intuition matter.  We’re all just shipping software. 
      At the end of the day, we do what needs to get done for that to happen, regardless
      of what hat we happen to be wearing at the time.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=3dd3eaa1-0482-48ce-a795-d099a6084334" />
      </body>
      <title>Developer to PM, and then back again</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,3dd3eaa1-0482-48ce-a795-d099a6084334.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/03/25/DeveloperToPMAndThenBackAgain.aspx</link>
      <pubDate>Sun, 25 Mar 2007 00:19:17 GMT</pubDate>
      <description>&lt;p&gt;
   Prior to coming to Microsoft, I had been a developer for about 6 years.&amp;nbsp; Back
   in 2004, when contemplating moving to a different company, I decided I was ready for
   a shift in focus.&amp;nbsp; Namely, I wanted to move away from the details of writing
   code and move towards higher-level architecture, design, and strategy.&amp;nbsp; So I
   joined Microsoft as a program manager (PM).
&lt;/p&gt;
&lt;p&gt;
   Now, less than 3 years later, I’ve moved back to being a software development engineer
   (SDE, i.e. developer).&amp;nbsp; Is it forever?&amp;nbsp; Who knows?&amp;nbsp; I didn’t move back
   because I disliked the PM job (as some might assume).&amp;nbsp; In fact, I thoroughly
   enjoyed most aspects of being a PM.&amp;nbsp; After a few months in my new role I actually
   find myself missing some of them from time to time.&amp;nbsp; There wasn’t any single
   thing that spurred the decision: it was fairly complicated, and involved a mixture
   of pursuing a specific opportunity, seeking growth, realizing I was missing many things
   that I enjoyed doing as a developer, and, I suppose, some degree of relapsing back
   to something I am more comfortable with.
&lt;/p&gt;
&lt;p&gt;
   I've written up some details about why I decided to change.&amp;nbsp; Who knows, maybe
   it will help somebody out there choose the right role for themselves?
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;The specific opportunity&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   The opportunity I’m referring to was, of course,&amp;nbsp;PLINQ, and it came about at
   just the right time.&amp;nbsp; I spent the year leading up to my decision gradually focusing
   more and more on PLINQ.&amp;nbsp; At first, PLINQ was just a crazy idea.&amp;nbsp; Then I
   did some prototyping in my free time, had some quick successes,&amp;nbsp;and was amazed
   at how simple it was to write parallel programs with LINQ queries.&amp;nbsp; I showed
   some people, and most really latched on to the idea; they could understand the value
   of the system with just a 30 second elevator pitch.&amp;nbsp; These positive reactions
   motivated me to stick with the idea, and to keep driving hard.&amp;nbsp; Then there was
   interest from the C# team, interest from executives, a BillG ThinkWeek paper, and
   finally, somebody wanted to do it for real.
&lt;/p&gt;
&lt;p&gt;
   In some sense,&amp;nbsp;it was like a&amp;nbsp;start-up.&amp;nbsp; I had an idea, figured it was
   an idea worth pursuing,&amp;nbsp;did some prototyping, sold it among my peers,&amp;nbsp;and
   finally convinced a VC team to fund the execution of the idea.&amp;nbsp; Well, if it truly
   were a start-up, what would I then want to do?&amp;nbsp; Code all night long, obviously!&amp;nbsp;
   I wanted to architect and design the actual product version, implement the darned
   thing, and feel the whole process from start to finish from several perspectives.&amp;nbsp;
   Doing PLINQ as a technical lead/developer seemed like a natural next step.
&lt;/p&gt;
&lt;p&gt;
   I should also note that I had considered taking developer positions before the PLINQ
   job.&amp;nbsp; But in all of those instances, I chose not to for two reasons: I was having
   a blast as the concurrency PM on the CLR team and&amp;nbsp;because the right opportunity
   hadn't arisen to steal me away.
&lt;/p&gt;
&lt;p&gt;
   This was also a great growth opportunity for me.&amp;nbsp; Though I was a developer in
   the past, it was seldom my own idea that I was implementing, and this time it’s different.&amp;nbsp;
   I had set the ship sailing in a direction that I was happy with, and experiencing
   the consequences of that direction is something I seriously wanted.&amp;nbsp; It’s less
   about control than it is about feeling more ownership and responsibility for the direction
   in which our team is headed.&amp;nbsp; It’s also a way of putting my butt on the line,
   hopefully winning more trust and respect in the process, showing that I can actually
   follow through on good ideas (rather than just having the idea itself).&amp;nbsp; Most
   PMs certainly get a lot more of the influence and coarse-grained ownership opportunity
   than most SDEs, but my particular situation was such that my high-level contributions,
   leadership skills, and domain-experience will be more valuable and influential where
   I am now.&amp;nbsp; This last part turned out to be less of a SDE vs. PM thing (i.e. I
   could have probably had those things as a PLINQ PM too), but it played a huge role
   in my decision to change teams.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;I missed writing code&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   During the many long nights&amp;nbsp;of prototyping PLINQ, it also kept reminding me how
   much I loved coding and how much I missed it as a PM.&amp;nbsp; Put simply: I love programming.&amp;nbsp;
   Anybody who’s done something they love and gotten lost in it knows what “flow” is.&amp;nbsp;
   I used to experience flow when I played music, but I haven’t done that for so long
   that&amp;nbsp;programming is now the only time I really feel it.&amp;nbsp; Maybe it has to
   do with the fact that I started coding when my brain was still in development (13
   years old), and so I tend to be comfortable&amp;nbsp;thinking in code.&amp;nbsp; You know:
   no conscious thought, just a direct conduit from your brain to your fingertips.&amp;nbsp;
   There is a sense of time standing still, the code simply appearing on the screen in
   a magical blur, and at some point the thing actually works.&amp;nbsp; You can get up,
   stretch, make some tea, map out the next few hours for a moment, and then you’re back
   into it.&amp;nbsp; Lost in the fun of it all.&amp;nbsp; It’s just great, and nothing I ever
   did as a PM gave me this feeling.
&lt;/p&gt;
&lt;p&gt;
   There’s an art to writing code.&amp;nbsp; Sure, there’s a non-negligible scientific and
   mathematical component to programming, but I like to think of&amp;nbsp;development as
   the artful application of those formal techniques.&amp;nbsp; Inventing, structuring, and
   reifying abstractions, naming them, the careful placement of comments and whitespace,
   traversing the state space in your head, using intuition to make certain trade-offs,
   and so on.
&lt;/p&gt;
&lt;p&gt;
   Perhaps the most creative and artistic activity as a PM that I really enjoyed was
   writing.&amp;nbsp; But to be honest, I’ve always enjoyed the kind of writing I do on my
   own time—writing blog essays and books—more than the more prevalent style of writing
   that a PM tends to do (say, design specifications).&amp;nbsp; I would get the chance to
   write a strategic or influential technical document from time to time, but the rate
   at which I will contribute such things as a SDE seems like it will be the same as
   when I was a PM.&amp;nbsp; It has been so far, at least.&amp;nbsp; If you have the insight
   and know how, when, and with&amp;nbsp;whom&amp;nbsp;to share and present&amp;nbsp;it, people will
   listen, regardless of your title.
&lt;/p&gt;
&lt;p&gt;
   Designing new things was also of course a creative activity I loved as a PM, but I’m
   doing more design work as a developer than when I was a PM.&amp;nbsp; Not all SDEs design
   higher-level things, but I do regularly and work closely with many architects, distinguished
   engineers, and technical fellows in the process.&amp;nbsp; Developers also get to design
   more at a slightly lower level of abstraction.&amp;nbsp; But everything's just an abstraction
   anyway, so the "level" doesn't matter much (to me) anyway.
&lt;/p&gt;
&lt;p&gt;
   Prior to PLINQ, my Sencha interpreter/compiler (Scheme at first and later, Common
   LISP) was my hobby development project.&amp;nbsp; (And, of course, there were many late
   nights spent on TopCoder.)&amp;nbsp; I was basically spending my days as a PM and my nights
   as a developer.&amp;nbsp; To be honest, I enjoy doing both things and, aside from the
   time it took to do both, it made me very happy.&amp;nbsp; But in retrospect, it turned
   out to be rather unhealthy.&amp;nbsp; Writing code was my sole hobby, and I evicted all
   of my pre-Microsoft hobbies from my system to make room for it.&amp;nbsp; Now I get to
   write code during the day, do the components of PM that I enjoyed most, and still
   preserve my sanity.&amp;nbsp; I’m just getting back into the things I used to love doing:
   writing more than just technical blog essays&amp;nbsp;and books, playing guitar, sports,
   working out, food and wine, and basically just getting outside and feeling healthier,
   both mentally and physically.&amp;nbsp; Maybe I'm getting old.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Fractured role structure&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   There are plenty of things I miss as a PM.&amp;nbsp; But I associate the absence of many
   such things with where we are with the PLINQ project.&amp;nbsp; High-level planning, becoming
   familiar with the competition and pertinent research in the area, thinking about product
   strategy, etc. are all certainly crucial activities throughout the project, but they
   are much more prevalent and involved at the outset.&amp;nbsp; As the project shifts into
   execution mode, there’s a lot of thinking about release plans, customer interaction,
   and team building and management.&amp;nbsp; I enjoy those things too, but I also love
   the design, architecture, and implementation of software.&amp;nbsp; I still get to do
   them, just not as frequently.&amp;nbsp; As a developer, you tend not to be involved in
   as many management discussions and decisions, but I can cope with this knowing I have
   a solid PM and management team working with me.&amp;nbsp; I know that if there's anything
   that requires my attention or where my feedback would be valuable, they won't hesitate
   to bring it to me.
&lt;/p&gt;
&lt;p&gt;
   To be completely honest, I dislike the completely fractured role structure that most
   of Microsoft employs.&amp;nbsp; (And “dislike” is putting it mildly.)&amp;nbsp; I do believe
   that people need to specialize, particularly as they grow in their career.&amp;nbsp; You
   simply can’t do it all and expect to move up to the next level of your career without
   abstracting some details.&amp;nbsp; But when you get down to it, there really isn’t much
   of a difference between PM, SDE, and SDE/T.&amp;nbsp; I've been doing interviews for PM
   and SDE lately, and&amp;nbsp;we expect one to have a better business- and customer-sense,
   while the&amp;nbsp;other needs to be solid algorithmically and implementation-wise, but
   there's a substantial overlap.&amp;nbsp; There are obviously certain responsibilities
   which are unique to each role, but more often than not, the roles are fluid and (when
   things are going well) people are able to fill in whatever gaps happen to arise that
   they are good at filling.&amp;nbsp; I just don’t think this kind of specialization necessarily
   needs to be forced.&amp;nbsp; Maybe I'm influenced by my own style of sitting on the edge
   between the two roles.&amp;nbsp; Each project needs its own unique structure, and some
   dedicated managers, but it doesn’t happen according to some magical formula.&amp;nbsp;
   As I understand things, this is how it works at Google, and just about every research
   department I’ve ever known (including MSR).
&lt;/p&gt;
&lt;p&gt;
   I should also mention that the grass isn't all a vibrant shade of green on the other
   side of the fence.&amp;nbsp; A PM gets to operate at a higher-level, seldom spending more
   than 10 minutes triaging and talking to a developer about any particular bug, for
   example.&amp;nbsp; In contrast, a developer must focus on details most of the time.&amp;nbsp;
   This might mean spending anywhere from 1 minute to 1 week on just a single bug.&amp;nbsp;
   Some people enjoy getting lost in details (in fact, it can help lead to flow, though
   bug fixing is more investigative work than anything else, which isn't as conducive).&amp;nbsp;
   Checking in a bug makes it really easy to quantify “success” and some people need
   this.&amp;nbsp; (Not me.)&amp;nbsp; I prefer more ambiguous tasks which usually means design
   or coding an entirely new algorithm, and I find fixing bugs tedious.&amp;nbsp; This means
   the late-in-the-game product cycle will be a little rough for me.&amp;nbsp; But that’s
   OK: the details are of course part of the engineering process, so I do it and don’t
   ever find myself thinking “wow, I dislike this” while I'm doing it.&amp;nbsp; A lot of
   developers tend to be tools geeks, too.&amp;nbsp; They love building complex ecosystems
   of engineering support tools.&amp;nbsp; I’m not into that.&amp;nbsp; I value solid engineering
   practices, but prefer things to be as simple as possible such that nothing gets in
   between me, the code, and the compiler.&amp;nbsp; Reality isn’t quite always like this,
   and&amp;nbsp;tools are often the most effective means to ensure certain quality properties&amp;nbsp;of
   your product,&amp;nbsp;but I still strive to eliminate (or avoid adding) as much unnecessary
   obstructions as possible.&amp;nbsp; A wise man once said "keep it as simple as possible,
   but no simpler."
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Some final words&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   At the end of the day, when I look at influential people I've bonded with&amp;nbsp;across
   the company, most (but certainly not all) rose up through the ranks as developers.&amp;nbsp;
   That’s clearly very subjective and&amp;nbsp;personal: that’s not to say there aren’t great
   PMs (past or present), only that most architects, distinguished engineers, technical
   fellows, and researchers have or are coders at heart.&amp;nbsp;&amp;nbsp; Moreover, I simply
   see myself being more successful as a SDE.&amp;nbsp; Not only have I done it for longer,
   but the career skills required to move from developer to architect to distinguished
   engineer (in Microsoft) align more closely with the skills I already have.&amp;nbsp; While
   PMs can move to architecture with time, it simply looks like a much longer road from
   where I stand.
&lt;/p&gt;
&lt;p&gt;
   And after saying all of this, I truly believe job title doesn’t matter that much at
   all.&amp;nbsp; Ability and good intuition&amp;nbsp;matter.&amp;nbsp; We’re all just shipping software.&amp;nbsp;
   At the end of the day, we do what needs to get done for that to happen, regardless
   of what hat we happen to be wearing at the time.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=3dd3eaa1-0482-48ce-a795-d099a6084334" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=6a4b440e-0558-4c33-ad41-798f4d44e155</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,6a4b440e-0558-4c33-ad41-798f4d44e155.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      [<strong>Update 2/19/07</strong>: the search for Jim has been <a href="http://www.siliconvalley.com/mld/siliconvalley/16732358.htm">called
      off after just about three weeks</a>.  Thanks to everybody who helped,
      and best wishes to Jim's family.]
   </p>
        <p>
          <a href="http://research.microsoft.com/~gray/">Jim Gray</a>, a Microsoft technical
      fellow who is best known for his seminal work on database transactions and data management,
      has been missing for almost a week.  He took his 40-foot sailboat, Tenacious, last
      Sunday to scatter the remains of his late mother near the Farallon Islands off the
      coast of California, and has been missing ever since.  <a href="http://www.mercurynews.com/mld/mercurynews/news/16583520.htm">This
      article has additional details.</a></p>
        <p>
      Although the Coast Guard has called off the search, friends and family are chartering
      private aircraft, scouring satellite imagery, and NASA even made a special run of
      its ER-2 aircraft to generate additional data.  <a href="http://www.allthingsdistributed.com/2007/02/high_altitude_search_for_jim_g.html">Werner
      Vogels has more information on his website, including how you can help with the
      search.</a></p>
        <p>
      Jim actually provided important feedback while I was thinking and writing about PLINQ,
      and was one of the most supportive and excited reviewers of the project.  Not to
      mention all of the papers he wrote or was involved with that inspired a lot of
      the direction.  I’d be very sad to see his life cut short, particularly in this
      way. 
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=6a4b440e-0558-4c33-ad41-798f4d44e155" />
      </body>
      <title>Jim Gray missing for nearly a week</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,6a4b440e-0558-4c33-ad41-798f4d44e155.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/02/04/JimGrayMissingForNearlyAWeek.aspx</link>
      <pubDate>Sun, 04 Feb 2007 02:06:00 GMT</pubDate>
      <description>&lt;p&gt;
   [&lt;strong&gt;Update 2/19/07&lt;/strong&gt;: the search for Jim has been &lt;a href="http://www.siliconvalley.com/mld/siliconvalley/16732358.htm"&gt;called
   off after&amp;nbsp;just about&amp;nbsp;three weeks&lt;/a&gt;.&amp;nbsp; Thanks to everybody who helped,
   and&amp;nbsp;best wishes to Jim's family.]
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://research.microsoft.com/~gray/"&gt;Jim Gray&lt;/a&gt;, a Microsoft technical
   fellow who is best known for his seminal work on database transactions and data management,
   has been missing for almost a week.&amp;nbsp; He took his 40-foot sailboat, Tenacious,&amp;nbsp;last
   Sunday to scatter the remains of his late mother near the Farallon Islands off the
   coast of California, and has been missing ever since.&amp;nbsp; &lt;a href="http://www.mercurynews.com/mld/mercurynews/news/16583520.htm"&gt;This
   article has additional details.&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Although the Coast Guard has called off the search, friends and family are chartering
   private aircraft, scouring satellite imagery, and NASA even made a special run of
   its ER-2 aircraft to generate additional data.&amp;nbsp; &lt;a href="http://www.allthingsdistributed.com/2007/02/high_altitude_search_for_jim_g.html"&gt;Werner
   Vogels has more information on&amp;nbsp;his website, including how you can help with the
   search.&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Jim actually provided important feedback while I was thinking and writing about PLINQ,
   and was one of the most supportive and excited reviewers of the project.&amp;nbsp; Not&amp;nbsp;to
   mention all of the&amp;nbsp;papers he wrote or was involved with that inspired a lot of
   the direction.&amp;nbsp; I’d be very sad to see his life cut short, particularly in this
   way. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=6a4b440e-0558-4c33-ad41-798f4d44e155" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=14cd51a6-c8e6-4e92-9e17-6b2e79503596</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,14cd51a6-c8e6-4e92-9e17-6b2e79503596.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://callvirt.net/blog/entry.aspx?entryid=95ec69f1-26f1-4f9d-a709-54e3439c860f">Joel
      tagged me</a> on this silly 5 things you didn't know about me meme.  Since it's
      floating around, and because I’d hate to disappoint a crazy Australian who’s apt to
      shoot vinegar in my eyes with a Super Soaker (woof, woof), I figure I'll give it a
      shot:
   </p>
        <ol>
          <li>
         I played in a heavy metal band when I was a teenager.  I was the lead guitarist,
         and loved to shred it up, with a sort of { 80's metal, 90's heavy metal, neo-classical, blues
         } style, influenced heavily by Slayer, Metallica, Pantera, GnR, Yngwie Malmsteen,
         Joe Satriani, and Stevie Ray Vaughan.  (Odd combination?  You bet!) 
         Don’t ask for pictures, I have conveniently "lost" them.  I stopped playing guitar
         for several years, but picked it back up in the past year and have been playing daily
         (focusing on building better music theory technical depth, but still shredding: my
         recent obsession is Dragonforce).  I also created several independent industrial
         and experimental techno CDs.  I try again every now and again, but I seem
         to have lost the patience. 
      </li>
          <li>
         I stopped playing in the heavy metal band because I "accidentally" punched a guy in
         the face in a mosh pit at a Sepultura concert.  This broke my hand in several
         places and was quite unpleasant.  (I did stay for the whole set, I'm happy to
         report.  The bar was kind enough to supply a plastic cup with some ice.) 
         The emergency room wrapped it in a cast, and then after 4 weeks, it had healed incorrectly. 
         So then I had to have it manually rebroken, and spent the entire summer in a new cast. 
         At the end, I had no hand or arm strength, my finger was crooked (making it hard to
         hold a pick), and my band had broken up because we couldn't play out (and they apparently
         didn't have the motivation to replace me temporarily).  This was the end of my
         dreams of being a rock star. 
      </li>
          <li>
         When I was 18 years old, I weighed a whopping 260 pounds.  Most of it was muscle,
         resulting from me working out literally every single day, and I have the stretch marks
         to show it.  I was a big dude, benched a little more than my weight, and even
         played center for a short period in high school football (I wasn’t keen on the fact
         that it’s apparently protocol that the quarterback routinely lays his hands on the
         center’s butt).  Now I weigh about 160 and have no muscle. 
      </li>
          <li>
         I started programming when I was 12.  This came about because a local gaming
         place (Gamer's Guild in Milford, MA) had set up a new BBS system, on which they provided
         several MUDs, MOOs, MUSHes, etc., on their Commodore Amiga 3000's and 4000. 
         I became hooked, especially when I found out you could get access to the source code
         and actually change it.  When CircleMUD came out, circa '92 (IIRC), I got serious
         about hacking code, doing the bulk of my MUD programming on a hand-assembled Slackware
         Linux 1.0 IBM PC.  Ironically, yours truly (a Microsoft employee) did most of
         his learning on the Linux OS, using GNU's C Compiler.  (I actually refused to
         use DOS until I started doing games programming that required graphics and found some
         cool DOS toolkits.  I refused Windows even longer, until I got sick of using
         'lynx' to browse the WWW.  I have always found Windows API programming,
         with UPPER_CASE type names everywhere, rather ugly and I simply didn't get it at first.) 
         I set up my own 8-line BBS and later in '94 converted to co-located Internet hosting,
         running a heavily modified CircleMUD (3.1?) for a year and a half.  There was
         typically around 20 players signed on at any given point. 
      </li>
          <li>
         I am VERY obsessive about things.  I want to buy as many books as I can get my
         hold on, read them all the time, write code every waking moment, drink wine every
         night, go out for 15 course dinners every night, play guitar and learn every scale,
         major and minor, mode, modification, chord, arpeggio, I like to work, work, work until
         I am barely awake, and so on.  It drives my friends completely nuts, but it keeps
         me busy.  I've been that way ever since I was a little kid, so I don't think
         it's going to change anytime soon.</li>
        </ol>
        <p>
      I don't know many people, so I'm going to commit meme heresy and not link to anybody
      else.  Sorry.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=14cd51a6-c8e6-4e92-9e17-6b2e79503596" />
      </body>
      <title>5 things you didn't know about me (off topic)</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,14cd51a6-c8e6-4e92-9e17-6b2e79503596.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/01/24/5ThingsYouDidntKnowAboutMeOffTopic.aspx</link>
      <pubDate>Wed, 24 Jan 2007 07:52:37 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;a href="http://callvirt.net/blog/entry.aspx?entryid=95ec69f1-26f1-4f9d-a709-54e3439c860f"&gt;Joel
   tagged me&lt;/a&gt; on this silly 5 things you didn't know about me meme.&amp;nbsp; Since it's
   floating around, and because I’d hate to disappoint a crazy Australian who’s apt to
   shoot vinegar in my eyes with a Super Soaker (woof, woof), I figure I'll give it a
   shot:
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      I played in a heavy metal band when I was a teenager.&amp;nbsp; I was the lead guitarist,
      and loved to shred it up,&amp;nbsp;with a sort of { 80's metal, 90's heavy metal,&amp;nbsp;neo-classical,&amp;nbsp;blues
      }&amp;nbsp;style, influenced heavily by Slayer, Metallica, Pantera, GnR, Yngwie Malmsteen,
      Joe Satriani, and Stevie Ray Vaughan.&amp;nbsp; (Odd combination?&amp;nbsp; You bet!)&amp;nbsp;
      Don’t ask for pictures, I have conveniently "lost" them.&amp;nbsp; I stopped playing guitar
      for several years, but picked it back up in the past year and have been playing daily
      (focusing on building better music theory technical depth, but still shredding: my
      recent obsession is Dragonforce).&amp;nbsp; I also&amp;nbsp;created several independent industrial
      and experimental techno CDs.&amp;nbsp; I try again&amp;nbsp;every now and again, but I seem
      to have lost the patience. 
   &lt;li&gt;
      I stopped playing in the heavy metal band because I "accidentally" punched a guy in
      the face in a mosh pit at a Sepultura concert.&amp;nbsp; This broke my hand in several
      places and was quite unpleasant.&amp;nbsp; (I did stay for the whole set, I'm happy to
      report.&amp;nbsp; The bar was kind enough to supply a plastic cup with some ice.)&amp;nbsp;
      The emergency room wrapped it in a cast, and then after 4 weeks, it had healed incorrectly.&amp;nbsp;
      So then I had to have it manually rebroken, and spent the entire summer in a new cast.&amp;nbsp;
      At the end, I had no hand or arm strength, my finger was crooked (making it hard to
      hold a pick), and my band had broken up because we couldn't play out (and they apparently
      didn't have the motivation to replace me temporarily).&amp;nbsp; This was the end of my
      dreams of being a rock star. 
   &lt;li&gt;
      When I was 18 years old, I weighed a whopping 260 pounds.&amp;nbsp; Most of it was muscle,
      resulting from me working out literally every single day, and I have the stretch marks
      to show it.&amp;nbsp; I was a big dude, benched a little more than my weight, and even
      played center for a short period in high school football (I wasn’t keen on the fact
      that it’s apparently protocol that the quarterback routinely lays his hands on the
      center’s butt).&amp;nbsp; Now I weigh about 160 and have no muscle. 
   &lt;li&gt;
      I started programming when I was 12.&amp;nbsp; This came about because a local gaming
      place (Gamer's Guild in Milford, MA) had set up a new BBS system, on which they provided
      several MUDs, MOOs, MUSHes, etc., on their Commodore Amiga 3000's and 4000.&amp;nbsp;
      I became hooked, especially when I found out you could get access to the source code
      and actually change it.&amp;nbsp; When CircleMUD came out, circa '92 (IIRC), I got serious
      about hacking code, doing the bulk of my MUD programming on a hand-assembled Slackware
      Linux 1.0 IBM PC.&amp;nbsp; Ironically, yours truly (a Microsoft employee) did most of
      his learning on the Linux OS, using GNU's C Compiler.&amp;nbsp; (I actually refused to
      use DOS until I started doing games programming that required graphics and found some
      cool DOS toolkits.&amp;nbsp; I refused Windows even longer, until I got sick of using
      'lynx' to browse the WWW.&amp;nbsp; I have always found Windows API&amp;nbsp;programming,
      with UPPER_CASE type names everywhere, rather ugly and I simply didn't get it at first.)&amp;nbsp;
      I set up my own 8-line BBS and later in '94 converted to co-located Internet hosting,
      running a heavily modified CircleMUD (3.1?) for a year and a half.&amp;nbsp; There was
      typically around 20 players signed on at any given point. 
   &lt;li&gt;
      I am VERY obsessive about things.&amp;nbsp; I want to buy as many books as I can get my
      hold on, read them all the time, write code every waking moment, drink wine every
      night, go out for 15 course dinners every night, play guitar and learn every scale,
      major and minor, mode, modification, chord, arpeggio, I like to work, work, work until
      I am barely awake, and so on.&amp;nbsp; It drives my friends completely nuts, but it keeps
      me busy.&amp;nbsp; I've been that way ever since I was a little kid, so I don't think
      it's going to change anytime soon.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   I don't know many people, so I'm going to commit meme heresy and not link to anybody
   else.&amp;nbsp; Sorry.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=14cd51a6-c8e6-4e92-9e17-6b2e79503596" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=200c3151-fbd5-4bfe-bb1e-0d6b90c6442b</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,200c3151-fbd5-4bfe-bb1e-0d6b90c6442b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I will be giving a PLINQ talk at the <a href="http://www.cs.cmu.edu/~damp/"><em>Declarative
      Aspects of Multicore Programming</em> (DAMP) workshop</a> at <a href="http://www.cs.ucsd.edu/popl/07/">POPL</a> next
      week:
   </p>
        <p>
          <em>[Update: 1/23/07 -- added a link to the slide deck below.]</em>
        </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <strong>
              <a href="/code/07/01/2007_01_POPL_DAMP_plinq.ppt">PLINQ: A Query Language
      for Data Parallel Programming</a>
            </strong>
          </p>
          <p>
            <em>Microsoft’s language integrated query (LINQ) technology provides an expressive
      syntax and suite of APIs which facilitate classic data parallel operations: filtering,
      mapping, reductions, loop tiling, sorts, nested loops parallelism, prefix scans, and
      more.  In this talk, we look at a new set of extensions to the LINQ technology,
      called parallel LINQ (PLINQ), which automatically optimizes and parallelizes query
      operations based on dynamic runtime information.  We believe that the use of
      a familiar SQL-like syntax will broaden the reach of PLINQ in industry, and provides
      programmers with a more declarative and flexible way of expressing data-intensive
      computations.</em>
          </p>
          <p>
            <em>
              <a href="/code/07/01/2007_01_POPL_DAMP_plinq.ppt">Download presentation (PPT).</a>
            </em>
          </p>
        </blockquote>
        <p>
      The workshop is being chaired by <a href="http://www.cs.cmu.edu/~guyb/">Guy Blelloch</a> from
      CMU, is located in <a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;q=nice,+france&amp;ie=UTF8&amp;z=13&amp;om=1&amp;iwloc=addr">Nice,
      France</a>, and features some interesting recent research in the field of
      parallel programming.  If anybody will be in town and wants to meet up, please
      drop me a line at joedu AT microsoft.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=200c3151-fbd5-4bfe-bb1e-0d6b90c6442b" />
      </body>
      <title>PLINQ talk at DAMP workshop (co-located with POPL 2007)</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,200c3151-fbd5-4bfe-bb1e-0d6b90c6442b.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2007/01/08/PLINQTalkAtDAMPWorkshopColocatedWithPOPL2007.aspx</link>
      <pubDate>Mon, 08 Jan 2007 21:09:41 GMT</pubDate>
      <description>&lt;p&gt;
   I will be giving a PLINQ talk at the &lt;a href="http://www.cs.cmu.edu/~damp/"&gt;&lt;em&gt;Declarative
   Aspects of Multicore Programming&lt;/em&gt; (DAMP) workshop&lt;/a&gt; at &lt;a href="http://www.cs.ucsd.edu/popl/07/"&gt;POPL&lt;/a&gt; next
   week:
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;[Update: 1/23/07 -- added a link to the slide deck below.]&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   &lt;strong&gt;&lt;a href="/code/07/01/2007_01_POPL_DAMP_plinq.ppt"&gt;PLINQ: A Query Language
   for Data Parallel Programming&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;Microsoft’s language integrated query (LINQ) technology provides an expressive
   syntax and suite of APIs which facilitate classic data parallel operations: filtering,
   mapping, reductions, loop tiling, sorts, nested loops parallelism, prefix scans, and
   more.&amp;nbsp; In this talk, we look at a new set of extensions to the LINQ technology,
   called parallel LINQ (PLINQ), which automatically optimizes and parallelizes query
   operations based on dynamic runtime information.&amp;nbsp; We believe that the use of
   a familiar SQL-like syntax will broaden the reach of PLINQ in industry, and provides
   programmers with a more declarative and flexible way of expressing data-intensive
   computations.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;&lt;a href="/code/07/01/2007_01_POPL_DAMP_plinq.ppt"&gt;Download presentation (PPT).&lt;/a&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   The workshop is being chaired by &lt;a href="http://www.cs.cmu.edu/~guyb/"&gt;Guy Blelloch&lt;/a&gt; from
   CMU, is located&amp;nbsp;in &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=nice,+france&amp;amp;ie=UTF8&amp;amp;z=13&amp;amp;om=1&amp;amp;iwloc=addr"&gt;Nice,
   France&lt;/a&gt;,&amp;nbsp;and features some interesting recent&amp;nbsp;research in the field of
   parallel programming.&amp;nbsp; If anybody will be in town and wants to meet up, please
   drop me a line at joedu AT microsoft.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=200c3151-fbd5-4bfe-bb1e-0d6b90c6442b" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=1d8ea5fe-845f-42d9-8785-b2860d9f8a04</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,1d8ea5fe-845f-42d9-8785-b2860d9f8a04.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      You might have noticed I'm blogging a lot more about native code than I used to. 
      Most of my day-to-day work still has to do with managed code, but I've been dazzled
      by all the new cool things in Vista that you can't do yet in managed code
      (and probably won't be able to for some time to come, since the CLR needs to keep
      running on old OSes).  And, besides, many low-level Windows changes impact managed
      code too, like <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,e40c2675-43a3-410f-8f85-616ef7b031aa.aspx">the
      fairness post</a> from last week.
   </p>
        <p>
      My question to you is:  Do you vehemently like or dislike either category of
      post?  Does the split between the two work?  I'm trying hard to
      keep it at about 50/50.  
   </p>
        <p>
      I'm wondering not just for blogging reasons.  As you might imagine, my book is
      looking to be very similar to my blog.  It is, after all, "Concurrent Programming
      on <em><u>Windows</u></em>", which sometimes involves using native code to access
      features that managed doesn't expose to you.  Similarly, the CLR gives you <em>many </em>things
      that Windows alone doesn't give you.  I'm trying <em>reeeeealllly</em> hard to
      ensure the prose is not schizophrenic, flows and progresses nicely, and doesn't
      repeat things: e.g. "here's how you do it in VC++, here's how you do it in C#, ..." 
      This can be a challenge for many things, but is obviously very important.  Thankfully
      a huge portion of the book is more about applying the technologies generally, which
      tends to be pretty common across both environments.
   </p>
        <p>
      So ... what do you think?
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=1d8ea5fe-845f-42d9-8785-b2860d9f8a04" />
      </body>
      <title>Poll: Managed, native, or both?</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,1d8ea5fe-845f-42d9-8785-b2860d9f8a04.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/12/22/PollManagedNativeOrBoth.aspx</link>
      <pubDate>Fri, 22 Dec 2006 19:56:18 GMT</pubDate>
      <description>&lt;p&gt;
   You might have noticed I'm blogging a lot more about native code than I used to.&amp;nbsp;
   Most of my day-to-day work still has to do with managed code, but I've been dazzled
   by all the new cool things&amp;nbsp;in Vista that you can't do&amp;nbsp;yet in managed code
   (and probably won't be able to for some time to come, since the CLR needs to keep
   running on old OSes).&amp;nbsp; And, besides, many low-level Windows changes impact managed
   code too, like &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,e40c2675-43a3-410f-8f85-616ef7b031aa.aspx"&gt;the
   fairness post&lt;/a&gt; from last week.
&lt;/p&gt;
&lt;p&gt;
   My question to you is: &amp;nbsp;Do you vehemently like or dislike either category of
   post?&amp;nbsp; Does the&amp;nbsp;split between the two work?&amp;nbsp;&amp;nbsp;I'm trying hard to
   keep it at about 50/50.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
   I'm wondering not just for blogging reasons. &amp;nbsp;As you might imagine, my book is
   looking to be very similar to my blog.&amp;nbsp; It is, after all, "Concurrent Programming
   on &lt;em&gt;&lt;u&gt;Windows&lt;/u&gt;&lt;/em&gt;", which sometimes involves using native code to access
   features that managed doesn't expose to you.&amp;nbsp; Similarly, the CLR gives you &lt;em&gt;many &lt;/em&gt;things
   that Windows alone doesn't give you.&amp;nbsp; I'm trying &lt;em&gt;reeeeealllly&lt;/em&gt; hard to
   ensure the prose is not schizophrenic, flows&amp;nbsp;and progresses nicely, and doesn't
   repeat things: e.g. "here's how you do it in VC++, here's how you do it in C#, ..."&amp;nbsp;
   This can be a challenge for many things, but is obviously very important.&amp;nbsp; Thankfully
   a huge portion of the book is more about applying the technologies generally, which
   tends to be&amp;nbsp;pretty common across both environments.
&lt;/p&gt;
&lt;p&gt;
   So ... what do you think?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=1d8ea5fe-845f-42d9-8785-b2860d9f8a04" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=97993858-1c91-4d90-9826-14987154c303</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,97993858-1c91-4d90-9826-14987154c303.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I recently left the CLR team to join a new team focusing on parallelism on Microsoft's
      platform in the 3-10 year timeframe.
   </p>
        <p>
      I am leading design and development of the Parallel LINQ (PLINQ) project that <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,81ca9c00-b43e-4860-b96b-4fd2bd735c9f.aspx">I
      alluded to here</a>.
   </p>
        <p>
      We're looking for supersmart technical people to join the team and help change
      the face of programming for anybody writing code on the CLR or VC++. PLINQ
      isn't the only project. Solid CS skills are a must, but you don't necessarily
      have to be a concurrency guru (right away).
   </p>
        <p>
      These job postings have some detail:
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <a href="http://members.microsoft.com/careers/search/results.aspx?FromCP=Y&amp;JobCategoryCodeID=&amp;JobLocationCodeID=&amp;JobProductCodeID=&amp;JobTitleCodeID=&amp;Divisions=&amp;TargetLevels=&amp;Keywords=2012%20&amp;JobCode=&amp;ManagerAlias=&amp;Interval=10">http://members.microsoft.com/careers/search/results.aspx?FromCP=Y&amp;JobCategoryCodeID=&amp;JobLocationCodeID=&amp;JobProductCodeID=&amp;JobTitleCodeID=&amp;Divisions=&amp;TargetLevels=&amp;Keywords=2012%20&amp;JobCode=&amp;ManagerAlias=&amp;Interval=10</a>
          </p>
        </blockquote>
        <p>
      If something catches your eye, respond on the jobs site or send me your resume directly at
      joedu AT you-know-where DOT com (i.e. microsoft DOT com).
   </p>
        <p>
      I'll of course still be blogging about everything concurrency related, so you won't
      notice much of a difference content-wise. And I'm still happy to answer any CLR related
      questions and help you find the right folks inside the team to listen to your feedback.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=97993858-1c91-4d90-9826-14987154c303" />
      </body>
      <title>A new role for me at Microsoft</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,97993858-1c91-4d90-9826-14987154c303.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/12/02/ANewRoleForMeAtMicrosoft.aspx</link>
      <pubDate>Sat, 02 Dec 2006 04:54:32 GMT</pubDate>
      <description>&lt;p&gt;
   I recently left the CLR team to join a new team focusing on parallelism on Microsoft's
   platform in the 3-10 year timeframe.
&lt;/p&gt;
&lt;p&gt;
   I am leading design and development of the Parallel LINQ (PLINQ) project that &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,81ca9c00-b43e-4860-b96b-4fd2bd735c9f.aspx"&gt;I
   alluded to here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   We're&amp;nbsp;looking for supersmart technical people to join the team and help change
   the face of programming for anybody writing&amp;nbsp;code on the CLR&amp;nbsp;or VC++. PLINQ
   isn't the only project.&amp;nbsp;Solid CS skills are a must, but&amp;nbsp;you don't necessarily
   have to be a concurrency guru (right away).
&lt;/p&gt;
&lt;p&gt;
   These job postings have some detail:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   &lt;a href="http://members.microsoft.com/careers/search/results.aspx?FromCP=Y&amp;amp;JobCategoryCodeID=&amp;amp;JobLocationCodeID=&amp;amp;JobProductCodeID=&amp;amp;JobTitleCodeID=&amp;amp;Divisions=&amp;amp;TargetLevels=&amp;amp;Keywords=2012%20&amp;amp;JobCode=&amp;amp;ManagerAlias=&amp;amp;Interval=10"&gt;http://members.microsoft.com/careers/search/results.aspx?FromCP=Y&amp;amp;JobCategoryCodeID=&amp;amp;JobLocationCodeID=&amp;amp;JobProductCodeID=&amp;amp;JobTitleCodeID=&amp;amp;Divisions=&amp;amp;TargetLevels=&amp;amp;Keywords=2012%20&amp;amp;JobCode=&amp;amp;ManagerAlias=&amp;amp;Interval=10&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   If something catches your eye, respond on the jobs site or send me your resume directly&amp;nbsp;at
   joedu AT you-know-where DOT com (i.e. microsoft DOT com).
&lt;/p&gt;
&lt;p&gt;
   I'll of course still be blogging about everything concurrency related, so you won't
   notice much of a difference content-wise. And I'm still happy to answer any CLR related
   questions and help you find the right folks inside the team to listen to your feedback.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=97993858-1c91-4d90-9826-14987154c303" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=474961a7-ec9b-4a9b-b01a-4aaa025d3858</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,474961a7-ec9b-4a9b-b01a-4aaa025d3858.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I just read Dijkstra’s <a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD13xx/EWD1303.html">"My
      recollection of operating system design"</a>, note #1303. He describes issues with
      the design and implementation of THE operating system, written several years afterward
      in retrospect. Theme-wise, he focuses on concurrency, resource management and scheduling,
      fault tolerance, and real-time considerations for fairness. I found the paper to be
      quite fascinating and easy to read. I enjoyed the theme of concurrency woven throughout,
      particularly reading about both the failed and successful approaches. The original
      hand-written note can be <a href="http://www.cs.utexas.edu/users/EWD/ewd13xx/EWD1303.PDF">found
      here</a>.
   </p>
        <p>
      Here are some choice quotes that I was drawn to with some comments by yours truly:
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>"... [with this] we have achieved CCC (= Completely Concealed Concurrency) in
      the sense that our two machines are now functionality equivalent in the sense that,
      fed with the same program, they will produce exactly the same output. As long as speed
      of execution is unobservable, it is impossible to determine which of the two machines
      did execute your program." (pp. 5)</em>
          </p>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
            <p>
      [Comment: Although the details are quite different, I was struck by CCC’s goal of
      isolation among tasks running concurrently in the system and its resemblance to STM,
      at least in terms of overarching design goals.]
   </p>
          </blockquote>
          <p>
            <em>"Thus CCC improved the efficiency ... but the comfortable invisibility of concurrency
      had a high price ... To maximize throughput, we would like each reader to read at
      its maximum speed most of the time ... but with CCC, the calculator has no means of
      identifying that input stream: the invisibility of concurrency has made the notion
      of "first-come-first-served" inapplicable. The moral of the story was that, essentially
      for the sake of efficiency, concurrency should become somewhat visible. It became
      so, and then, all hell broke loose." (pp. 7-8)</em>
          </p>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
            <p>
      [Comment: Again, STM often requires breaking this isolation to improve scalability
      of certain data structures, a la open nesting (see <a href="http://www.cs.utah.edu/wmpi/2006/final-version/wmpi-posters-1-Moss.pdf">Moss
      ’06</a>). Although there isn’t as much practical experience with such things, it is
      quite clear that open nesting can certainly cause all hell to break loose (see <a href="http://theory.csail.mit.edu/~kunal/open-mspc.pdf">Agrawal,
      et. al, '06</a>).)]
   </p>
          </blockquote>
          <p>
            <em>"In retrospect, the problems were in roughly three areas: (i) The basic mechanics
      of switching the central processor from one task to another, (ii) The strategy for
      scheduling the central processor and the scope of its commitment, (iii) The logical
      problems that emerge when a number of resources are shared by a number of competitors
      ... Those years taught me that the ability to detect timely that some theory is needed
      is crucial for successful software design." (pp. 9)</em>
          </p>
          <p>
            <em>"We learned to distinguish between "essential urgency," where failure to be in
      time would derail the computation, and "moral urgency," where the failure would only
      hurt the efficiency... [this] taught us that in resource allocation one could (and
      therefore should) separate the concerns of necessity and of desirability." (pp. 18)</em>
          </p>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
            <p>
      [Comment: This is a great lesson to learn when it comes to reliability in general.
      There is a large difference between <em>statistically</em> reliable and <em>completely</em> reliable.
      All software is statistically reliable to a degree, it’s only a matter of the statistical
      details, in particular the statistical frequency of failure, whereas very little software,
      at least on commercial non-real-time systems like Windows, is completely reliable,
      in other words, cannot fail.]
   </p>
          </blockquote>
          <p>
            <em>"With the symmetry between CPU and peripheral clearly understood, symmetric synchronizing
      primitives could not fail to be conceived and I introduced the operations P and V
      on semaphores. Initially my semaphores were binary ... When I showed this to Bram
      and Carel, Carel immediately suggested to generalize the binary semaphore to a natural
      semaphore ... How valuable this generalization was we would soon discover." (pp. 23-24)</em>
          </p>
          <p>
            <em>"Many peripherals could be designed in such a way that they did not confront the
      CPU with real-time obligations ... but the problem was, that these same devices would
      often now confront the CPU with situations of "moral urgency" ... The solution was
      to allow the CPU to build up a queue of commands and to enable the channel to switch
      without CPU intervention to the next command in the queue. Synchronization was controlled
      by two counting semaphores in what we now know as the producer/consumer arrangement
      ..." (pp. 24)</em>
          </p>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
            <p>
      [Comment: Obviously when scheduling concurrent tasks, e.g. in a user-mode scheduler,
      one has to worry about fairness and prioritization too. His writings are generally
      applicable.]
   </p>
          </blockquote>
          <p>
            <em>"In retrospect I am sorry that I postponed widespread publication until 1967 and
      think that I would have served mankind better if I had enabled The Evil One to improve
      its product." (pp. 27)</em>
          </p>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
            <p>
      [Comment: I had to laugh at this. Dijkstra wrote this regarding his design for semaphores
      and synchronizing channels, referring to IBM as "The Evil One" and IBM/360 as "its
      product". Times have changed things, but not by much: Microsoft is now, I suppose,
      "The Evil One," at least for many people.] 
   </p>
          </blockquote>
          <p>
            <em>"For economic reasons one wants to avoid in a multiprogramming system the so-called
      "busy form of waiting," in which the central processor is unproductively engaged in
      the waiting cycle of a temporarily stopped program, for it is better to grant the
      processor to a program that may actually proceed." (pp. 28)</em>
          </p>
          <p>
            <em>"Halfway the multiprogramming project in Eindhoven I realized that we would have
      been in grave difficulties had we not seen in time the possibility of definitely unintended
      deadlocks. From that experience we concluded that a successful systems designer should
      recognize as early as possible situations in which some theory was needed. In our
      case we needed enough theory about deadlocks and their prevention to develop what
      became known as "the banker's algorithm," without which the multiprogramming system
      would only have been possible in a very crude form." (pp. 36)</em>
          </p>
        </blockquote>
        <p dir="ltr">
      I hope at least one other person out there finds this interesting. We've certainly
      made progress over the past 40+ years, although maybe not as much as we think. As
      Dijkstra says in this note several times, perhaps one of the largest improvements
      in the state of the art since he worked on THE has been the development of terminology.
      It's incredibly hard to build on top of prior work if you haven't the terms to talk
      and reason about what has worked and what has failed.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=474961a7-ec9b-4a9b-b01a-4aaa025d3858" />
      </body>
      <title>Dijkstra: My recollection of operating system design</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,474961a7-ec9b-4a9b-b01a-4aaa025d3858.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/11/12/DijkstraMyRecollectionOfOperatingSystemDesign.aspx</link>
      <pubDate>Sun, 12 Nov 2006 18:25:59 GMT</pubDate>
      <description>&lt;p&gt;
   I just read Dijkstra’s &lt;a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD13xx/EWD1303.html"&gt;"My
   recollection of operating system design"&lt;/a&gt;, note #1303. He describes issues with
   the design and implementation of THE operating system, written several years afterward
   in retrospect. Theme-wise, he focuses on concurrency, resource management and scheduling,
   fault tolerance, and real-time considerations for fairness. I found the paper to be
   quite fascinating and easy to read. I enjoyed the theme of concurrency woven throughout,
   particularly reading about both the failed and successful approaches. The original
   hand-written note can be &lt;a href="http://www.cs.utexas.edu/users/EWD/ewd13xx/EWD1303.PDF"&gt;found
   here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   Here are some choice quotes that I was drawn to with some comments by yours truly:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   &lt;em&gt;"... [with this] we have achieved CCC (= Completely Concealed Concurrency) in
   the sense that our two machines are now functionality equivalent in the sense that,
   fed with the same program, they will produce exactly the same output. As long as speed
   of execution is unobservable, it is impossible to determine which of the two machines
   did execute your program." (pp. 5)&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   [Comment: Although the details are quite different, I was struck by CCC’s goal of
   isolation among tasks running concurrently in the system and its resemblance to STM,
   at least in terms of overarching design goals.]
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;em&gt;"Thus CCC improved the efficiency ... but the comfortable invisibility of concurrency
   had a high price ... To maximize throughput, we would like each reader to read at
   its maximum speed most of the time ... but with CCC, the calculator has no means of
   identifying that input stream: the invisibility of concurrency has made the notion
   of "first-come-first-served" inapplicable. The moral of the story was that, essentially
   for the sake of efficiency, concurrency should become somewhat visible. It became
   so, and then, all hell broke loose." (pp. 7-8)&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   [Comment: Again, STM often requires breaking this isolation to improve scalability
   of certain data structures, a la open nesting (see &lt;a href="http://www.cs.utah.edu/wmpi/2006/final-version/wmpi-posters-1-Moss.pdf"&gt;Moss
   ’06&lt;/a&gt;). Although there isn’t as much practical experience with such things, it is
   quite clear that open nesting can certainly cause all hell to break loose (see &lt;a href="http://theory.csail.mit.edu/~kunal/open-mspc.pdf"&gt;Agrawal,
   et. al, '06&lt;/a&gt;).)]
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;em&gt;"In retrospect, the problems were in roughly three areas: (i) The basic mechanics
   of switching the central processor from one task to another, (ii) The strategy for
   scheduling the central processor and the scope of its commitment, (iii) The logical
   problems that emerge when a number of resources are shared by a number of competitors
   ... Those years taught me that the ability to detect timely that some theory is needed
   is crucial for successful software design." (pp. 9)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;"We learned to distinguish between "essential urgency," where failure to be in
   time would derail the computation, and "moral urgency," where the failure would only
   hurt the efficiency... [this] taught us that in resource allocation one could (and
   therefore should) separate the concerns of necessity and of desirability." (pp. 18)&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   [Comment: This is a great lesson to learn when it comes to reliability in general.
   There is a large difference between &lt;em&gt;statistically&lt;/em&gt; reliable and&amp;nbsp;&lt;em&gt;completely&lt;/em&gt; reliable.
   All software is statistically reliable to a degree, it’s only a matter of the statistical
   details, in particular the statistical frequency of failure, whereas very little software,
   at least on commercial non-real-time systems like Windows, is completely reliable,
   in other words, cannot fail.]
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;em&gt;"With the symmetry between CPU and peripheral clearly understood, symmetric synchronizing
   primitives could not fail to be conceived and I introduced the operations P and V
   on semaphores. Initially my semaphores were binary ... When I showed this to Bram
   and Carel, Carel immediately suggested to generalize the binary semaphore to a natural
   semaphore ... How valuable this generalization was we would soon discover." (pp. 23-24)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;"Many peripherals could be designed in such a way that they did not confront the
   CPU with real-time obligations ... but the problem was, that these same devices would
   often now confront the CPU with situations of "moral urgency" ... The solution was
   to allow the CPU to build up a queue of commands and to enable the channel to switch
   without CPU intervention to the next command in the queue. Synchronization was controlled
   by two counting semaphores in what we now know as the producer/consumer arrangement
   ..." (pp. 24)&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   [Comment: Obviously when scheduling concurrent tasks, e.g. in a user-mode scheduler,
   one has to worry about fairness and prioritization too. His writings are generally
   applicable.]
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;em&gt;"In retrospect I am sorry that I postponed widespread publication until 1967 and
   think that I would have served mankind better if I had enabled The Evil One to improve
   its product." (pp. 27)&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   [Comment: I had to laugh at this. Dijkstra wrote this regarding his design for semaphores
   and synchronizing channels, referring to IBM as "The Evil One" and IBM/360 as "its
   product". Times have changed things, but not by much: Microsoft is now, I suppose,
   "The Evil One," at least for many people.] 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;em&gt;"For economic reasons one wants to avoid in a multiprogramming system the so-called
   "busy form of waiting," in which the central processor is unproductively engaged in
   the waiting cycle of a temporarily stopped program, for it is better to grant the
   processor to a program that may actually proceed." (pp. 28)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;"Halfway the multiprogramming project in Eindhoven I realized that we would have
   been in grave difficulties had we not seen in time the possibility of definitely unintended
   deadlocks. From that experience we concluded that a successful systems designer should
   recognize as early as possible situations in which some theory was needed. In our
   case we needed enough theory about deadlocks and their prevention to develop what
   became known as "the banker's algorithm," without which the multiprogramming system
   would only have been possible in a very crude form." (pp. 36)&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr&gt;
   I hope at least one other person out there finds this interesting. We've certainly
   made progress over the past 40+ years, although maybe not as much as we think. As
   Dijkstra says in this note several times, perhaps&amp;nbsp;one of the largest improvements
   in the state of the art since he worked on THE has been the development of terminology.
   It's incredibly hard to build on top of prior work if you haven't the terms to talk
   and reason about what has worked and what has failed.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=474961a7-ec9b-4a9b-b01a-4aaa025d3858" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=20a3f9c3-c33b-4403-8598-ed943b578f25</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,20a3f9c3-c33b-4403-8598-ed943b578f25.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      As many of you know, I'm right in the middle of writing a new book on concurrency.
      I'm curious what people would like to see covered and in what proportions.
   </p>
        <p>
      If you had $100 to spend as you see fit across any number of the following concurrency
      topics, how would you distribute it?
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
      (0) Parallel algorithms (Comp Sci., technology agnostic)<br />
      (1) Architecting large scale concurrent programs<br />
      (2) Windows concurrency internals<br />
      (3) CLR concurrency internals<br />
      (4) Windows (Win32) concurrency API best practices<br />
      (5) CLR concurrency API best practices<br />
      (6) Client-side concurrency<br />
      (7) Server-side concurrency<br />
      (8) Reusable concurrency primitives (building and using them)<br />
      (9) Performance and scalability<br />
      (A) Debugging
   </p>
        </blockquote>
        <p>
      I know there's some overlap and that each isn't entirely orthogonal, but that's okay.
      If there's something missing, feel free to add it to your response and allocate some funds
      for it.
   </p>
        <p>
      I'm looking forward to seeing what y'all think!
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=20a3f9c3-c33b-4403-8598-ed943b578f25" />
      </body>
      <title>Concurrency book -- what do you want to see?</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,20a3f9c3-c33b-4403-8598-ed943b578f25.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/10/21/ConcurrencyBookWhatDoYouWantToSee.aspx</link>
      <pubDate>Sat, 21 Oct 2006 21:24:14 GMT</pubDate>
      <description>&lt;p&gt;
   As many of you know, I'm right in the middle of writing a new book on concurrency.
   I'm curious what people would like to see covered and in what proportions.
&lt;/p&gt;
&lt;p&gt;
   If you had $100 to spend as you see fit across any number of the following concurrency
   topics, how would you distribute it?
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   (0) Parallel algorithms (Comp Sci., technology agnostic)&lt;br&gt;
   (1) Architecting large scale concurrent programs&lt;br&gt;
   (2) Windows concurrency internals&lt;br&gt;
   (3) CLR concurrency internals&lt;br&gt;
   (4) Windows (Win32) concurrency API best practices&lt;br&gt;
   (5) CLR concurrency API best practices&lt;br&gt;
   (6) Client-side concurrency&lt;br&gt;
   (7) Server-side concurrency&lt;br&gt;
   (8) Reusable concurrency primitives (building and using them)&lt;br&gt;
   (9) Performance and scalability&lt;br&gt;
   (A) Debugging
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   I know there's some overlap and that each isn't entirely orthogonal, but that's okay.
   If there's something missing, feel free to add it to your response and allocate some&amp;nbsp;funds
   for it.
&lt;/p&gt;
&lt;p&gt;
   I'm looking forward to seeing what y'all think!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=20a3f9c3-c33b-4403-8598-ed943b578f25" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=70bc2f85-57af-4bd2-8f11-0c795bb523c6</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,70bc2f85-57af-4bd2-8f11-0c795bb523c6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Here are the slides for my JAOO'06 talk <em>Concurrency and the composition of frameworks</em>:
   </p>
        <p>
          <a href="http://www.bluebytesoftware.com/blog/content/binary/JAOO-06__ConcurrencyAndFrameworks.ppt">JAOO-06__ConcurrencyAndFrameworks.ppt
      (2.06 MB)</a>
        </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=70bc2f85-57af-4bd2-8f11-0c795bb523c6" />
      </body>
      <title>JAOO'06 Slides: Concurrency and the composition of frameworks</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,70bc2f85-57af-4bd2-8f11-0c795bb523c6.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/10/02/JAOO06SlidesConcurrencyAndTheCompositionOfFrameworks.aspx</link>
      <pubDate>Mon, 02 Oct 2006 14:16:10 GMT</pubDate>
      <description>&lt;p&gt;
   Here are the slides for my JAOO'06 talk &lt;em&gt;Concurrency and the composition of frameworks&lt;/em&gt;:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.bluebytesoftware.com/blog/content/binary/JAOO-06__ConcurrencyAndFrameworks.ppt"&gt;JAOO-06__ConcurrencyAndFrameworks.ppt
   (2.06 MB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=70bc2f85-57af-4bd2-8f11-0c795bb523c6" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=493e5ed0-74b3-4d2b-af38-20cd059919ba</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,493e5ed0-74b3-4d2b-af38-20cd059919ba.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      The <a href="http://www.langnetsymposium.com/">Lang.NET Symposium</a> was held
      here in Redmond, WA last week.  My pal, <a href="http://research.microsoft.com/%7Eemeijer/">Erik
      Meijer</a>, the monadic maniac of <a href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/vbtv/">Head
      in the Box</a>, <a href="http://lambda-the-ultimate.org/">Lambda the Ultimate</a>,
      and now <a href="http://msdn.microsoft.com/vbasic/future/default.aspx?pull=/library/en-us/dnvs05/html/vb9overview.asp">VB
      9</a> fame, helped pull together the killer agenda, which is always a recipe for a
      good time.  Thottam, a PM on the CLR team, just <a href="http://blogs.msdn.com/thottams/default.aspx">posted a
      great summary</a> on his blog.  He sent it out over email last week, and
      I'm really glad he posted it for everyone else to see.  There are a bunch of
      good language geek links lurking within.  
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=493e5ed0-74b3-4d2b-af38-20cd059919ba" />
      </body>
      <title>Lang.NET Symposium '06 -- Thottam's write-up</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,493e5ed0-74b3-4d2b-af38-20cd059919ba.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/08/10/LangNETSymposium06ThottamsWriteup.aspx</link>
      <pubDate>Thu, 10 Aug 2006 03:42:02 GMT</pubDate>
      <description>&lt;p&gt;
   The&amp;nbsp;&lt;a href="http://www.langnetsymposium.com/"&gt;Lang.NET Symposium&lt;/a&gt; was held
   here in Redmond, WA&amp;nbsp;last week.&amp;nbsp;&amp;nbsp;My pal, &lt;a href="http://research.microsoft.com/%7Eemeijer/"&gt;Erik
   Meijer&lt;/a&gt;, the monadic maniac of &lt;a href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/vbtv/"&gt;Head
   in the Box&lt;/a&gt;,&amp;nbsp;&lt;a href="http://lambda-the-ultimate.org/"&gt;Lambda the Ultimate&lt;/a&gt;,
   and now &lt;a href="http://msdn.microsoft.com/vbasic/future/default.aspx?pull=/library/en-us/dnvs05/html/vb9overview.asp"&gt;VB
   9&lt;/a&gt; fame, helped pull together the killer agenda, which is always a recipe for a
   good time.&amp;nbsp; Thottam, a PM on the CLR team,&amp;nbsp;just &lt;a href="http://blogs.msdn.com/thottams/default.aspx"&gt;posted&amp;nbsp;a
   great summary&lt;/a&gt; on his blog.&amp;nbsp;&amp;nbsp;He sent it out over email last week, and
   I'm really glad he posted it for everyone else to see.&amp;nbsp; There are a bunch of
   good language geek links lurking within.&amp;nbsp; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=493e5ed0-74b3-4d2b-af38-20cd059919ba" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=921d64e7-d6e9-4cda-840b-da8f7cf219f1</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,921d64e7-d6e9-4cda-840b-da8f7cf219f1.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <title>A fun hack: Cross-process RWLock using Windows kernel objects</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,921d64e7-d6e9-4cda-840b-da8f7cf219f1.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/08/06/AFunHackCrossprocessRWLockUsingWindowsKernelObjects.aspx</link>
      <pubDate>Sun, 06 Aug 2006 23:29:13 GMT</pubDate>
      <description>&lt;p&gt;
   This falls into the "fun hacks" category, meaning&amp;nbsp;the result is&amp;nbsp;not necessarily
   something you'd want to use in your everyday life. To go a step further, I &lt;u&gt;strongly
   recommend&lt;/u&gt; you &lt;strong&gt;&lt;font color=#ff0000&gt;don't use the code shown here as-is&lt;/font&gt;&lt;/strong&gt;;
   read the summary at the end for some rationale behind that statement. Enough with
   the disclaimer. On with the show...
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Some requirements for our cross-process RWLock&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   Imagine you had the need for:
&lt;/p&gt;
&lt;p&gt;
   1. A managed reader/writer lock&lt;br&gt;
   2. that runs on down-level (pre-Vista) operating systems,&lt;br&gt;
   3. and that optionally works across process boundaries and AppDomains.
&lt;/p&gt;
&lt;p&gt;
   What do we already have that might fit the bill? The existing ReaderWriterLock type
   in the System.Threading namespace works fine for 1 and 2, but not 3. I suppose you
   could share it across AppDomains--or even processes--with some form of messaging scheme,
   but let's ignore that for a moment. It's a little *too* clever for my taste. Windows
   Vista of course comes with &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,17433c64-f45e-40f7-8772-dedb69ab2190.aspx"&gt;a
   new slim reader/writer lock&lt;/a&gt;. It's a close cousin of the Win32 CRITICAL_SECTION,
   and can be used for cross-AppDomain synchronization. Unfortunately, you have to P/Invoke
   to get at it from managed code, it won't run on pre-Vista operating systems, and doesn't
   work for cross-process scenarios.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Let's build it out of duct tape and barbed wire&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   It turns out that you can build a type that meets our requirements out of existing
   Windows kernel objects. All it takes is a little imagination. Here's what you need:
&lt;/p&gt;
&lt;p&gt;
   1. A semaphore to count the number of readers inside the lock.&lt;br&gt;
   2. A mutex to ensure only one writer can be in the lock at a time.&lt;br&gt;
   3. (Optionally) a manual-reset event used by writers to ensure no new readers enter
   the lock while it waits.
&lt;/p&gt;
&lt;p&gt;
   The scaffolding for one such implementation--which I will call the IpcReaderWriterLock--is
   as follows:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; IpcReaderWriterLock
   : &lt;/font&gt;&lt;span style="COLOR: teal"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;IDisposable&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;/**
   Fields **/&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;const&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; DEFAULT_MAX_READER_COUNT
   = 25;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;const&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; NAME_PREFIX
   = &lt;/font&gt;&lt;span style="COLOR: maroon"&gt;@"IpcRWL#"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private
   readonly&lt;/span&gt;&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; m_maxReaderCount;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; Semaphore
   m_readerSemaphore;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;EventWaitHandle&lt;/span&gt;&lt;font color=#000000&gt; m_blockReadsEvent;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;Mutex&lt;/span&gt;&lt;font color=#000000&gt; m_writerMutex;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; m_writerRecursionCount;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;/**
   Constructors **/&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; IpcReaderWriterLock()
   : &lt;/font&gt;&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;,
   DEFAULT_MAX_READER_COUNT) { }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; IpcReaderWriterLock(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; name)
   : &lt;/font&gt;&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;&lt;font color=#000000&gt;(name, DEFAULT_MAX_READER_COUNT)
   { }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; IpcReaderWriterLock(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; maxReaderCount)
   : &lt;/font&gt;&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;,
   maxReaderCount) { }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; IpcReaderWriterLock(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; name, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; maxReaderCount)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_maxReaderCount
   = maxReaderCount;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; blockReadsEventName
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; writerMutexName
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; readerSemaphoreName
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (name
   != &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;blockReadsEventName
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"{0}{1}#{2}"&lt;/span&gt;&lt;font color=#000000&gt;,
   NAME_PREFIX, name, &lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"RdEv"&lt;/span&gt;&lt;font color=#000000&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;writerMutexName
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"{0}{1}#{2}"&lt;/span&gt;&lt;font color=#000000&gt;,
   NAME_PREFIX, name, &lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"WrMtx"&lt;/span&gt;&lt;font color=#000000&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;readerSemaphoreName
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"{0}{1}#{2}"&lt;/span&gt;&lt;font color=#000000&gt;,
   NAME_PREFIX, name, &lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"RdSem"&lt;/span&gt;&lt;font color=#000000&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_blockReadsEvent
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;EventWaitHandle&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;span style="COLOR: teal"&gt;EventResetMode&lt;/span&gt;&lt;font color=#000000&gt;.ManualReset,
   blockReadsEventName);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerMutex
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;Mutex&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;&lt;font color=#000000&gt;,
   writerMutexName);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; Semaphore(maxReaderCount,
   maxReaderCount, readerSemaphoreName);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;/**
   Methods **/&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; Dispose()&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Just close all of the kernel objects we opened during construction.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Note: this method is not thread-safe. If threads race with&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   one another to call Dispose, some nasty bugs will arise.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (m_blockReadsEvent
   != &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_blockReadsEvent.Close();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_blockReadsEvent
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (m_writerMutex
   != &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerMutex.Close();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerMutex
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (m_readerSemaphore
   != &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore.Close();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore
   = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; EnterReadLock()
   { ... }&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; ExitReadLock()
   { ... }&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; EnterWriteLock()&amp;nbsp;
   { ... }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; ExitWriteLock()
   { ... }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Notice that we allow naming of the lock. Any name given flows into the kernel objects
   used underneath, enabling cross-process and cross-AppDomain communication. You just
   create the same IpcReaderWriterLock with the same name in multiple processes or AppDomains,
   and they will magically interact with one another (whether you want them to or not).
   An unnamed lock is isolated inside of the AppDomain in which it was created. Notice
   also that there's a maximum number of simultaneous readers, the default for which
   is 25. This isn't terribly important, but any override does impact performance (as
   described below).
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Read and write lock implementation&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   Now let's implement the read-lock acquisition and release functions, EnterReadLock
   and ExitReadLock. We support more than one reader at a time via the use of a semaphore
   (#1 above). We also support preventing blocking new readers from entering the lock
   while the writer waits for all readers to exit (#3 above). Thus, both of these functions
   are quite trivial to write:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; EnterReadLock()&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: teal"&gt;Thread&lt;/span&gt;&lt;font color=#000000&gt;.BeginCriticalRegion();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   We first wait on the read blocking event, in case a writer&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   has tried to acquire the lock and wants us to wait.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_blockReadsEvent.WaitOne();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Now take '1' from the reader semaphore to count the number&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   of simultaneous readers inside the lock.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore.WaitOne();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; ExitReadLock()&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Just release '1' back to the semaphore to let others know&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   the number of simultaneous readers just decreased.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore.Release();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: teal"&gt;Thread&lt;/span&gt;&lt;font color=#000000&gt;.EndCriticalRegion();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Next comes the write-lock acquisition and release functions, EnterWriteLock and ExitWriteLock.
   They are slightly more complicated, but not by much. First we acquire the writer mutex.
   Once we've done that, we increment the recursion count, and ensure that we do some
   other work only the first time a writer lock is acquired on the thread. We block any
   new readers from entering, and then we effectively wait for all readers to exit. We
   do that by acquiring the semaphore &lt;em&gt;n&lt;/em&gt; times, where &lt;em&gt;n&lt;/em&gt; is the maximum
   number of readers that we support. Releasing the write lock does the reverse of all
   of that:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; EnterWriteLock()&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: teal"&gt;Thread&lt;/span&gt;&lt;font color=#000000&gt;.BeginCriticalRegion();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   We have to first ensure only one writer can get in at a time.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerMutex.WaitOne();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Increment our recursion count.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerRecursionCount++;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   For the first writer who enters, we need to block new readers&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   and wait for any existing readers to exit the lock.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (m_writerRecursionCount
   == 1)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Next we block any new readers from entering the lock.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_blockReadsEvent.Reset();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   And lastly, we ensure that all readers have exited the lock.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   We do this by acquiring the semaphore's capacity. It's&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   unfortunate that the Win32 APIs don't support a take-n&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   function for semaphores.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;for&lt;/span&gt;&lt;font color=#000000&gt; (&lt;/font&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; i
   = 0; i &amp;lt; m_maxReaderCount; i++)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore.WaitOne();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; ExitWriteLock()&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   We have to do everything in the reverse order as we did&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   during acquisition. Not doing so can lead to subtle bugs,&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   including lost resets and deadlocks.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerRecursionCount--;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   The last writer to release has to signal readers.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (m_writerRecursionCount
   == 0)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   We release the semaphore's capacity back, enabling readers&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   to take from it. Note that as soon as we call this, other&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   threads may wake up and race to acquire the semaphore. In&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: green"&gt;//
   fact, simultaneous readers can get in, even though we still&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   have a writer in here!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_readerSemaphore.Release(m_maxReaderCount);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   Unblock any readers that are waiting. Note: ideally we would&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   do this after signaling writers, so that readers can't sneak&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   in before the writer, but that would be more complicated: we&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   keep it simple for now.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_blockReadsEvent.Set();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;//
   And lastly release the mutex.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_writerMutex.ReleaseMutex();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: teal"&gt;Thread&lt;/span&gt;&lt;font color=#000000&gt;.EndCriticalRegion();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   And that's it. A fully functioning reader/writer lock, for some definition of "functioning."
   The full source code can be found here: &lt;strong&gt;&lt;a href="/code/06/08/IpcReaderWriterLock.cs.txt"&gt;IpcReaderWriterLock.cs&lt;/a&gt;&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;The test case&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   This example wouldn't be complete with a simple test case to prove that it works.
   The sample program included in the IpcReaderWriterLock source code&amp;nbsp;creates 20
   threads--10 readers and 10 writers--in 10 AppDomains. Each does a piece of work designed
   to expose race conditions via context switching at sensitive points. It prints out
   "Success" at the end, assuming it all worked. I see "Success" every time I run it,
   so it works on my machine at least. Hooray.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Summary: Don't use this thing&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   OK, OK... this lock is pretty icky and nasty to be honest, and you probably wouldn't
   want to use it. Ever. A simple write-lock acquisition incurs 27 kernel transitions
   with the default settings. This ends up costing over 1000-times the cost a simple
   monitor acquisition! (Yes, there are three 0's in that number... ouch.) Moreover,
   the cost increases proportional to the number of simultaneous readers that the lock
   instance supports, which is not very good. That's why I've used such a low default:
   25.&amp;nbsp;And it's not very reliable either, which, for anything that does cross-AppDomain
   or cross-process synchronization can be disastrous. One process that crashes can lead
   to machine-wide corruption and a user who needs to reboot the machine.&amp;nbsp;A much
   better lock (performant, reliable, etc.) could be built using memory mapped files,
   although the implementation would be substantially more complicated.
&lt;/p&gt;
&lt;p&gt;
   I almost didn't write this post for all of these reasons. I'm not sure whether I'm
   doing a disservice to my readers by doing this. Instead, I hope that showing how simple
   Windows kernel objects can be composed together&amp;nbsp;in interesting, powerful, and
   non-obvious&amp;nbsp;ways is interesting, if only for trivia reasons. I'd also like to
   think that it may inspire you to think about things a little differently, perhaps
   helping you to write clever (but useful!) things out of the building blocks you already
   have.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=921d64e7-d6e9-4cda-840b-da8f7cf219f1" /&gt;</description>
      <category>Miscellaneous;Technology</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=71c4ba62-d2c4-4ba7-876d-9b60fb8bb810</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,71c4ba62-d2c4-4ba7-876d-9b60fb8bb810.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I'll be speaking at <a href="http://www.jaoo.dk/">JAOO'06</a> in Denmark this October.
      They have an entire track dedicated to concurrency. If you're in the area (or don't
      mind the travel), I highly recommend checking it out:
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>
              <strong>
                <a href="http://www.jaoo.dk/speakers/show_speaker.jsp?oid=67">Concurrency
      and the composition of frameworks</a>
              </strong>
            </em>
          </p>
          <p>
            <em>Abstract:<br /></em>Multi-core computer architectures pose both a threat and an opportunity to modern
      software. The amount of computing power that will soon be available will enable mainstream
      applications to solve problems that require computing power that has until recently
      only been available in supercomputers. But it also means that our software needs to
      evolve alongside to better support and enable the levels of concurrency we'll need
      to effectively use all of those cores. This fact applies as much to reusable software
      libraries as it does to applications themselves.
   </p>
          <p>
      This new direction imposes some new and interesting constraints on the architecture
      of reusable software components, including the need to remain thread agnostic, expose
      latency characteristics and mechanisms for hiding latency, and, for computationally
      expensive library routines, some way to carry them out in parallel based on the context
      in which they were called. These are all areas which have not yet been researched
      heavily and which commercial library vendors are only now beginning to seriously deal
      with.
   </p>
          <p>
      This talk presents an overview of the problem, identifies some key challenges, and
      proposes some direction for enabling our software to both take advantage of concurrency
      and to avoid inhibiting it. While the discussion has been derived from experiences
      on the Windows and .NET Framework platforms, the ideas presented aim to transcend
      any specific technology.
   </p>
          <em>
          </em>
        </blockquote>
        <p>
      If you're in Denmark and want to meet up to chat, definitely <a href="mailto:joe@bluebytesoftware.com">drop
      me a line</a>.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=71c4ba62-d2c4-4ba7-876d-9b60fb8bb810" />
      </body>
      <title>Upcoming speaking at JAOO'06: Concurrency and the composition of frameworks</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,71c4ba62-d2c4-4ba7-876d-9b60fb8bb810.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/06/29/UpcomingSpeakingAtJAOO06ConcurrencyAndTheCompositionOfFrameworks.aspx</link>
      <pubDate>Thu, 29 Jun 2006 20:00:24 GMT</pubDate>
      <description>&lt;p&gt;
   I'll be speaking at &lt;a href="http://www.jaoo.dk/"&gt;JAOO'06&lt;/a&gt; in Denmark this October.
   They have an entire track dedicated to concurrency. If you're in the area (or don't
   mind&amp;nbsp;the travel), I highly recommend checking it out:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   &lt;em&gt;&lt;strong&gt;&lt;a href="http://www.jaoo.dk/speakers/show_speaker.jsp?oid=67"&gt;Concurrency
   and the composition of frameworks&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;Abstract:&lt;br&gt;
   &lt;/em&gt;Multi-core computer architectures pose both a threat and an opportunity to modern
   software. The amount of computing power that will soon be available will enable mainstream
   applications to solve problems that require computing power that has until recently
   only been available in supercomputers. But it also means that our software needs to
   evolve alongside to better support and enable the levels of concurrency we'll need
   to effectively use all of those cores. This fact applies as much to reusable software
   libraries as it does to applications themselves.
&lt;/p&gt;
&lt;p&gt;
   This new direction imposes some new and interesting constraints on the architecture
   of reusable software components, including the need to remain thread agnostic, expose
   latency characteristics and mechanisms for hiding latency, and, for computationally
   expensive library routines, some way to carry them out in parallel based on the context
   in which they were called. These are all areas which have not yet been researched
   heavily and which commercial library vendors are only now beginning to seriously deal
   with.
&lt;/p&gt;
&lt;p&gt;
   This talk presents an overview of the problem, identifies some key challenges, and
   proposes some direction for enabling our software to both take advantage of concurrency
   and to avoid inhibiting it. While the discussion has been derived from experiences
   on the Windows and .NET Framework platforms, the ideas presented aim to transcend
   any specific technology.
&lt;/p&gt;
&lt;em&gt;&lt;/em&gt;&lt;/blockquote&gt; 
&lt;p&gt;
   If you're in Denmark and want to meet up to chat, definitely &lt;a href="mailto:joe@bluebytesoftware.com"&gt;drop
   me a line&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=71c4ba62-d2c4-4ba7-876d-9b60fb8bb810" /&gt;</description>
      <category>Miscellaneous;Technology</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=ea93007e-6f30-4dd0-beac-8e7a6e552fb6</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,ea93007e-6f30-4dd0-beac-8e7a6e552fb6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      It shouldn't be news to anybody that <a href="http://www.microsoft.com/presspass/press/2006/jun06/06-15CorpNewsPR.mspx">Bill
      is transitioning into a new role in 2 years</a>. I figured I'd dump some of my thoughts
      about this onto paper. Remember: This is in no way the official company view
      on the matter, nor is it motivated by any sort of company-private information.
   </p>
        <p>
      First, I am surprised that Bill didn't make this transition sooner. I think it's admirable
      how he's been able to maneuver through the technology details for so long. He
      refused to completely give up his technical edge. And I think it's cool
      that he can venture out into entirely new verticals with the premise in hand that
      all you need is a bunch of really smart, motivated people to succeed. It's risky. And
      it's a sort of an antithesis to traditionalist business management views.
   </p>
        <p>
      From talking to colleagues about this news, however, I think people tend to downplay
      the importance of having Bill around. Externally, there's no doubt he's a huge part
      of our PR, whether you like him or not. That's probably why the stock has been flat
      after the announcement. Not having him in charge of technical direction may open
      up some new avenues that we wouldn't have otherwise explored. New blood is always
      healthy. At the same time, though, it takes a functioning system and
      runs the risk of disrupting it. But I'm more worried about the internal
      climate...
   </p>
        <p>
      Just as Dave Cutler is a god to the NT Team, Bill is a role model for every technical
      person in the company. He's a geek. He talks like one, he looks like one, and he acts
      like one. He was very successful at a young age, was self-taught, and didn't
      need college to do and succeed at what he loved. And he has an inconceivable level
      of power and influence both within and outside the company. For a place
      that's full of uber-geek MS-for-lifers who joined the firm straight out of college,
      and who wouldn't think about leaving (with Bill around at least), all of these
      are very important traits. While Ray Ozzie is a very accomplished and intelligent
      guy, he's missing almost all of the traits I mentioned above. And I think people will
      notice.
   </p>
        <p>
      In the past month alone, I've had a BillG Review and received feedback from him on
      two spring ThinkWeek papers that I submitted. These were my first personal interactions
      with Bill, and perhaps my last. I was impressed. He's scary smart. There's
      no doubt he's very clever and can effortlessly cut through complexity to understand
      the core of really deep technical problems. There's no way the new senior
      technical leadership will have the same traits and to the same degree. It's not
      that they aren't great people. I've had several meetings with Craig Mundie recently,
      our CTO, and he's extraordinarily insightful and talented. I found myself blown away
      by some points he was making. But Bill's just too good to beat. 
   </p>
        <p>
      So here's the gist of it all. Microsoft in the past has been a technically motivated
      company. Bill's passion was around how we could use technology to change the world.
      But at the same time, he cared about how that technology was architected and built.
      He didn't simply spew MBA mumbo-jumbo. Microsoft feels like a company full of 100s
      of start-ups, each of which reports to the same technical leader, all fighting tooth
      and nail to build the greatest technology possible. I think all of that is going to
      change. I conjecture that we're at the beginning of a major shift, where Microsoft
      will slowly evolve from a technology-driven company to a business-driven company.
      The two are not mutually exclusive, obviously, but the balance will shift. We'll
      do more projects based on business reasons and less based on pure technology reasons.
      We'll waste less money in the process. It had to happen sooner or later. But
      for the geeks like me, I have to wonder whether it will remain as much of an enjoyable
      place to work. Or whether those who are looking for such an environment will be forced
      to go elsewhere...
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=ea93007e-6f30-4dd0-beac-8e7a6e552fb6" />
      </body>
      <title>My take on the BillG thing</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,ea93007e-6f30-4dd0-beac-8e7a6e552fb6.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/06/24/MyTakeOnTheBillGThing.aspx</link>
      <pubDate>Sat, 24 Jun 2006 18:37:00 GMT</pubDate>
      <description>&lt;p&gt;
   It shouldn't be news to anybody that &lt;a href="http://www.microsoft.com/presspass/press/2006/jun06/06-15CorpNewsPR.mspx"&gt;Bill
   is transitioning into a new role in 2 years&lt;/a&gt;. I figured I'd dump some of my thoughts
   about this onto paper.&amp;nbsp;Remember: This is in no way the official company view
   on the matter, nor is it motivated by any sort of company-private information.
&lt;/p&gt;
&lt;p&gt;
   First,&amp;nbsp;I am surprised that Bill didn't make this transition sooner. I think it's&amp;nbsp;admirable
   how he's been able to maneuver through the technology&amp;nbsp;details for so long. He
   refused to&amp;nbsp;completely give up his technical edge.&amp;nbsp;And I think it's cool
   that he can venture out into entirely new verticals with the premise in hand that
   all you need is a bunch of really smart, motivated people to succeed. It's risky.&amp;nbsp;And
   it's a sort of an antithesis to traditionalist business management views.
&lt;/p&gt;
&lt;p&gt;
   From talking to colleagues about this news, however, I think people tend to downplay
   the importance of having Bill around. Externally, there's no doubt he's a huge part
   of our PR, whether you like him or not.&amp;nbsp;That's probably why the stock has been&amp;nbsp;flat
   after the announcement. Not having him in charge of technical direction&amp;nbsp;may open
   up some new avenues that we wouldn't have otherwise explored. New blood is always
   healthy.&amp;nbsp;At the same time, though,&amp;nbsp;it takes a functioning&amp;nbsp;system and
   runs the risk of&amp;nbsp;disrupting it.&amp;nbsp;But I'm more worried about the internal
   climate...
&lt;/p&gt;
&lt;p&gt;
   Just as Dave Cutler is a god to the NT Team, Bill is a role model for every technical
   person in the company. He's a geek. He talks like one, he looks like one, and he acts
   like one. He was very successful at a young age, was&amp;nbsp;self-taught, and didn't
   need college to do and succeed at&amp;nbsp;what he loved. And he&amp;nbsp;has an inconceivable&amp;nbsp;level
   of&amp;nbsp;power and influence both within and outside the company.&amp;nbsp;For a place
   that's full of uber-geek MS-for-lifers who joined the firm straight out of college,
   and who&amp;nbsp;wouldn't think about leaving (with Bill around at least), all of these
   are very important traits. While Ray Ozzie is a very accomplished and intelligent
   guy, he's missing almost all of the traits I mentioned above. And I think people will
   notice.
&lt;/p&gt;
&lt;p&gt;
   In the past month alone, I've had a BillG Review and received feedback from him on
   two spring ThinkWeek papers that&amp;nbsp;I submitted. These were my first personal interactions
   with Bill, and perhaps my last. I was impressed. He's scary&amp;nbsp;smart.&amp;nbsp;There's
   no doubt he's very clever and can effortlessly cut through complexity to understand
   the core of really deep technical problems.&amp;nbsp;There's no way&amp;nbsp;the new senior
   technical leadership will have the same&amp;nbsp;traits and to the same degree. It's not
   that they aren't great people. I've had several meetings with Craig Mundie recently,
   our CTO, and he's extraordinarily insightful and talented. I found myself blown away
   by some points he was making.&amp;nbsp;But Bill's just too good to beat. 
&lt;/p&gt;
&lt;p&gt;
   So here's the gist of it all. Microsoft in the past has been a technically motivated
   company. Bill's passion was around how we could use technology to change the world.
   But at the same time, he cared about how that technology was architected and built.
   He didn't simply spew MBA mumbo-jumbo. Microsoft feels like a company full of 100s
   of start-ups, each of which reports to the same technical leader, all fighting tooth
   and nail to build the greatest technology possible. I think all of that is going to
   change. I conjecture that we're at the beginning of a major shift, where Microsoft
   will slowly evolve from a technology-driven company to a business-driven company.
   The two are&amp;nbsp;not mutually exclusive, obviously, but the balance will shift.&amp;nbsp;We'll
   do more projects based on business reasons and less based on pure technology reasons.
   We'll waste less money in the process.&amp;nbsp;It had to happen sooner or later. But
   for the geeks like me, I have to wonder whether it will remain as much of an enjoyable
   place to work. Or whether those who are looking for such an environment will be forced
   to go elsewhere...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=ea93007e-6f30-4dd0-beac-8e7a6e552fb6" /&gt;</description>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.bluebytesoftware.com/blog/Trackback.aspx?guid=8ff6d8b9-4334-4798-a336-739f077a6d27</trackback:ping>
      <pingback:server>http://www.bluebytesoftware.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.bluebytesoftware.com/blog/PermaLink,guid,8ff6d8b9-4334-4798-a336-739f077a6d27.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I'm writing an article for an upcoming MSDN Magazine <em>CLR Inside Out</em> column.
      And I am looking for topic suggestions.
   </p>
        <p>
      Of course, my expertise is around concurrency, but I'm also a CLR internals-kinda
      geek. So, what do you want to read about?
   </p>
        <p>
      I have some ideas. But I'll post them after I hear yours.
   </p>
        <img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=8ff6d8b9-4334-4798-a336-739f077a6d27" />
      </body>
      <title>MSDN mag - CLR Inside Out: What do you want to see?</title>
      <guid>http://www.bluebytesoftware.com/blog/PermaLink,guid,8ff6d8b9-4334-4798-a336-739f077a6d27.aspx</guid>
      <link>http://www.bluebytesoftware.com/blog/2006/04/17/MSDNMagCLRInsideOutWhatDoYouWantToSee.aspx</link>
      <pubDate>Mon, 17 Apr 2006 01:46:56 GMT</pubDate>
      <description>&lt;p&gt;
   I'm writing an article for&amp;nbsp;an upcoming&amp;nbsp;MSDN Magazine &lt;em&gt;CLR Inside Out&lt;/em&gt; column.
   And I am looking for topic suggestions.
&lt;/p&gt;
&lt;p&gt;
   Of course, my expertise is around concurrency, but I'm also a CLR internals-kinda
   geek. So, what do you want to read about?
&lt;/p&gt;
&lt;p&gt;
   I have some ideas. But I'll post them after I hear yours.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=8ff6d8b9-4334-4798-a336-739f077a6d27" /&gt;</description>
      <category>Miscellaneous;Technology</category>
    </item>
  </channel>
</rss>