<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.devmavens.com/~d/styles/itemcontent.css"?><rss version="2.0">
<channel>
    <title>DevMavens Feed</title>
    <link>http://DevMavens.com/</link>
    <description>DevMavens</description>
    <language>en-us</language>
    <docs>http://DevMavens.com/Rss</docs>
 
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.devmavens.com/Devmavens" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="devmavens" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>RavenDB workshop in NDC, Oslo 4-5th June</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/8FVedGXIJOY/ravendb-workshop-in-ndc-oslo-4-5th-june</link>
      <description>&lt;p&gt;
	The RavenDB workshop is coming to Oslo, Norway in June!&lt;/p&gt;
&lt;p&gt;
	Join us to an intensive RavenDB hands-on workshop just before the great NDC conference starts.&lt;/p&gt;
&lt;p&gt;
	During the first day of this workshop we will get to know RavenDB and its core concepts, get comfortable with its API, learn how to build and customize indexes, and how to correctly model data for use in a document database.&lt;/p&gt;
&lt;p&gt;
	After getting familiar with all the basics in the first day, during the second day we will build on that knowledge to properly grok Map&amp;frasl;Reduce, Multi&amp;ndash;maps and other advanced usages of indexes, learn how to extend RavenDB and the various options of scaling out.&lt;/p&gt;
&lt;p&gt;
	More details on the workshop and the conference can be found &lt;a href="http://www.ndcoslo.com/Workshop/ravendb"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/8FVedGXIJOY" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/8FVedGXIJOY/ravendb-workshop-in-ndc-oslo-4-5th-june"&gt;RavenDB workshop in NDC, Oslo 4-5th June&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/18QHX2y_NMXIEEAbbr8fWT-5BwA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/18QHX2y_NMXIEEAbbr8fWT-5BwA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/18QHX2y_NMXIEEAbbr8fWT-5BwA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/18QHX2y_NMXIEEAbbr8fWT-5BwA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 05 Feb 2012 15:00:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/8FVedGXIJOY/ravendb-workshop-in-ndc-oslo-4-5th-june</guid>
    </item>
 
    <item>
      <title>Limit your abstractions: Application Events&amp;ndash;the wrong way</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/EMS7JIJtEf0/limit-your-abstractions-application-eventsndash-the-wrong-way</link>
      <description>&lt;p&gt;In my previous post, I have taken a few interfaces from a &lt;a href="http://dddsample.sourceforge.net/index.html"&gt;DDD sample application&lt;/a&gt; and called the application procedural and hard to maintain. In this post, I want to show you exactly why.&lt;/p&gt; &lt;p&gt;We will start with examining this interface, and how it is used:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ayende.com/blog/Images/Windows-Live-Writer/Limit-your-abstractions-Application-Even_33F1/image_thumb%5B3%5D_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image_thumb[3]" border="0" alt="image_thumb[3]" src="http://ayende.com/blog/Images/Windows-Live-Writer/Limit-your-abstractions-Application-Even_33F1/image_thumb%5B3%5D_thumb.png" width="907" height="180"&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CargoInspectionServiceImpl : ICargoInspectionService 
{
  &lt;span class="rem"&gt;// code redacted for simplicity&lt;/span&gt;

 &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InspectCargo(TrackingId trackingId)
 {
    Validate.NotNull(trackingId, &lt;span class="str"&gt;"Tracking ID is required"&lt;/span&gt;);

    Cargo cargo = cargoRepository.Find(trackingId);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (cargo == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
      logger.Warn(&lt;span class="str"&gt;"Can't inspect non-existing cargo "&lt;/span&gt; + trackingId);
      &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    }

    HandlingHistory handlingHistory = handlingEventRepository.LookupHandlingHistoryOfCargo(trackingId);

    cargo.DeriveDeliveryProgress(handlingHistory);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (cargo.Delivery.Misdirected)
    {
      applicationEvents.CargoWasMisdirected(cargo);
    }

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (cargo.Delivery.UnloadedAtDestination)
    {
      applicationEvents.CargoHasArrived(cargo);
    }

    cargoRepository.Store(cargo);
 }
}&lt;/pre&gt;
&lt;p&gt;Can you see what I find painful in this code?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/EMS7JIJtEf0" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/EMS7JIJtEf0/limit-your-abstractions-application-eventsndash-the-wrong-way"&gt;Limit your abstractions: Application Events&amp;ndash;the wrong way&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/za5H9LlldKUtFIrvmZbvTJVJhck/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/za5H9LlldKUtFIrvmZbvTJVJhck/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/za5H9LlldKUtFIrvmZbvTJVJhck/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/za5H9LlldKUtFIrvmZbvTJVJhck/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 03 Feb 2012 12:45:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/EMS7JIJtEf0/limit-your-abstractions-application-eventsndash-the-wrong-way</guid>
    </item>
 
    <item>
      <title>Listen to Your Community, But Don't Let Them Tell You What to Do</title>
      <author>Jeff Atwood</author>
      <link>http://www.codinghorror.com/blog/2012/02/listen-to-your-community-but-dont-let-them-tell-you-what-to-do.html</link>
      <description>You know how interviewers love asking about your greatest weakness, or the biggest mistake you've ever made? These questions may sound formulaic, maybe even borderline cliche, but be careful when you answer: they are more important than they seem. &lt;hr /&gt;Read more: &lt;a href="http://www.codinghorror.com/blog/2012/02/listen-to-your-community-but-dont-let-them-tell-you-what-to-do.html"&gt;Listen to Your Community, But Don't Let Them Tell You What to Do&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/codinghorror"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OJIJj_mhmts12IfIfZSOiz4cOdY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OJIJj_mhmts12IfIfZSOiz4cOdY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OJIJj_mhmts12IfIfZSOiz4cOdY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OJIJj_mhmts12IfIfZSOiz4cOdY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 03 Feb 2012 07:18:54 GMT</pubDate>
      <guid>http://www.codinghorror.com/blog/2012/02/listen-to-your-community-but-dont-let-them-tell-you-what-to-do.html</guid>
    </item>
 
    <item>
      <title>A Handy Script For Compiling CoffeeScript On The Fly</title>
      <author>Rob Conery</author>
      <link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/3Tghg22hK8A/</link>
      <description>Rails 3.1 and beyond has the asset pipeline. Node has connect-assets, and there are plenty of "Just In Time" CoffeeScript compilers out there for other platforms as well. I like using a File Watcher - and here's my code. &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/wekeroad/EeKc/~3/3Tghg22hK8A/"&gt;A Handy Script For Compiling CoffeeScript On The Fly&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/wekeroad/EeKc"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rzq16GdJi5NMrZAtOSx-IgK_y1I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rzq16GdJi5NMrZAtOSx-IgK_y1I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rzq16GdJi5NMrZAtOSx-IgK_y1I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rzq16GdJi5NMrZAtOSx-IgK_y1I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 03 Feb 2012 07:04:18 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/3Tghg22hK8A/</guid>
    </item>
 
    <item>
      <title>Microsoft Doesn’t Read Their Own Terms of Service Apparently</title>
      <author>Rob Conery</author>
      <link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/Pr8PG8xBJJE/</link>
      <description>Every time Microsoft Marketing tries to make something "viral" it comes off as what my old baseball coach used to call a "Monkey F***ing a Football". It's just the same with their latest "Gmail Man" BS. &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/wekeroad/EeKc/~3/Pr8PG8xBJJE/"&gt;Microsoft Doesn’t Read Their Own Terms of Service Apparently&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/wekeroad/EeKc"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a_b_rrbUUby2DcGXwYF-DYAXGPA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a_b_rrbUUby2DcGXwYF-DYAXGPA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a_b_rrbUUby2DcGXwYF-DYAXGPA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a_b_rrbUUby2DcGXwYF-DYAXGPA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 03 Feb 2012 00:57:04 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/Pr8PG8xBJJE/</guid>
    </item>
 
    <item>
      <title>Limit your abstractions: Analyzing a DDD application</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/-ZBB9zUnjvo/limit-your-abstractions-analyzing-a-ddd-application</link>
      <description>&lt;p&gt;Abstractions have a cost. You should limit them. That seems like an obvious statement, but in a &lt;a href="https://plus.google.com/117570489094161918692/posts/KdwJdSm4jXm"&gt;recent discussion&lt;/a&gt; I had, I realized that I didn’t articulate things in quite the proper way before. &lt;/p&gt; &lt;p&gt;Let me see if I can explain better now. One of the problems in typical applications is that we don’t really think before we introduce abstractions. For the purpose of this discussion, an abstraction in an interface. Let us take a look at a sample DDD application.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Nitpicker corner: No, I am not saying avoid using interfaces.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I took all the interesting interfaces out of the application, you can see them here:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ayende.com/blog/Images/Windows-Live-Writer/Limit-your-abstractions_2687/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://ayende.com/blog/Images/Windows-Live-Writer/Limit-your-abstractions_2687/image_thumb_1.png" width="1075" height="509"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Take a look at those interfaces. They bother me. They bother me because each of them represent an abstraction that is specific for a particular problem. In other words, it represent an non-abstracted abstraction, if that make any sense.&lt;/p&gt; &lt;p&gt;As I said, this is taken a &lt;a href="http://dddsample.sourceforge.net/index.html"&gt;DDD sample application&lt;/a&gt;. It isn’t a big one (and no, I didn’t review the actual code to see if it is a good one), but the interfaces that it has reveal a common problem, namely, interface explosion, or over abstraction. I removed any infrastructure / persistence stuff that was in the app, so you are looking just at the business interfaces, mind.&lt;/p&gt; &lt;p&gt;The problem is that the way this application is structured, it is highly procedural and had to maintain.&lt;/p&gt; &lt;p&gt;Huh?! I can hear you say, procedural? This is a DDD app, just look at the names, we have services and facades and events and… those are all &lt;em&gt;good things&lt;/em&gt;. This design is pretty much text book. How can you say that this design is hard to maintain?&lt;/p&gt; &lt;p&gt;I’ll answer this question (and propose answers) in this series of posts. In the meantime, feel free to look at the code (it is Java, in its origin, and I simply modified it to C# for easier working) and make your own conclusions. &lt;/p&gt; &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/-ZBB9zUnjvo" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/-ZBB9zUnjvo/limit-your-abstractions-analyzing-a-ddd-application"&gt;Limit your abstractions: Analyzing a DDD application&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a9Zr9uNYyl6wDJM0Jgu9jfdrsqE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a9Zr9uNYyl6wDJM0Jgu9jfdrsqE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a9Zr9uNYyl6wDJM0Jgu9jfdrsqE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a9Zr9uNYyl6wDJM0Jgu9jfdrsqE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 12:43:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/-ZBB9zUnjvo/limit-your-abstractions-analyzing-a-ddd-application</guid>
    </item>
 
    <item>
      <title>Laptop Rebuild - Essential Apps</title>
      <author>Steve Smith</author>
      <link>http://ardalis.com/Laptop-Rebuild-ndash-Essential-Apps</link>
      <description>&lt;p&gt;&lt;em&gt;When we last saw our hero, he had &lt;/em&gt;&lt;a href="http://stevesmithblog.com/blog/vista-cleanup-may-corrupt-os-and-prevent-boot/"&gt;&lt;em&gt;fallen victim to an evil plot to disable his computer&amp;rsquo;s ability to boot up&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&amp;nbsp; After great efforts at recovery, eventually he was forced to concede defeat to Vista and reinstall everything from scratch.&amp;nbsp; Let&amp;rsquo;s return now to see what&amp;rsquo;s in store in the next chapter of our story, already in progress&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So, day 2 after my issue with Vista and I&amp;rsquo;m now at least able to use my laptop again for real work.&amp;nbsp; However, it still is missing dozens of little things that I find useful, so I thought I&amp;rsquo;d catalog those here in the spirit of &lt;a href="http://www.hanselman.com/blog/ScottHanselmans2007UltimateDeveloperAndPowerUsersToolListForWindows.aspx"&gt;Scott&lt;/a&gt; and &lt;a href="http://silverlight.net/blogs/jesseliberty/archive/2008/11/02/my-favorite-utilities.aspx"&gt;Jesse&amp;rsquo;s&lt;/a&gt; posts on useful tools and utilities.&amp;nbsp; In my case, this is a running list of things I&amp;rsquo;m installing, &lt;strong&gt;in order&lt;/strong&gt;, along with some commentary.&amp;nbsp; Feel free to comment on anything you think I&amp;rsquo;ve left out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 1 Basics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows Vista Ultimate SP1&lt;/strong&gt; &amp;ndash; Followed by about 40 immediate updates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual Studio Team Suite 2008 SP1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Office 2007 Ultimate SP1 &amp;ndash; &lt;/strong&gt;Followed by a bunch of updates, and switching from Windows Update to Microsoft Update so that Office automatically gets updated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;FireFox 3&lt;/a&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/search?q=firebug&amp;amp;cat=all"&gt;FireBug&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5369"&gt;YSlow&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Basic Utilities&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeplex.com/Terminals"&gt;Terminals&lt;/a&gt; &amp;ndash; &lt;/strong&gt;For all remote connection needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visio Professional 2007&lt;/strong&gt; &amp;ndash; Often handy, and it&amp;rsquo;s on the same MSDN disc as Office 2007.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3615"&gt;Del.icio.us Bookmarks FireFox Addin&lt;/a&gt; &amp;ndash; Makes &lt;a href="http://del.icio.us/"&gt;Del.icio.us&lt;/a&gt; easy to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The following tools just stay in my C:\Util folder and get restored from my backup.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx"&gt;DebugView&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fiddlertool.com/fiddler/version.asp"&gt;Fiddler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;ProcessMonitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.red-gate.com/products/reflector/"&gt;Reflector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sixty-five.cc/sm/v1x.php"&gt;SpaceMonger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://linqpad.net"&gt;LINQPad&lt;/a&gt; &amp;ndash; xcopyable LINQ and SQL and Code Snippet Editor/Manager.&amp;nbsp; Awesome!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Social Software (IM and Twitter)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pidgin.im/download/"&gt;Pidgin&lt;/a&gt; &amp;ndash; supports multiple IM clients and has some cool features like detecting when someone is writing an IM to you before they finish typing it.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tweetdeck.com/beta/"&gt;TweetDeck&lt;/a&gt; &amp;ndash; Current favorite Twitter app.&amp;nbsp; Follow me at &lt;a href="http://twitter.com/ardalis"&gt;@ardalis&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;More Apps&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.foldershare.com/"&gt;Foldershare&lt;/a&gt; &amp;ndash; Awesome for sharing files between computers.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.adobe.com/products/acrobat/readstep2_servefile.html?option=full&amp;amp;order=1&amp;amp;type=rs2_main&amp;amp;language=English&amp;amp;platform=WinVIS&amp;amp;hasjavascript=1&amp;amp;dlm=nos&amp;amp;rdr_ver=reader9&amp;amp;alt_offer_d=0"&gt;Adobe Reader&lt;/a&gt; (or &lt;a href="http://www.foxitsoftware.com/pdf/rd_intro.php"&gt;Foxit Reader&lt;/a&gt;) &amp;ndash; for PDFs.&amp;nbsp; Foxit installs and opens documents MUCH faster but occasionally has compatibility issues with Adobe.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clearcontext.com/"&gt;ClearContext&lt;/a&gt; &amp;ndash; Makes filing things a breeze in Outlook.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flickr.com/tools/"&gt;Flickr Uploadr&lt;/a&gt; &amp;ndash; Makes uploading photos a breeze w/Flickr.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slysoft.com/en/download.html"&gt;Virtual CloneDrive&lt;/a&gt; &amp;ndash; Trying this instead of Daemon Tools for ISO mounting.&amp;nbsp; So far I like it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL Server 2008&lt;/strong&gt; &amp;ndash; Had 2005 before, but figure now&amp;rsquo;s as good a time as any to upgrade.&amp;nbsp; We&amp;rsquo;ll see if I still need SQLPrompt with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I still have a lot more to go but this is where I am with reinstalling by day 3.&amp;nbsp; I still need an FTP client (FileZilla) and a bunch of other apps.&amp;nbsp; Debating whether to install Plaxo again.&amp;nbsp; Outlook is actually quite fast now that I just had it start with a fresh PST file, and I&amp;rsquo;m hoping to keep it that way since previously it was the slowest thing on my machine.&amp;nbsp; We&amp;rsquo;ll see.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uxsgBqW1KTXz3kg8RCkPmBTb9vU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uxsgBqW1KTXz3kg8RCkPmBTb9vU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uxsgBqW1KTXz3kg8RCkPmBTb9vU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uxsgBqW1KTXz3kg8RCkPmBTb9vU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=-p6mcx81Ngw:BsFjGXxHlX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=-p6mcx81Ngw:BsFjGXxHlX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=-p6mcx81Ngw:BsFjGXxHlX8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=-p6mcx81Ngw:BsFjGXxHlX8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=-p6mcx81Ngw:BsFjGXxHlX8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=-p6mcx81Ngw:BsFjGXxHlX8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/-p6mcx81Ngw" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://ardalis.com/Laptop-Rebuild-ndash-Essential-Apps"&gt;Laptop Rebuild - Essential Apps&lt;/a&gt; | &lt;a href="http://feeds.stevesmithblog.com/StevenSmith"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Nbbn1BLz0jaqsDpl_L03xNaqsOE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nbbn1BLz0jaqsDpl_L03xNaqsOE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Nbbn1BLz0jaqsDpl_L03xNaqsOE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nbbn1BLz0jaqsDpl_L03xNaqsOE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 07:27:50 GMT</pubDate>
      <guid>http://ardalis.com/Laptop-Rebuild-ndash-Essential-Apps</guid>
    </item>
 
    <item>
      <title>Stories Too Big - Vertical Slices</title>
      <author>Steve Smith</author>
      <link>http://ardalis.com/Stories-Too-Big-ndash-Vertical-Slices</link>
      <description>&lt;p&gt;I have a client who lists as one of the key challenges with implementing agile practices with their teams as managing to define user stories that are &lt;strong&gt;&lt;em&gt;valuable but not too big.&amp;nbsp; &lt;/em&gt;&lt;/strong&gt;This is actually a very common challenge, and one that we run into frequently ourselves at &lt;a href="http://lakequincy.com/"&gt;Lake Quincy Media&lt;/a&gt; and with other clients of &lt;a href="http://NimblePros.com/"&gt;NimblePros&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Naturally there are many books available on the subjects of extreme programming, agile software development, user stories, etc. and these are certainly worth reading.&amp;nbsp; Additionally, &lt;a href="http://www.headspringsystems.com/services/training/"&gt;an agile boot camp like HeadSpring&amp;rsquo;s&lt;/a&gt; can be an excellent way to fully immerse yourself in how things should be done, without the daily distractions of regular work.&amp;nbsp; My first word of advice is that you read what the experts suggest, and consider attending a class from a well-respected trainer if you can do so.&lt;/p&gt;
&lt;p&gt;That said, here is some simple, practical advice I&amp;rsquo;ve collected (from others) on the subject of writing useful stories.&amp;nbsp; First, there&amp;rsquo;s an acronym that you can use as a test to measure how effective a particular user story is.&amp;nbsp; This is taken from Bill Wake&amp;rsquo;s &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0201733978/aspalliancecom"&gt;eXtreme Programming Explored&lt;/a&gt; book.&amp;nbsp; He suggests that you &lt;a href="http://www.agile-software-development.com/2008/03/invest-in-good-user-stories_11.html"&gt;INVEST in good user stories&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good User Stories should be:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Independent &lt;br /&gt;Negotiable &lt;br /&gt;Valuable &lt;br /&gt;Estimatable (or Estimable) &lt;br /&gt;Small (&lt;a href="http://www.agile-software-development.com/2008/04/user-stories-should-be-small.html"&gt;more on small user stories&lt;/a&gt;) &lt;br /&gt;Testable&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would further suggest that these attributes are most important only when the time comes to plan for the story in an iteration.&amp;nbsp; That is, once it comes time to estimate the story and prioritize it as part of an iteration, it needs to exhibit the INVEST qualities.&amp;nbsp; Prior to that point, it&amp;rsquo;s perfectly acceptable as a placeholder even if it&amp;rsquo;s big and vague &amp;ndash; it can be broken down further when it&amp;rsquo;s closer to actually being done.&amp;nbsp; This exemplifies the lean principle of putting off decisions until the last responsible moment.&amp;nbsp; If you&amp;rsquo;re not going to get to the story next week, there&amp;rsquo;s no sense wasting time trying to estimate it or otherwise make it perfect. &lt;strong&gt; Things will change&lt;/strong&gt; before you start work on it, which will make at least some of your work &lt;strong&gt;waste&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Large, vague user stories are known as &lt;a href="http://kw-agiledevelopment.blogspot.com/2008/01/thats-not-user-story-thats-epic.html"&gt;Epics&lt;/a&gt;.&amp;nbsp; It&amp;rsquo;s fine (even efficient) to have Epic stories in the backlog &amp;ndash; it stops being fine once you begin an iteration.&amp;nbsp; That&amp;rsquo;s when the rubber meets the road and the actual stories need to be extracted from the larger epic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How Do You Break Up an Epic into Stories?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are a lot of different ways one could attack this problem &amp;ndash; and certainly more than one &amp;ldquo;right&amp;rdquo; way.&amp;nbsp; If we take the &amp;ldquo;epic / story&amp;rdquo; metaphor too far, we could say that every story arc has an introduction, a climax, and a prologue and that in between there are many chapters and character development, etc.&amp;nbsp; However, this viewpoint naturally imposes a serial constraint on the stories we develop, and would tend to lead to Story 1 which is required for Story 2 which is required for Story 3.&amp;nbsp; This violates the first attribute in our INVEST acronym, which is that the stories should be Independent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bad Example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A real world example of this serial approach that delivers nothing until everything is in place would be to create stories based on logical tiers in the software.&amp;nbsp; For instance, if you have a data-driven application consisting of UI, business tier, data access layer, and database (quite common), and for the sake of argument you have a hard dependency on each layer from the one above it (bad design, but quite common), then you might opt to write stories like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/StoriesTooBigVerticalSlices_C0A6/AppArchitecture-HorizontalStories_2.png"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="AppArchitecture-HorizontalStories" border="0" alt="AppArchitecture-HorizontalStories" align="right" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/StoriesTooBigVerticalSlices_C0A6/AppArchitecture-HorizontalStories_thumb.png" width="246" height="166" /&gt;&lt;/a&gt;Story 1: Create the new DB Table &lt;br /&gt;Story 2: Create the stored procedures &lt;br /&gt;Story 3: Create the DAL to access the sprocs &lt;br /&gt;Story 4: Create the business layer code that references the DAL &lt;br /&gt;Story 5: Write the UI screen&lt;/p&gt;
&lt;p&gt;You can think of each of these stories as addressing a &lt;em&gt;horizontal&lt;/em&gt; layer in the application architecture.&amp;nbsp; The problem with this is that it&amp;rsquo;s very difficult to start Stories 2-4 without the previous story being done.&amp;nbsp; About the only parallelization you can easily achieve here would be the UI, and with strong coupling it would also be very difficult to test things along the way.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An Alternate Approach &amp;ndash; Vertical Slices&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An alternate approach is to break down the epic into stories that very small yet still valuable bits of &lt;em&gt;vertical&lt;/em&gt; functionality.&amp;nbsp; For instance, let&amp;rsquo;s say the initial story is for a user registration page that collects a lot of different data.&amp;nbsp; There&amp;rsquo;s name data.&amp;nbsp; There&amp;rsquo;s room for multiple addresses.&amp;nbsp; There&amp;rsquo;s email and phone info.&amp;nbsp; There&amp;rsquo;s some validation logic.&amp;nbsp; Using the horizontal approach, someone might have generated the Registration Page user interface, and from there a data model, tables, sprocs, etc.&amp;nbsp; If at any point someone got stuck, nothing would be ready to deliver and so none of the stories would be providing value until all of them were produced.&amp;nbsp; Using vertical slices, this might break down like so:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/StoriesTooBigVerticalSlices_C0A6/AppArchitecture-VerticalStories_2.png"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="AppArchitecture-VerticalStories" border="0" alt="AppArchitecture-VerticalStories" align="right" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/StoriesTooBigVerticalSlices_C0A6/AppArchitecture-VerticalStories_thumb.png" width="246" height="166" /&gt;&lt;/a&gt; Story 1: User can register and provide username and password. &lt;br /&gt;Story 2: User can provide name data. &lt;br /&gt;Story 3: User can provide an address. &lt;br /&gt;Story 4: User can manage multiple addresses. &lt;br /&gt;Story 5: User can add additional contact fields (phone, email, etc).&lt;/p&gt;
&lt;p&gt;All of the stories most likely still depend on the first one in this case, and you&amp;rsquo;ll rarely be able to completely eliminate all dependencies between stories in an epic.&amp;nbsp; But now it would be possible to develop all 5 stories independently.&amp;nbsp; They might even be written using some kind of control (web, WPF, AJAX, doesn&amp;rsquo;t matter what UI technology) such that they would be simple to stitch together on a single UI page or kept separated to form some kind Registration Wizard multi-step process.&amp;nbsp; And if the iteration ends and only Stories 1 and 2 are done?&amp;nbsp; &lt;strong&gt;You ship it&lt;/strong&gt; (or at least demo it to the customer) and &lt;strong&gt;get feedback earlier&lt;/strong&gt; than you otherwise would have, which helps ensure that what you&amp;rsquo;re driving toward really is the correct solution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned, there are many ways to split epics into individual stories.&amp;nbsp; The details of your application and other variables will influence what technique is best for the given situation.&amp;nbsp; However, if you remember the key attributes of good user stories and focus on being able to deliver &lt;em&gt;something&lt;/em&gt;, however small, of value to the customer as quickly as possible, you&amp;rsquo;ll very likely end up with stories that are about the right size.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/p4r6DX-St78bK5dDUTmKJQ0aIVo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p4r6DX-St78bK5dDUTmKJQ0aIVo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/p4r6DX-St78bK5dDUTmKJQ0aIVo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p4r6DX-St78bK5dDUTmKJQ0aIVo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=y66K8OSrdLI:EZCG4K5DKPg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=y66K8OSrdLI:EZCG4K5DKPg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=y66K8OSrdLI:EZCG4K5DKPg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=y66K8OSrdLI:EZCG4K5DKPg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=y66K8OSrdLI:EZCG4K5DKPg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=y66K8OSrdLI:EZCG4K5DKPg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/y66K8OSrdLI" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://ardalis.com/Stories-Too-Big-ndash-Vertical-Slices"&gt;Stories Too Big - Vertical Slices&lt;/a&gt; | &lt;a href="http://feeds.stevesmithblog.com/StevenSmith"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZvRzwlyQ-AZv6sE9Y9QwM0Rs_sI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZvRzwlyQ-AZv6sE9Y9QwM0Rs_sI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZvRzwlyQ-AZv6sE9Y9QwM0Rs_sI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZvRzwlyQ-AZv6sE9Y9QwM0Rs_sI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 07:27:03 GMT</pubDate>
      <guid>http://ardalis.com/Stories-Too-Big-ndash-Vertical-Slices</guid>
    </item>
 
    <item>
      <title>XBox 360 - Home Media Center</title>
      <author>Steve Smith</author>
      <link>http://ardalis.com/XBox-360-ndash-Home-Media-Center</link>
      <description>&lt;p&gt;Recently I picked up an &lt;a href="http://www.amazon.com/gp/product/B000UY1WSK?ie=UTF8&amp;amp;tag=aspalliancecom&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000UY1WSK"&gt;HP MediaSmart EX470 Windows Home Server&lt;/a&gt; to help consolidate my files at home and to provide a simple backup solution.&amp;nbsp; It&amp;rsquo;s been great and it&amp;rsquo;s an extremely economical way to get backups.&amp;nbsp; You can hook it up with Amazon S3 using &lt;a href="http://jungledisk.com/homeserver/index.aspx"&gt;JungleDisk&lt;/a&gt; and get simple offsite backup of the files (but not the backups) easily and cheaply as well, and JungleDisk is just one of many plugins available.&amp;nbsp; I recommend the 500GB version for the price, as &lt;a href="http://www.amazon.com/gp/product/B00066IJPQ?ie=UTF8&amp;amp;tag=aspalliancecom&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00066IJPQ"&gt;you can pick up a 1.5TB hard drive to plug into one of the extra bays for under $150&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the many plugins for the WHS is a media streaming one that makes it very easy to use the WHS from your XBox 360.&amp;nbsp; With this, it becomes trivial to use the XBox to browse pictures, watch slideshows, watch video clips, and play music.&amp;nbsp; Sometimes the lag is pretty bad when the XBox is trying to load a list of items, but this is likely just due to my wireless network and the significant distance between my XBox and my router and WHS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestion 1: Support Streaming Video&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As much as I love this, there is certainly room for improvement around the XBox&amp;rsquo;s media capabilities.&amp;nbsp; First of all, as I mentioned in my previous post, you can download HD content for the XBox from the video marketplace, but the files are (as you would expect) quite large, and unfortunately you can&amp;rsquo;t start watching the movie until it&amp;rsquo;s been downloaded (or at least, I wasn&amp;rsquo;t able to start playing it after it had downloaded 20% over the course of half an hour the other day &amp;ndash; I went to bed before it reached 100%).&amp;nbsp; It would be great if the XBox video marketplace supported streaming downloads, &lt;a href="http://stevesmithblog.com/blog/online-media-and-the-death-of-drm/#comment-377"&gt;as one of my commenters on another post reports the AppleTV does&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestion 2: Consolidate XBox 360, WMP, Zune into Unified Media Story&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d also like to improve the music playing experience.&amp;nbsp; Currently, there is no way to save a playlist using the XBox interface unless the songs are stored on the XBox.&amp;nbsp; It does support playlists on the media server it&amp;rsquo;s connecting to, but not Zune playlists.&amp;nbsp; So if you&amp;rsquo;re a Zune user, you have to duplicate your playlists using Windows Media Player so that the XBox can use them, and you have to do all of this from your computer, not your XBox because the XBox can&amp;rsquo;t store playlists that include songs that aren&amp;rsquo;t on the XBox.&amp;nbsp; It&amp;rsquo;s very uncoordinated in its current state, and not the kind of seamless application sharing that Microsoft is well-known for in other areas, such as Office.&amp;nbsp; I&amp;rsquo;d really like to see some consolidation between Zune, Windows Media Player, and the XBox so that it&amp;rsquo;s much easier for these technologies to work together.&amp;nbsp; Microsoft needs one ring to rule them all (and not the RROD).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestion 3: Allow Upgrades to the XBox at Market Value&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I can get a &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fs%3Fie%3DUTF8%26x%3D0%26ref%255F%3Dnb%255Fss%255Fgw%26y%3D0%26field-keywords%3Dhard%2520drive%26url%3Dsearch-alias%253Daps&amp;amp;tag=aspalliancecom&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957"&gt;1.5 TB hard drive for under $150&lt;/a&gt;.&amp;nbsp; I can get a &lt;a href="http://www.amazon.com/gp/product/B000ERAON2?ie=UTF8&amp;amp;tag=aspalliancecom&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000ERAON2"&gt;2GB flash memory drive for $1.85&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Market Hard Drive Cost: $0.10 per GB &lt;br /&gt;Market Flash Drive Cost: $0.92 per GB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, how much is for an XBox Hard Drive?&amp;nbsp; Retail for the 120GB unit is $150, &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16874103062&amp;amp;nm_mc=OTC-Froogle&amp;amp;cm_mmc=OTC-Froogle-_-Xbox+360+-+Accessories-_-Microsoft-_-74103062"&gt;NewEgg has it right now for $135&lt;/a&gt;.&amp;nbsp; How about a 2GB memory unit?&amp;nbsp; Oh, wait, they don&amp;rsquo;t have those.&amp;nbsp; 1GB?&amp;nbsp; Nope.&amp;nbsp; But you can get a state-of-the-art &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16874103061"&gt;512MB unit for just $40&lt;/a&gt;.&amp;nbsp; My *phone* has more memory on its MicroSD card (300% more), and the MicroSD card is about 1/20th the size of the XBox memory card.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XBox Hard Drive Cost: $1.13 per GB (more than 10x market price) &lt;br /&gt;XBox Flash Drive Cost: $80 per GB (more than 80x market price)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apparently &lt;a href="http://www.pcworld.com/article/150970/upgrade_your_xbox_360s_hard_drive_on_the_cheap.html"&gt;you can upgrade your hard drive yourself without being limited to a mere 120GB overpriced unit, as this PCWorld article shows&lt;/a&gt;.&amp;nbsp; I&amp;rsquo;m not aware of a similar way to create a cheaper memory unit.&amp;nbsp; Oh, and it&amp;rsquo;s also annoying that the XBox supports up to 4 players but only 2 memory units.&amp;nbsp; What if all 4 people have XBox Live Accounts they want to use, with the profiles on their memory units?&lt;/p&gt;
&lt;p&gt;Either Microsoft should put out supported upgrades for the hard drives and memory units that are at least in the same ballpark as market values (even 2x as expensive would be fine w/me, honestly, but 10x and 80x is a bit extreme), or, better yet, they should allow the use of standard electronics like USB flash drives and USB hard drives.&amp;nbsp; I understand part of the reluctance to do this is to make hacking and cheating more difficult, so I would settle for the first option (and I&amp;rsquo;m sure Microsoft&amp;rsquo;s sales of these peripherals would be quite good, too).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VDj-3eTJ-_gLIPuma95DgU75iGk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VDj-3eTJ-_gLIPuma95DgU75iGk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VDj-3eTJ-_gLIPuma95DgU75iGk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VDj-3eTJ-_gLIPuma95DgU75iGk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=DxT0wXQ48rA:3yl_9-0OR4g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=DxT0wXQ48rA:3yl_9-0OR4g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=DxT0wXQ48rA:3yl_9-0OR4g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=DxT0wXQ48rA:3yl_9-0OR4g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=DxT0wXQ48rA:3yl_9-0OR4g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=DxT0wXQ48rA:3yl_9-0OR4g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/DxT0wXQ48rA" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://ardalis.com/XBox-360-ndash-Home-Media-Center"&gt;XBox 360 - Home Media Center&lt;/a&gt; | &lt;a href="http://feeds.stevesmithblog.com/StevenSmith"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aHEwyrsqLOHcPinCHvq-CHMB1lQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aHEwyrsqLOHcPinCHvq-CHMB1lQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aHEwyrsqLOHcPinCHvq-CHMB1lQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aHEwyrsqLOHcPinCHvq-CHMB1lQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 07:26:17 GMT</pubDate>
      <guid>http://ardalis.com/XBox-360-ndash-Home-Media-Center</guid>
    </item>
 
    <item>
      <title>Learning To Code with the Azure SDK - Show Me The Code</title>
      <author>Steve Smith</author>
      <link>http://ardalis.com/Learning-To-Code-with-the-Azure-SDK-ndash-Show-Me-The-Code</link>
      <description>&lt;p&gt;I&amp;rsquo;ve been working with Azure off and on since last summer, and like any new API or platform, there are hurdles involved with the learning curve.&amp;nbsp; This is especially true for pre-release software that is rapidly changing and of course has neither official documentation nor much in the way of info on blogs or &lt;a href="http://aspalliance.com/"&gt;developer community sites like ASPAlliance.com&lt;/a&gt;.&amp;nbsp; One of the ways I like to learn about projects these days is through testing.&amp;nbsp; Ideally, the project will already have a suite of unit tests that I can run to confirm that it actually works at least as well as its creators expect it to, and then I can look at individual tests to discover how the creators of the API expect others to use it.&amp;nbsp; Like many other developers, I usually don&amp;rsquo;t bother to read the official documentation (I&amp;rsquo;ve come to expect it will be lacking), preferring instead a &amp;ldquo;Show Me The Code (SMTC)&amp;rdquo; approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Show Me The Code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The big benefit of SMTC is that you don&amp;rsquo;t have to worry about whether or not the documentation was properly updated between the previous CTP release and the preview alpha CTP pre-release daily build you&amp;rsquo;re using now.&amp;nbsp; You run the code, and if it does what it&amp;rsquo;s supposed to do, then you know you have a system that is more-or-less working and you can go from there.&amp;nbsp; Most SDKs include samples to help you get started, with full source code, as obviously this is one of the best ways developers can quickly get up to speed with a new set of tools.&lt;/p&gt;
&lt;p&gt;Azure&amp;rsquo;s SDK as of the January CTP ships with about 9 folders worth of samples, including a couple of HelloWorld projects, a PersonalWebSite, a CloudDrive demo that lets you map a drive to cloud storage, and more.&amp;nbsp; If you want to take advantage of Azure Storage on your local machine, then you&amp;rsquo;ll most likely run the sample storage client API sample so you can get up to speed with it.&amp;nbsp; It&amp;rsquo;s comprised of a console application that basically runs through a bunch of API exercises that demonstrate how to perform operations against Azure&amp;rsquo;s Blog, Queue, and Table storage options.&amp;nbsp; If you run it, you end up with something like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/LearningToCodewiththeAzureSDKShowMeTheCo_EAEE/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/LearningToCodewiththeAzureSDKShowMeTheCo_EAEE/image_thumb.png" width="432" height="455" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Coupled with the actual source code, this is a great example of how to use Azure Storage.&amp;nbsp; However, it&amp;rsquo;s not the best output and unless you watch it as it runs, you don&amp;rsquo;t really know what all this program actually did.&amp;nbsp; Or if some pieces maybe failed.&amp;nbsp; Or how to run just the part on deleting table entries.&amp;nbsp; This is a good example of SMTC, but it falls short of being as expressive and approachable as it could be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unit Tests&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m probably preaching the choir here when it comes to unit tests, but there are still about a bazillion developers out there who simply don&amp;rsquo;t get them.&amp;nbsp; They don&amp;rsquo;t write them, they don&amp;rsquo;t run them, and they certainly don&amp;rsquo;t see the value in them.&amp;nbsp; This is just one instance where I think unit tests are valuable, and that is as documentation.&amp;nbsp; As a developer trying to learn an API or going through an SDK, I would much rather have an exhaustive suite of unit (and integration) tests than a .chm file or PDF with standard documentation (though of course having both would be ideal).&amp;nbsp; With the unit tests, I have documentation I can &lt;em&gt;execute&lt;/em&gt;.&amp;nbsp; And I can do it for the whole system or just a tiny piece that interests me at the moment.&amp;nbsp; I don&amp;rsquo;t have to try and set up a huge solution that came as a sample with the SDK &amp;ndash; I can run just one test.&amp;nbsp; Or I can look at just one test and, if it was written well, I can come quickly grasp how the System Under Test (SUT) is meant to be used.&lt;/p&gt;
&lt;p&gt;Going back to the Azure SDK example with the StorageClientAPISample project, the Program.cs file in that project is 972 lines long.&amp;nbsp; Here&amp;rsquo;s a small example of some of the code, showing how to create a Blob of text:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: consol; font-size: x-small;" face="consol" size="2"&gt;// write some text blobs &lt;br /&gt;NameValueCollection nv1 = new NameValueCollection(); &lt;br /&gt;nv1["m1"] = "v1"; &lt;br /&gt;nv1["m2"] = "v2"; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: consol; font-size: x-small;" face="consol" size="2"&gt;StringBlob hello1 = new StringBlob("hello.txt", "Hello World"); &lt;br /&gt;hello1.Blob.Metadata = nv1; &lt;br /&gt;Console.WriteLine("Creating blob hello.txt"); &lt;br /&gt;PutTextBlob(container, hello1); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: consol; font-size: x-small;" face="consol" size="2"&gt;BlobProperties prop = container.GetBlobProperties("hello.txt"); &lt;br /&gt;Console.WriteLine("hello.txt content length = " + prop.ContentLength);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure the unit testers among you will agree that this would be a good candidate for a unit test (or in this case, since it really is talking to the storage service, an integration test).&amp;nbsp; It&amp;rsquo;s possible that some future version of the Azure SDK (it&amp;rsquo;s not even Beta yet, I realize) will include a suite of unit tests, but Microsoft faces some challenges here with deployment.&amp;nbsp; MSTest still is not xcopy deployable, and to date they&amp;rsquo;ve shown a fair amount of reluctance to use alternative open source tools like &lt;a href="http://nunit.org/"&gt;NUnit&lt;/a&gt; (though the ASP.NET MVC team has been more open in this regard than most other teams).&amp;nbsp; Since I&amp;rsquo;m not on the Azure team but I do think such tests would be a valuable addition, I&amp;rsquo;ve suggested this to the team but I&amp;rsquo;ve also gone ahead and started an &lt;a href="http://codeplex.com/azurecontrib"&gt;Azure Contrib project on CodePlex&lt;/a&gt; that will include such tests among its samples, as well as other Azure add-ons that don&amp;rsquo;t ship with the official SDK.&amp;nbsp; Naturally I&amp;rsquo;ll be looking for additional project members as well as ideas for things to include in the project, though for now I don&amp;rsquo;t even have these tests set up so I don&amp;rsquo;t want to get too far ahead of myself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Show Me The Code (SMTC) is a great way to learn.&amp;nbsp; Tests are a great way to break up a lot of code into bite-sized pieces that are both easy to learn and easy to evaluate whether or not they&amp;rsquo;re working correctly.&amp;nbsp; Microsoft should consider shipping tests instead of monolithic console applications with the SDK samples, for Azure as well as other frameworks they are developing, and they should consider making MSTest distributable or accepting the fact that tools like NUnit can serve this space well.&amp;nbsp; &lt;a href="http://codeplex.com/azurecontrib"&gt;Azure Contrib&lt;/a&gt; will soon provide some additional components of interest to Azure developers which are not part of the official SDK.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JIcblcdC_8B0a82Bkde28LFRg_o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JIcblcdC_8B0a82Bkde28LFRg_o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JIcblcdC_8B0a82Bkde28LFRg_o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JIcblcdC_8B0a82Bkde28LFRg_o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=AqZKxlb96tQ:AQ9jYMESe2A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=AqZKxlb96tQ:AQ9jYMESe2A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=AqZKxlb96tQ:AQ9jYMESe2A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=AqZKxlb96tQ:AQ9jYMESe2A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=AqZKxlb96tQ:AQ9jYMESe2A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=AqZKxlb96tQ:AQ9jYMESe2A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/AqZKxlb96tQ" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://ardalis.com/Learning-To-Code-with-the-Azure-SDK-ndash-Show-Me-The-Code"&gt;Learning To Code with the Azure SDK - Show Me The Code&lt;/a&gt; | &lt;a href="http://feeds.stevesmithblog.com/StevenSmith"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iYHQ7_5fGJ2-bfSuMyx3YiuUbUo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iYHQ7_5fGJ2-bfSuMyx3YiuUbUo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iYHQ7_5fGJ2-bfSuMyx3YiuUbUo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iYHQ7_5fGJ2-bfSuMyx3YiuUbUo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 07:25:15 GMT</pubDate>
      <guid>http://ardalis.com/Learning-To-Code-with-the-Azure-SDK-ndash-Show-Me-The-Code</guid>
    </item>
 
  </channel>
</rss>

