<?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.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>LINQed IN</title>
    <description>Blog by Troy Magennis on Software Architecture, Development and Management</description>
    <link>http://blog.aspiring-technology.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://blog.aspiring-technology.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Troy Magennis</dc:creator>
    <dc:title>LINQed IN</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/LinqedIn" type="application/rss+xml" /><item>
      <title>Zip - New LINQ to Objects .NET 4.0 Operator</title>
      <description>&lt;p&gt;When looking through the .NET 4.0 framework bits given out at the recent Microsoft PDC conference, I discovered a new operator - Zip&lt;/p&gt; &lt;p&gt;Zip combines the elements from two sequences, by making available the element at the same index position in each sequence. The sequence stops as soon as one of the sequences exhausts its elements; ideally, the sequences are identical in length. The merging happens in the func function. It takes two arguments (the element from foe first source, and the element from the second source) and lets you return a combined type.&lt;/p&gt; &lt;p&gt;The extension method signature is:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TResult&amp;gt; Zip&amp;lt;TFirst, TSecond, TResult&amp;gt;(
  &lt;span class="kwrd"&gt;this&lt;/span&gt; IEnumerable&amp;lt;TFirst&amp;gt; first, 
  IEnumerable&amp;lt;TSecond&amp;gt; second, 
  Func&amp;lt;TFirst, TSecond, TResult&amp;gt; func);&lt;/pre&gt;
&lt;p&gt;Sample usage:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ZipTest
{
    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
    {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] s1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { &lt;span class="str"&gt;"a"&lt;/span&gt;, &lt;span class="str"&gt;"b"&lt;/span&gt;, &lt;span class="str"&gt;"c"&lt;/span&gt; };
            &lt;span class="kwrd"&gt;int&lt;/span&gt;[] s2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;[] { 1, 2, 3 };

            var q = s1.Zip(s2, (a, b) =&amp;gt; a + b);

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var e &lt;span class="kwrd"&gt;in&lt;/span&gt; q)
                Console.WriteLine(e);

            &lt;span class="rem"&gt;/* Output:&lt;/span&gt;
&lt;span class="rem"&gt;             * a1&lt;/span&gt;
&lt;span class="rem"&gt;             * b2&lt;/span&gt;
&lt;span class="rem"&gt;             * c3&lt;/span&gt;
&lt;span class="rem"&gt;             * &lt;/span&gt;
&lt;span class="rem"&gt;             */&lt;/span&gt;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;Troy.
&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;/p&gt;
&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;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/BrA2ulJFM5E" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/BrA2ulJFM5E/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Zip-New-LINQ-to-Objects-NET-40-Operator.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=e4a45087-63f7-4419-999a-ded5738cdcd8</guid>
      <pubDate>Mon, 05 Jan 2009 05:56:43 -1300</pubDate>
      <category>C#</category>
      <category>LINQ</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=e4a45087-63f7-4419-999a-ded5738cdcd8</pingback:target>
      <slash:comments>15</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=e4a45087-63f7-4419-999a-ded5738cdcd8</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Zip-New-LINQ-to-Objects-NET-40-Operator.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=e4a45087-63f7-4419-999a-ded5738cdcd8</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=e4a45087-63f7-4419-999a-ded5738cdcd8</feedburner:origLink></item>
    <item>
      <title>Google Chrome: about:stats Diagnostic Page/Easter Egg</title>
      <description>&lt;p&gt;If you are trying out Google Chrome, type about:stats into the address bar and hit enter. You get:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/GoogleChromeaboutstatsDiagnosticPageEast_ED9D/chrome_about-stats.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="204" alt="chrome_about-stats" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/GoogleChromeaboutstatsDiagnosticPageEast_ED9D/chrome_about-stats_thumb.png" width="244" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In a previous post I wrote how &lt;a href="http://blog.aspiring-technology.com/post/Building-in-support-features-to-applications.aspx" target="_blank"&gt;adding features to a product to assist in debugging&lt;/a&gt; issues pays dividends; its great to see others also using this technique. This page/feature is obviously for determining and optimizing memory issues and performance stats. I wonder how many other "address-lets" like this there are built in?&lt;/p&gt; &lt;p&gt;Troy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/lFipuJNKVjs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/lFipuJNKVjs/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Google-Chrome-aboutstats-Diagnostic-PageEaster-Egg.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=58b72189-1f27-4a83-8cf4-42e708479780</guid>
      <pubDate>Tue, 02 Sep 2008 10:53:50 -1300</pubDate>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=58b72189-1f27-4a83-8cf4-42e708479780</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=58b72189-1f27-4a83-8cf4-42e708479780</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Google-Chrome-aboutstats-Diagnostic-PageEaster-Egg.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=58b72189-1f27-4a83-8cf4-42e708479780</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=58b72189-1f27-4a83-8cf4-42e708479780</feedburner:origLink></item>
    <item>
      <title>Google Chrome - First Thoughts</title>
      <description>&lt;p&gt;Google announced and released their&amp;nbsp;&lt;a href="http://gears.google.com/chrome/?hl=en" title="Chrome Browser (download)"&gt;Chrome browser&lt;/a&gt;&amp;nbsp;today. &lt;/p&gt;&lt;p&gt;This post is from Chrome, and it does seem to work on most sites i&amp;#39;ve looked at - however, there are many rendering issues that aren&amp;#39;t issues in Firefox or IE. Some examples can be seen on my LINQ Wiki site (&lt;a href="http://www.hookedonlinq.com"&gt;Hooked on LINQ&lt;/a&gt;) where the spacing between adjacent span&amp;#39;s seems squashed, and the order of table cells seems to be incorrect (OK, different) than the current popular browsers. It is a beta after all, but google have said the rendering engine is closest to Apple&amp;#39;s API, and I must admit, my sites are less tested on Safari (in fact, not really at all).&lt;/p&gt;&lt;p&gt;This brings up an interesting Product Management challenge. If peoples first impression is that sites they frequent are &amp;quot;broken&amp;quot; in Chrome - will users persist with that product. Gmail is still in &amp;quot;Beta&amp;quot; which is a bit farsicle given its time in the market, so understanding what Google actually means by &amp;quot;Beta&amp;quot; is difficult to judge - But - Chrome is definately BETA!&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;What works&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- I like the &amp;quot;common pages&amp;quot; layout of a New Tab. Rather than just a blank tab, you get previews of common sites you frequent&lt;/p&gt;&lt;p&gt;- I like the developer javascript and page analysis built-in features (think Developer Toolbar)&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;What Doesn&amp;#39;t Work&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Rendering issues on many sites that I find work in Firefox and IE&lt;/p&gt;&lt;p&gt;- I&amp;#39;m sure this wasn&amp;#39;t a high-priority item for Google, but I struggled to get a Silverlight app to run. I went to&lt;a href="http://memorabilia.hardrock.com/"&gt; Hardrock Cafe,&lt;/a&gt;&amp;nbsp;and it almost ran (showed images, but couldn&amp;#39;t zoom, pan, etc). I think Silverlight was installed OK (no mention of anything being downloaded), but in general - no luck here.&lt;/p&gt;&lt;p&gt;I&amp;#39;m most interested to see how Google will leverage this browser as a runtime for applications. They spend some time saying how they want applications running in Chrome to be more &amp;quot;Desktop Like&amp;quot; - my point would be, why not make them Desktop Apps! Solve the deployment problem, and write well coded Smart Client interfaces. &lt;/p&gt;&lt;p&gt;Troy.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/SVqv61ARLTs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/SVqv61ARLTs/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Google-Chrome-First-Thoughts.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=547c7123-5e94-49dd-a949-3dc0d4c6a0f9</guid>
      <pubDate>Tue, 02 Sep 2008 07:52:00 -1300</pubDate>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=547c7123-5e94-49dd-a949-3dc0d4c6a0f9</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=547c7123-5e94-49dd-a949-3dc0d4c6a0f9</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Google-Chrome-First-Thoughts.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=547c7123-5e94-49dd-a949-3dc0d4c6a0f9</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=547c7123-5e94-49dd-a949-3dc0d4c6a0f9</feedburner:origLink></item>
    <item>
      <title>Building in support features to applications</title>
      <description>&lt;p&gt;Some&amp;nbsp;business&amp;nbsp;rules&amp;nbsp;are&amp;nbsp;complex&amp;nbsp;to&amp;nbsp;capture,&amp;nbsp;and&amp;nbsp;codify&amp;nbsp;into&amp;nbsp;an&amp;nbsp;application.&amp;nbsp;Some&amp;nbsp;examples&amp;nbsp;are&amp;nbsp;when&amp;nbsp;there&amp;nbsp;is&amp;nbsp;company&amp;nbsp;policy&amp;nbsp;that&amp;nbsp;is&amp;nbsp;interpreted&amp;nbsp;(hopefully&amp;nbsp;minimally)&amp;nbsp;slightly&amp;nbsp;differently&amp;nbsp;by&amp;nbsp;different&amp;nbsp;parties,&amp;nbsp;or&amp;nbsp;requires&amp;nbsp;complex&amp;nbsp;analysis&amp;nbsp;when&amp;nbsp;the&amp;nbsp;new&amp;nbsp;system&amp;nbsp;&amp;quot;gets&amp;nbsp;it&amp;nbsp;wrong!&amp;quot;.&lt;br /&gt;&lt;br /&gt;One&amp;nbsp;example&amp;nbsp;I&amp;nbsp;came&amp;nbsp;across&amp;nbsp;was&amp;nbsp;the&amp;nbsp;logic&amp;nbsp;surrounding&amp;nbsp;whether&amp;nbsp;or&amp;nbsp;not&amp;nbsp;a&amp;nbsp;banking&amp;nbsp;loan&amp;nbsp;application&amp;nbsp;falls&amp;nbsp;within&amp;nbsp;an&amp;nbsp;automated&amp;nbsp;decision&amp;nbsp;process&amp;nbsp;or&amp;nbsp;whether&amp;nbsp;it&amp;nbsp;has&amp;nbsp;to&amp;nbsp;be&amp;nbsp;manually&amp;nbsp;assessed.&amp;nbsp;We&amp;nbsp;took&amp;nbsp;three&amp;nbsp;releases&amp;nbsp;to&amp;nbsp;satisfy&amp;nbsp;all&amp;nbsp;the&amp;nbsp;different&amp;nbsp;business&amp;nbsp;stakeholders.&amp;nbsp;Our&amp;nbsp;issue&amp;nbsp;wasn&amp;#39;t&amp;nbsp;so&amp;nbsp;much&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;rule&amp;nbsp;coding,&amp;nbsp;but&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;individual&amp;nbsp;circumstance&amp;nbsp;that&amp;nbsp;swayed&amp;nbsp;the&amp;nbsp;rules&amp;nbsp;engine&amp;nbsp;one&amp;nbsp;way&amp;nbsp;or&amp;nbsp;the&amp;nbsp;other&amp;nbsp;given&amp;nbsp;individual&amp;nbsp;interpretation.&amp;nbsp;Our&amp;nbsp;output&amp;nbsp;of&amp;nbsp;true&amp;nbsp;or&amp;nbsp;false&amp;nbsp;didn&amp;#39;t&amp;nbsp;give&amp;nbsp;us&amp;nbsp;any&amp;nbsp;understanding&amp;nbsp;(or&amp;nbsp;the&amp;nbsp;end-user)&amp;nbsp;as&amp;nbsp;to&amp;nbsp;why&amp;nbsp;a&amp;nbsp;certain&amp;nbsp;decision&amp;nbsp;was&amp;nbsp;made.&lt;br /&gt;&lt;br /&gt;In&amp;nbsp;the&amp;nbsp;second&amp;nbsp;release,&amp;nbsp;I&amp;nbsp;added&amp;nbsp;a&amp;nbsp;right-click&amp;nbsp;menu&amp;nbsp;item&amp;nbsp;to&amp;nbsp;the&amp;nbsp;&amp;quot;Calculate&amp;hellip;&amp;quot;&amp;nbsp;button.&amp;nbsp;This&amp;nbsp;menu&amp;nbsp;allows&amp;nbsp;the&amp;nbsp;user&amp;nbsp;(normally&amp;nbsp;under&amp;nbsp;the&amp;nbsp;direction&amp;nbsp;of&amp;nbsp;the&amp;nbsp;help-desk)&amp;nbsp;to&amp;nbsp;perform&amp;nbsp;the&amp;nbsp;calculation&amp;nbsp;AND&amp;nbsp;populate&amp;nbsp;the&amp;nbsp;Windows&amp;nbsp;Clipboard&amp;nbsp;with&amp;nbsp;a&amp;nbsp;small&amp;nbsp;text&amp;nbsp;based&amp;nbsp;diagnostic&amp;nbsp;report&amp;nbsp;detailing&amp;nbsp;the&amp;nbsp;following&amp;nbsp;aspects&amp;nbsp;&amp;ndash;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;data&amp;nbsp;it&amp;nbsp;is&amp;nbsp;ACTUALLY&amp;nbsp;using&amp;nbsp;for&amp;nbsp;the&amp;nbsp;decision&amp;nbsp;&amp;ndash;&amp;nbsp;in&amp;nbsp;many&amp;nbsp;cases&amp;nbsp;we&amp;nbsp;were&amp;nbsp;incorrectly&amp;nbsp;gathering&amp;nbsp;this&amp;nbsp;data,&amp;nbsp;making&amp;nbsp;our&amp;nbsp;result&amp;nbsp;difficult&amp;nbsp;to&amp;nbsp;predict&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;A&amp;nbsp;step-by-step&amp;nbsp;progress&amp;nbsp;&amp;ndash;&amp;nbsp;Step&amp;nbsp;1&amp;nbsp;(Parties&amp;nbsp;over&amp;nbsp;18&amp;nbsp;years&amp;nbsp;old)&amp;nbsp;:&amp;nbsp;PASSED,&amp;nbsp;Step&amp;nbsp;2&amp;nbsp;&amp;hellip;&amp;nbsp;etc&amp;hellip;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;date,&amp;nbsp;time&amp;nbsp;and&amp;nbsp;user&amp;nbsp;logged-in&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;version&amp;nbsp;numbers&amp;nbsp;of&amp;nbsp;all&amp;nbsp;assemblies&amp;nbsp;and&amp;nbsp;rules&amp;nbsp;loaded&lt;br /&gt;&lt;br /&gt;The&amp;nbsp;end-user&amp;nbsp;would&amp;nbsp;then&amp;nbsp;email&amp;nbsp;this&amp;nbsp;to&amp;nbsp;our&amp;nbsp;team&amp;nbsp;as&amp;nbsp;part&amp;nbsp;of&amp;nbsp;an&amp;nbsp;&amp;quot;In&amp;nbsp;My&amp;nbsp;Opinion&amp;nbsp;&amp;ndash;&amp;nbsp;You&amp;nbsp;Got&amp;nbsp;it&amp;nbsp;Wrong&amp;quot;&amp;nbsp;bug&amp;nbsp;report.&amp;nbsp;These&amp;nbsp;reports&amp;nbsp;allowed&amp;nbsp;our&amp;nbsp;Business&amp;nbsp;Analysts&amp;nbsp;to&amp;nbsp;quickly&amp;nbsp;isolate&amp;nbsp;an&amp;nbsp;issue,&amp;nbsp;or&amp;nbsp;more&amp;nbsp;commonly&amp;nbsp;a&amp;nbsp;mis-understanding&amp;nbsp;by&amp;nbsp;the&amp;nbsp;end-user&amp;nbsp;as&amp;nbsp;to&amp;nbsp;actual&amp;nbsp;bank&amp;nbsp;policy!&amp;nbsp;We&amp;nbsp;quickly&amp;nbsp;took&amp;nbsp;a&amp;nbsp;major&amp;nbsp;unstable&amp;nbsp;area&amp;nbsp;and&amp;nbsp;by&amp;nbsp;the&amp;nbsp;next&amp;nbsp;version&amp;nbsp;reports&amp;nbsp;were&amp;nbsp;almost&amp;nbsp;zero&amp;nbsp;(at&amp;nbsp;least&amp;nbsp;a&amp;nbsp;95%&amp;nbsp;decrease&amp;nbsp;in&amp;nbsp;one&amp;nbsp;release).&lt;br /&gt;&lt;br /&gt;The&amp;nbsp;key&amp;nbsp;takeaways&amp;nbsp;for&amp;nbsp;me&amp;nbsp;were&amp;nbsp;&amp;ndash;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;When&amp;nbsp;a&amp;nbsp;feature&amp;nbsp;has&amp;nbsp;many&amp;nbsp;stakeholders,&amp;nbsp;or&amp;nbsp;the&amp;nbsp;feature&amp;nbsp;might&amp;nbsp;be&amp;nbsp;complex&amp;nbsp;to&amp;nbsp;remotely&amp;nbsp;diagnose&amp;nbsp;&amp;ndash;&amp;nbsp;consider&amp;nbsp;adding&amp;nbsp;some&amp;nbsp;features&amp;nbsp;to&amp;nbsp;support&amp;nbsp;the&amp;nbsp;help-desk&amp;nbsp;gathering&amp;nbsp;the&amp;nbsp;information&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;improve&amp;nbsp;that&amp;nbsp;feature&amp;nbsp;over&amp;nbsp;time&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;Building&amp;nbsp;diagnostic&amp;nbsp;reports&amp;nbsp;into&amp;nbsp;the&amp;nbsp;Clipboard&amp;nbsp;was&amp;nbsp;a&amp;nbsp;very&amp;nbsp;low&amp;nbsp;impact&amp;nbsp;way&amp;nbsp;of&amp;nbsp;getting&amp;nbsp;data&amp;nbsp;from&amp;nbsp;end-users,&amp;nbsp;and&amp;nbsp;was&amp;nbsp;easy&amp;nbsp;for&amp;nbsp;the&amp;nbsp;helpdesk&amp;nbsp;to&amp;nbsp;explain&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;Make&amp;nbsp;the&amp;nbsp;features&amp;nbsp;obscure&amp;nbsp;(although&amp;nbsp;easy&amp;nbsp;for&amp;nbsp;the&amp;nbsp;help-desk&amp;nbsp;staff&amp;nbsp;to&amp;nbsp;tutor&amp;nbsp;end-users).&amp;nbsp;You&amp;nbsp;don&amp;#39;t&amp;nbsp;want&amp;nbsp;these&amp;nbsp;features&amp;nbsp;negatively&amp;nbsp;impacting&amp;nbsp;the&amp;nbsp;user&amp;nbsp;experience&amp;nbsp;for&amp;nbsp;normal&amp;nbsp;cases&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;Consider&amp;nbsp;privacy&amp;nbsp;issues.&amp;nbsp;Only&amp;nbsp;expose&amp;nbsp;underlying&amp;nbsp;data&amp;nbsp;that&amp;nbsp;you&amp;nbsp;actually&amp;nbsp;need.&amp;nbsp;No&amp;nbsp;personally&amp;nbsp;identifiable&amp;nbsp;medical&amp;nbsp;results :-)&lt;/p&gt;&lt;p&gt;Troy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/XDYpExjZNoU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/XDYpExjZNoU/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Building-in-support-features-to-applications.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=87e9cc1f-64d1-446f-983c-e9fe9a6f9a0a</guid>
      <pubDate>Tue, 02 Sep 2008 07:40:00 -1300</pubDate>
      <category>Software Architecture</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=87e9cc1f-64d1-446f-983c-e9fe9a6f9a0a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=87e9cc1f-64d1-446f-983c-e9fe9a6f9a0a</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Building-in-support-features-to-applications.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=87e9cc1f-64d1-446f-983c-e9fe9a6f9a0a</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=87e9cc1f-64d1-446f-983c-e9fe9a6f9a0a</feedburner:origLink></item>
    <item>
      <title>Google Chart API</title>
      <description>&lt;p&gt;
Old news to many, but Google has a Charting API that allows the creation of numerous chart types via a formatted URL string. The Google Chart API returns a .PNG file which is easily embedded in an image tag. If you want to embed charts into your web applications, this chart API might help get you to market quicker. 
&lt;/p&gt;
&lt;p&gt;
The idea is simple enough - create an API which returns an image given a specially formed URL. Values can be specified in-line, or encoded to make them more manageable. There are too many chart types and options to document here, but &lt;a href="http://code.google.com/apis/chart/" target="_blank"&gt;Google&amp;#39;s documentation for this API&lt;/a&gt; is pretty extensive. I&amp;#39;m impressed with the approach and simplicity. I&amp;#39;m also impressed with the breadth of chart types and the number of options available. In general - they just look plain cool! 
&lt;/p&gt;
&lt;p&gt;
Although the API is pretty easy to drive natively, there is also a &lt;a href="http://code.google.com/p/ngchart/" target="_blank"&gt;.NET Helper Library called ngchart&lt;/a&gt; which simplifies the API&amp;#39;s from native .NET code. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Enough talk - some examples - 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=s:Uf9a&amp;amp;chs=250x100&amp;amp;chl=January|February|March|April" title="http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=s:Uf9a&amp;amp;chs=250x100&amp;amp;chl=January|February|March|April"&gt;http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=s:Uf9a&amp;amp;chs=250x100&amp;amp;chl=January|February|March|April&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=s:Uf9a&amp;amp;chs=250x100&amp;amp;chl=January|February|March|April" alt="" width="250" height="100" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chart.apis.google.com/chart?cht=v&amp;amp;chs=200x100&amp;amp;chd=t:100,80,60,30,30,30,10" title="http://chart.apis.google.com/chart?cht=v&amp;amp;chs=200x100&amp;amp;chd=t:100,80,60,30,30,30,10"&gt;http://chart.apis.google.com/chart?cht=v&amp;amp;chs=200x100&amp;amp;chd=t:100,80,60,30,30,30,10&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chart.apis.google.com/chart?cht=v&amp;amp;chs=200x100&amp;amp;chd=t:100,80,60,30,30,30,10" alt="" width="200" height="100" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chart.apis.google.com/chart?chs=225x125&amp;amp;cht=gom&amp;amp;chd=t:70&amp;amp;chl=Hello" title="http://chart.apis.google.com/chart?chs=225x125&amp;amp;cht=gom&amp;amp;chd=t:70&amp;amp;chl=Hello"&gt;http://chart.apis.google.com/chart?chs=225x125&amp;amp;cht=gom&amp;amp;chd=t:70&amp;amp;chl=Hello&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chart.apis.google.com/chart?chs=225x125&amp;amp;cht=gom&amp;amp;chd=t:70&amp;amp;chl=Hello" alt="" width="225" height="125" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chart.apis.google.com/chart?cht=lxy&amp;amp;chs=200x125&amp;amp;chd=t:0,30,60,70,90,95,100|20,30,40,50,60,70,80|10,30,40,45,52|100,90,40,20,10|-1|5,33,50,55,7&amp;amp;chco=3072F3,ff0000,00aaaa&amp;amp;chls=2,4,1&amp;amp;chm=s,FF0000,0,-1,5|s,0000ff,1,-1,5|s,00aa00,2,-1,5" title="http://chart.apis.google.com/chart?cht=lxy&amp;amp;chs=200x125&amp;amp;chd=t:0,30,60,70,90,95,100|20,30,40,50,60,70,80|10,30,40,45,52|100,90,40,20,10|-1|5,33,50,55,7&amp;amp;chco=3072F3,ff0000,00aaaa&amp;amp;chls=2,4,1&amp;amp;chm=s,FF0000,0,-1,5|s,0000ff,1,-1,5|s,00aa00,2,-1,5"&gt;http://chart.apis.google.com/chart?cht=lxy&amp;amp;chs=200x125&amp;amp;chd=t:0,30,60,70,90,95,100|20,30,40,50,60,70,80|10,30,40,45,52|100,90,40,20,10|-1|5,33,50,55,7&amp;amp;chco=3072F3,ff0000,00aaaa&amp;amp;chls=2,4,1&amp;amp;chm=s,FF0000,0,-1,5|s,0000ff,1,-1,5|s,00aa00,2,-1,5&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chart.apis.google.com/chart?cht=lxy&amp;amp;chs=200x125&amp;amp;chd=t:0,30,60,70,90,95,100|20,30,40,50,60,70,80|10,30,40,45,52|100,90,40,20,10|-1|5,33,50,55,7&amp;amp;chco=3072F3,ff0000,00aaaa&amp;amp;chls=2,4,1&amp;amp;chm=s,FF0000,0,-1,5|s,0000ff,1,-1,5|s,00aa00,2,-1,5" alt="" width="200" height="125" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chart.apis.google.com/chart?chco=f5f5f5,edf0d4,6c9642,365e24,13390a&amp;amp;chd=s:fSGBDQBQBBAGABCBDAKLCDGFCLBBEBBEPASDKJBDD9BHHEAACAC&amp;amp;chf=bg,s,eaf7fe&amp;amp;chtm=usa&amp;amp;chld=NYPATNWVNVNJNHVAHIVTNMNCNDNELASDDCDEFLWAKSWIORKYMEOHIAIDCTWYUTINILAKTXCOMDMAALMOMNCAOKMIGAAZMTMSSCRIAR&amp;amp;chs=440x220&amp;amp;cht=t" title="http://chart.apis.google.com/chart?chco=f5f5f5,edf0d4,6c9642,365e24,13390a&amp;amp;chd=s:fSGBDQBQBBAGABCBDAKLCDGFCLBBEBBEPASDKJBDD9BHHEAACAC&amp;amp;chf=bg,s,eaf7fe&amp;amp;chtm=usa&amp;amp;chld=NYPATNWVNVNJNHVAHIVTNMNCNDNELASDDCDEFLWAKSWIORKYMEOHIAIDCTWYUTINILAKTXCOMDMAALMOMNCAOKMIGAAZMTMSSCRIAR&amp;amp;chs=440x220&amp;amp;cht=t"&gt;http://chart.apis.google.com/chart?chco=f5f5f5,edf0d4,6c9642,365e24,13390a&amp;amp;chd=s:fSGBDQBQBBAGABCBDAKLCDGFCLBBEBBEPASDKJBDD9BHHEAACAC&amp;amp;chf=bg,s,eaf7fe&amp;amp;chtm=usa&amp;amp;chld=NYPATNWVNVNJNHVAHIVTNMNCNDNELASDDCDEFLWAKSWIORKYMEOHIAIDCTWYUTINILAKTXCOMDMAALMOMNCAOKMIGAAZMTMSSCRIAR&amp;amp;chs=440x220&amp;amp;cht=t&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chart.apis.google.com/chart?chco=f5f5f5,edf0d4,6c9642,365e24,13390a&amp;amp;chd=s:fSGBDQBQBBAGABCBDAKLCDGFCLBBEBBEPASDKJBDD9BHHEAACAC&amp;amp;chf=bg,s,eaf7fe&amp;amp;chtm=usa&amp;amp;chld=NYPATNWVNVNJNHVAHIVTNMNCNDNELASDDCDEFLWAKSWIORKYMEOHIAIDCTWYUTINILAKTXCOMDMAALMOMNCAOKMIGAAZMTMSSCRIAR&amp;amp;chs=440x220&amp;amp;cht=t" alt="" width="440" height="220" /&gt; 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/VtjBHygOV2U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/VtjBHygOV2U/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Google-Chart-API.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=35f7c001-21c8-4d66-8365-6c425f8b05c2</guid>
      <pubDate>Mon, 04 Aug 2008 15:18:00 -1300</pubDate>
      <category>Resources</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=35f7c001-21c8-4d66-8365-6c425f8b05c2</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=35f7c001-21c8-4d66-8365-6c425f8b05c2</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Google-Chart-API.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=35f7c001-21c8-4d66-8365-6c425f8b05c2</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=35f7c001-21c8-4d66-8365-6c425f8b05c2</feedburner:origLink></item>
    <item>
      <title>DfM for Software (Part 3) - Building and Measuring the List of Factors</title>
      <description>&lt;p&gt;
In the previous &lt;a href="http://blog.aspiring-technology.com/category/DFM.aspx" target="_blank"&gt;articles on dFM&lt;/a&gt;, we covered the basic concepts and how to determine the basic factors. This posting explains a simple process for building a matrix from these factors that will allow you to &amp;quot;cost&amp;quot; a scenario. A &amp;quot;scenario&amp;quot; is an option for building and architecting a software application. We then score this scenario using&amp;nbsp;a score-card (described here), to compare the various scenarios. 
&lt;/p&gt;
&lt;p&gt;
This is a common weighted scoring system for decision support. Its not a perfect system; the subjective weighting are controlled to a degree by a democratic voting system, but a single factor could still play an unfair pivotal role in a final score for a potential scenario. This technique is shown to spark some ideas, not as a prescriptive technique. 
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Step 1&lt;/strong&gt; -&amp;nbsp; Brainstorm a set of factors that influence - cost, time, performance, security, and reliability.&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_4.png"&gt;&lt;img style="border-width: 0px" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_thumb_1.png" border="0" alt="Brainstorm the factors" width="244" height="154" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Step 2&lt;/strong&gt; - Group similar factors under a topic heading&lt;/h3&gt;
&lt;p&gt;
Many of the brainstormed factors can and should be measured by one metric. An example might be the number of web servers, and the number of database servers. This can be joined under the single topic heading &amp;quot;Number of Servers Required&amp;quot; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_6.png"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-width: 0px" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_thumb_2.png" border="0" alt="Group the factors" width="244" height="167" /&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Step 3&lt;/strong&gt; - Build the &amp;quot;Scoring Matrix&amp;quot; for each group.&lt;/h3&gt;
&lt;p&gt;
The complexity in this step takes an absolute measurement and maps it to a simple 1 to 5 score. All measures should be 1 being lowest &amp;quot;cost, effort, time, best performance, most secure, most reliable&amp;quot; and 5 being the opposite direction. 
&lt;/p&gt;
&lt;p&gt;
(These are just very simple samples. The list and scores are completely fabricated in this picture) 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_10.png"&gt;&lt;img style="border: 0px" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_thumb_4.png" border="0" alt="Build scoring matrix" width="644" height="268" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Step 4&lt;/strong&gt; - Determine the factor weightings (what is more important than what) &lt;/h3&gt;
&lt;p&gt;
I have three basic approaches for this - 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; a) You just decide relative importance and allocate weightings subjectively! Great if you can get away with it, but the intention of Design for Manufacturing is to find the &amp;quot;best&amp;quot; design from a balanced set of design objectives. If we just designed software for ease of development, we may not fully consider the operational aspects and the cost of ownership over time. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; b) &lt;a href="http://www.mindtools.com/pages/article/newTED_02.htm" target="_blank"&gt;Paired Options&lt;/a&gt; (or &lt;a href="http://en.wikipedia.org/wiki/Pairwise_comparison" target="_blank"&gt;Pairwise comparison&lt;/a&gt;): Get the group of people representing different domains of expertise (operations, development, business, marketing, sales) together again and have them vote A versus B, A versus C, etc. to determine what is more &amp;quot;important&amp;quot; to that person. Take an average measure of the room (more think A is more important than B). Total up the number of votes for each factor, and determine what percentage that total is of the entire selection. % weight = (count / total pairs (15) ) * 100 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_14.png"&gt;&lt;img style="border-width: 0px" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_thumb_6.png" border="0" alt="image" width="244" height="182" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; c) * my preferred* Stack ranking: Get each representative from each domain specialist (operations, developers, business, storage, etc) to stack rank the factors, most important to least important. This will uncover and account for individual biases. It is my preferred method because it also allows people to say &amp;quot;No Impact&amp;quot; for a specific factor on a &amp;quot;perspective&amp;quot; of the factor. Total up the relative ascending score (assign 1 to the lowest row that was a factor, and 2 to the next one up, and so on) and determine what percentage that score is of the total points available. This will look something like this - 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_16.png"&gt;&lt;img style="border-width: 0px" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/0e513db461b8_8A7B/image_thumb_7.png" border="0" alt="image" width="244" height="185" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Consider doing this for more than one perspective. E.g. As far as Cost, how would you rank importance. As far as time to market, how would you order these factors. What you are looking for is a way to mathematically represent that one factor has a much higher impact on a desired delivery &amp;quot;factor&amp;quot;. Some axis of ranking might be: 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. Capital expenditure - Upfront cost 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. Operational Expenditure - Ongoing costs 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. Time to market - How quickly can it initially be developed 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. Performance - hitting agreed service and performance levels 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. Security - what factors make a system more secure 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. Reliability and Stability - what factors make a system able to handle failure more gracefully) 
&lt;/p&gt;
&lt;p&gt;
Whatever method you employ, the outcome needs to be a table of the factors, and a weighting multiplier, E.g. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of Servers Required - 24% 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Bandwidth - 20.6% 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Searches / sec - 10.3% 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of Deployment Items - 17.2% 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of Third Party Components - 13.7% 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of Features - 13.7% 
&lt;/p&gt;
&lt;h3&gt;Step 5 - Score a Scenario and Multiply By Weights&lt;/h3&gt;
&lt;p&gt;
Break out excel. Use the scoring sheet from Step 3 to score a scenario. Multiply each score by the weights determined in Step 4. Total all of the weighted scores. Do this for other scenarios to compare. 
&lt;/p&gt;
&lt;p&gt;
In the next installment of this article series, i&amp;#39;ll demonstrate this basic technique with some real examples and prepare a final spreadsheet template you might find useful in doing your own option analysis. 
&lt;/p&gt;
&lt;p&gt;
Troy. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/m3IdMd47iIQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/m3IdMd47iIQ/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/DfM-for-Software-(Part-3)-Building-and-Measuring-the-List-of-Factors.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=a8c2b1a5-6a9c-40ec-a96b-36b2bef01b08</guid>
      <pubDate>Tue, 22 Jul 2008 13:05:00 -1300</pubDate>
      <category>DFM</category>
      <category>Software Architecture</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=a8c2b1a5-6a9c-40ec-a96b-36b2bef01b08</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=a8c2b1a5-6a9c-40ec-a96b-36b2bef01b08</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/DfM-for-Software-(Part-3)-Building-and-Measuring-the-List-of-Factors.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=a8c2b1a5-6a9c-40ec-a96b-36b2bef01b08</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=a8c2b1a5-6a9c-40ec-a96b-36b2bef01b08</feedburner:origLink></item>
    <item>
      <title>ExecuteQuery Tooltip - The worlds longest?</title>
      <description>&lt;p&gt;I had a need to execute a SQL statement using LINQ to SQL. Its a long story, but I couldn't use the LINQ to SQL Designer because I was calling a SQL Server 2005 System View. So, I just decided to use the DataContext.ExecuteQuery method. It was a welcome surprise when the intellisense tooltip filled the screen for the first parameter &amp;quot;elementType&amp;quot; -&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/ExecuteQueryTooltipTheworldslongest_EBCF/ExecuteQuery_Tooltip.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="126" alt="ExecuteQuery_Tooltip" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/ExecuteQueryTooltipTheworldslongest_EBCF/ExecuteQuery_Tooltip_thumb.jpg" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Actually, the tooltip really helped. It explains the rules and priority of how the return resultset is mapped to the type you specify. To paraphrase, even though my type doesn't have LINQ to SQL attributes on each property, the system will still attempt to match properties to result columns using a variety of methods.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If a field or property is matched to a specific column name, that column is expected in the result set&lt;/li&gt;    &lt;li&gt;If the field or property is not matched, a column is expected with the same name in the result set (first Case Sensitive search, then case in-sensitive search)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;It goes onto specify the rules about change tracking, primary keys, etc.&lt;/p&gt;  &lt;p&gt;A lot to read, but definitely saved me a having to hunt around for the necessary information. Nice work to whoever spent the extra time going to this detail; it shows they really thought about what someone would need when they used this method for the first time. &lt;/p&gt;  &lt;p&gt;It could have been &amp;quot;elementType: The element type.&amp;quot; if i'd been writing it :-)&lt;/p&gt;  &lt;p&gt;Troy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/fwUI_iapuZo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/fwUI_iapuZo/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/ExecuteQuery-Tooltip-The-worlds-longest.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=a940eadf-549b-4b36-8ee4-e91949cf187a</guid>
      <pubDate>Tue, 15 Jul 2008 10:46:09 -1300</pubDate>
      <category>C#</category>
      <category>LINQ</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=a940eadf-549b-4b36-8ee4-e91949cf187a</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=a940eadf-549b-4b36-8ee4-e91949cf187a</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/ExecuteQuery-Tooltip-The-worlds-longest.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=a940eadf-549b-4b36-8ee4-e91949cf187a</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=a940eadf-549b-4b36-8ee4-e91949cf187a</feedburner:origLink></item>
    <item>
      <title>Visualizing Code Change Impact and Database Dependencies</title>
      <description>&lt;p&gt;Its often difficult on large projects to keep track of all the additions as a system grows. When a project grows, it gets more difficult to keep all system drawings accurate and correct. If a drawing isn't automatically generated, then you can have little faith that it is absolutely up-to-date.&lt;/p&gt;  &lt;p&gt;The alternative is to write tools that examine the code and draw representations of the systems continuously. This can be part of a nightly build, or a tool that can be run on-demand in order to make better decisions, resolve design issues early, and identify impact of changes.&lt;/p&gt;  &lt;p&gt;In this instance I was having trouble keeping up with what Web Services we had; What Stored Procedures they relied upon, and what SQL Server tables those Stored Procedures depended upon.&lt;/p&gt;  &lt;p&gt;The application we wrote in a couple of days simply hunts through all *.cs files and uses Regular Expressions to find applicable code. It then uses &lt;a href="http://research.microsoft.com/research/downloads/Details/c927728f-8872-4826-80ee-ecb842d10371/Details.aspx" target="_blank"&gt;Microsoft Research's Graph Drawing Tool &amp;quot;GLEE&amp;quot;&lt;/a&gt; to visually represent it. GLEE is incredibly easy to use and integrate. The following screen-shot (with the sensitive names removed) took less than 15 lines of code to produce (and a few hundred to do the Regular Expression hunting).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/VisualizingCodeChangeImpactandDatabaseDe_E829/Service_Explorer.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="Service_Explorer" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/VisualizingCodeChangeImpactandDatabaseDe_E829/Service_Explorer_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A side-benefit of this tool is that it forces the team to conform to the coding standards. If they want their new code to be incorporated into the latest drawings, follow the patterns provided. &lt;/p&gt;  &lt;p&gt;Its great to come into work each morning and see what has been added, and to ensure that the cross-coupling even at the database level isn't going to cause use duress later in the project. We can quickly see what a DB schema change will impact. Sleeping much better now....&lt;/p&gt;  &lt;p&gt;Troy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/aDd1MjkDl9s" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/aDd1MjkDl9s/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Visualizing-Code-Change-Impact-and-Database-Dependencies.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=69951f20-55d4-40b9-a57c-773df1bfa9d9</guid>
      <pubDate>Tue, 15 Jul 2008 10:30:34 -1300</pubDate>
      <category>C#</category>
      <category>Software Architecture</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=69951f20-55d4-40b9-a57c-773df1bfa9d9</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=69951f20-55d4-40b9-a57c-773df1bfa9d9</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Visualizing-Code-Change-Impact-and-Database-Dependencies.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=69951f20-55d4-40b9-a57c-773df1bfa9d9</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=69951f20-55d4-40b9-a57c-773df1bfa9d9</feedburner:origLink></item>
    <item>
      <title>Determining SQL Server Object Dependencies for a Stored Procedure or Other Database Object Name</title>
      <description>&lt;p&gt;Finding what dependencies a Stored Procedure has on underlying tables, views, functions, etc is often necessary when trying to assess the impact of a change. SQL Server has built-in functions that will indicate in most cases a dependency for any object in the database. The system view &amp;quot;sys.sql_dependencies&amp;quot; is viewed with skepticism by some people who have obviously been bitten in the past.&lt;/p&gt;  &lt;p&gt;In order to see for myself the results, I wrote a simple helper class, and thought i'd share the boilerplate code to start you off here (I may clean it up and share it as a library, email me if you have difficulty getting it running). Its a rough prototype, but it is returning good results for my purposes.&lt;/p&gt;  &lt;p&gt;Note: This code requires Visual Studio 2008. It uses LINQ to SQL in a very loose way due to the LINQ to SQL Designer not listing the System Views and Functions. Its a good example of just how flexible LINQ to SQL is though.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Linq;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DatabaseDependencyCrawler
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SysDependsResult
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; referenced_major_id { get; set; }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ObjectInfoResult
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; id { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; name { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; xtype  { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime crdate { get; set; }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DatabaseDependencyCrawler
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;DatabaseDependencyEntity&amp;gt; GetDBObjectDependencies(&lt;span class="kwrd"&gt;string&lt;/span&gt; connectionString, &lt;span class="kwrd"&gt;string&lt;/span&gt; name)
        {
            &lt;span class="rem"&gt;// the system views built-into SQL Server 2005&lt;/span&gt;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; dependsQuery = &lt;span class="str"&gt;&amp;quot;select referenced_major_id from sys.sql_dependencies where object_id = object_id('{0}')&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; objectInfoQuery = &lt;span class="str"&gt;&amp;quot;select * from sys.sysobjects where id in ( {0} )&amp;quot;&lt;/span&gt;;

            List&amp;lt;DatabaseDependencyEntity&amp;gt; result = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;DatabaseDependencyEntity&amp;gt;();

            &lt;span class="rem"&gt;// find the list of dependencies based upon a database object's name&lt;/span&gt;
            DataContext context = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContext(connectionString);

            var dependencies = (IEnumerable&amp;lt;dependencies&amp;gt;)context.ExecuteQuery(
                &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SysDependsResult),
                &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(dependsQuery, name), 
                &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { });

            &lt;span class="rem"&gt;// build a list of object_is's to we can ask for their name in a second query&lt;/span&gt;
            StringBuilder ids = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SysDependsResult d &lt;span class="kwrd"&gt;in&lt;/span&gt; dependencies)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ids.Length &amp;gt; 0)
                     ids.Append(&lt;span class="str"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;);

                ids.Append(d.referenced_major_id);
            }

            &lt;span class="rem"&gt;// if any records were found...lookup the names of those id's comma separated&lt;/span&gt;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (ids.Length &amp;gt; 0)
            {

                IEnumerable&amp;lt;ObjectInfoResult&amp;gt; objects = (IEnumerable&amp;lt;ObjectInfoResult&amp;gt;)context.ExecuteQuery(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ObjectInfoResult),
                    &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(objectInfoQuery, ids.ToString()),
                    &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { });

                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ObjectInfoResult o &lt;span class="kwrd"&gt;in&lt;/span&gt; objects)
                {
                    result.Add (
                        &lt;span class="kwrd"&gt;new&lt;/span&gt; DatabaseDependencyEntity {
                            DatabaseConnectionString = connectionString,
                            SourceObject = name,
                            Dependent = o
                        });
                }
            }
        
            &lt;span class="kwrd"&gt;return&lt;/span&gt; result;
        }
    }
}&lt;/pre&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/LinqedIn/~4/CBga04DJ_TE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/CBga04DJ_TE/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Determining-SQL-Server-Object-Dependencies-for-a-Stored-Procedure-or-Other-Database-Object-Name.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=f6cd90ca-700d-4e3d-b966-9fe82bc53849</guid>
      <pubDate>Tue, 15 Jul 2008 05:34:49 -1300</pubDate>
      <category>C#</category>
      <category>LINQ</category>
      <category>Resources</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=f6cd90ca-700d-4e3d-b966-9fe82bc53849</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=f6cd90ca-700d-4e3d-b966-9fe82bc53849</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Determining-SQL-Server-Object-Dependencies-for-a-Stored-Procedure-or-Other-Database-Object-Name.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=f6cd90ca-700d-4e3d-b966-9fe82bc53849</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=f6cd90ca-700d-4e3d-b966-9fe82bc53849</feedburner:origLink></item>
    <item>
      <title>Microsoft SharedView</title>
      <description>&lt;p&gt;Old news to many, but I had a need to share my desktop today for a conference call. I remembered Microsoft had ShareView coming out of beta, so I downloaded it and was up and running in a few minutes. Its well worth your time having installed. For demo'ing a website prototype to external people, it worked great.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=95AF94BA-755E-4039-9038-63005EE9D33A&amp;amp;displaylang=en" target="_blank"&gt;Microsoft ShareView download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.connect.microsoft.com/content/content.aspx?ContentID=6382&amp;amp;SiteID=94" target="_blank"&gt;Microsoft ShareView Connect Page&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="Description"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Hold more effective meetings and conference calls &lt;/li&gt;    &lt;li&gt;Connect with up to 15 people in different locations and get your point across by showing them what's on your screen. &lt;/li&gt;    &lt;li&gt;Work together in real time &lt;/li&gt;    &lt;li&gt;Share, review, and update documents with multiple people in real time. &lt;/li&gt;    &lt;li&gt;Use when and where you want &lt;/li&gt;    &lt;li&gt;SharedView is easy to use, from anywhere, at a moment's notice. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I can see this coming in useful for all sorts of ad-hoc collaboration. I'd like to know how it goes as a remote pair-programming platform as well.&lt;/p&gt;  &lt;p&gt;Troy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/Hl2_qC1yC5Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/Hl2_qC1yC5Q/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Microsoft-SharedView.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=0918ad0d-be71-4ab7-acb3-9788f4a115ed</guid>
      <pubDate>Wed, 02 Jul 2008 10:25:05 -1300</pubDate>
      <category>Resources</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=0918ad0d-be71-4ab7-acb3-9788f4a115ed</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=0918ad0d-be71-4ab7-acb3-9788f4a115ed</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Microsoft-SharedView.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=0918ad0d-be71-4ab7-acb3-9788f4a115ed</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=0918ad0d-be71-4ab7-acb3-9788f4a115ed</feedburner:origLink></item>
    <item>
      <title>Project &amp;quot;Velocity&amp;quot; A Distributed In-Memory Application Cache</title>
      <description>&lt;p&gt;I dropped by the ADO.Nets team stands at TechEd 2008 and saw a demo of a new project called &amp;quot;Velocity&amp;quot;. It is a distributed caching technology, that allows in-memory caching across a distributed set of machines that is resilient and fast. &lt;/p&gt;  &lt;p&gt;Although not on schedule for RTM release until 2009, this technology hold promise for scenarios like distributing reference data, and session state across multiple machines in a server farm.&lt;/p&gt;  &lt;p&gt;Anil Nori and Muralidhar Krishnaprasad presented a session on the topic and posted their &lt;a href="http://cid-24acf41e6619b235.skydrive.live.com/self.aspx/Public/Velocity%20TechEd%202008.pptx" target="_blank"&gt;TechEd slides here&lt;/a&gt;. Here is the &amp;quot;What Is slide&amp;quot; -&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/ProjectVelocityADistributedInMemoryAppli_B27D/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="image" src="http://blog.aspiring-technology.com/image.axd?picture=WindowsLiveWriter/ProjectVelocityADistributedInMemoryAppli_B27D/image_thumb_1.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;More resources -&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/velocity/default.aspx" target="_blank"&gt;The Velocity team blog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/cc655792.aspx" target="_blank"&gt;Velocity Project Page&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&amp;amp;displaylang=en" target="_blank"&gt;CTP 1 Download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Troy.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/FcFi-d5XTms" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/FcFi-d5XTms/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Project-quot3bVelocityquot3b-A-Distributed-In-Memory-Application-Cache.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=6a18cf83-39d3-4492-ba4e-0105d81de352</guid>
      <pubDate>Mon, 30 Jun 2008 06:41:33 -1300</pubDate>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=6a18cf83-39d3-4492-ba4e-0105d81de352</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=6a18cf83-39d3-4492-ba4e-0105d81de352</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Project-quot3bVelocityquot3b-A-Distributed-In-Memory-Application-Cache.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=6a18cf83-39d3-4492-ba4e-0105d81de352</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=6a18cf83-39d3-4492-ba4e-0105d81de352</feedburner:origLink></item>
    <item>
      <title>Programming Quotes and Wisdom</title>
      <description>&lt;p&gt;
I found a good set of programming, and software development quotes. Here is a short-list of my favorites I found at &lt;a href="http://www.eskimo.com/~hottub/software/programming_quotes.html" target="_blank"&gt;this site&lt;/a&gt;. If you know of any other good programming quote websites, leave a comment. 
&lt;/p&gt;
&lt;p&gt;
&amp;quot;The Six Phases of a Project: 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Enthusiasm &lt;/li&gt;
	&lt;li&gt;Disillusionment &lt;/li&gt;
	&lt;li&gt;Panic &lt;/li&gt;
	&lt;li&gt;Search for the Guilty &lt;/li&gt;
	&lt;li&gt;Punishment of the Innocent &lt;/li&gt;
	&lt;li&gt;Praise for non-participants&amp;quot; &lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Anon&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;Theory is when you know something, but it doesn&amp;#39;t work. Practice is when something works, but you don&amp;#39;t know why - Programmers combine theory and practice: Nothing works and they don&amp;#39;t know why.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Anon&lt;/em&gt; 
	&lt;/p&gt;
	&lt;p&gt;
	&amp;nbsp;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;quot;Good judgement comes from experience, and experience comes from bad judgement.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Fred Brooks&lt;/em&gt; 
	&lt;/p&gt;
	&lt;p&gt;
	&amp;nbsp;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;quot;The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Tom Cargill&lt;/em&gt; 
	&lt;/p&gt;
	&lt;p&gt;
	&amp;nbsp;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;quot;Learning is not compulsory. Neither is survival.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;W. Edwards Deming&lt;/em&gt; 
	&lt;/p&gt;
	&lt;p&gt;
	&amp;nbsp;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;quot;Two things are infinite: the universe and human stupidity; and I&amp;#39;m not sure about the universe. &amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Albert Einstein&lt;/em&gt; 
	&lt;/p&gt;
	&lt;p&gt;
	&amp;nbsp;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;quot;Measuring programming progress by lines of code is like measuring aircraft building progress by weight. &amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Bill Gates&lt;/em&gt; 
	&lt;/p&gt;
	&lt;p&gt;
	&amp;nbsp;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;quot;The perfect project plan is possible if one first documents a list of all the unknowns. &amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	Bill Langley 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;There are two ways to write error-free programs; only the third works. &amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Alan J. Perlis&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;Without requirements or design, programming is the art of adding bugs to an empty text file.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Louis Srygley&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;I have always wished that my computer would be as easy to use as my telephone. My wish has come true. I no longer know how to use my telephone.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Bjarne Stroustrup&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;There are only two industries that refer to their customers as &amp;quot;users&amp;quot;. &amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Edward Tufte&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;We all agree on the necessity of compromise. We just can&amp;#39;t agree on when it&amp;#39;s necessary to compromise. &amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Larry Wall&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;quot;As soon as we started programming, we found to our surprise that it wasn&amp;#39;t as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs.&amp;quot; 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;Maurice Wilkes discovers debugging, 1949&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/_S2yeWcfJRU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/_S2yeWcfJRU/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Programming-Quotes-and-Wisdom.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=e66924fb-847f-44c3-829e-7fba6e07e612</guid>
      <pubDate>Thu, 26 Jun 2008 05:17:00 -1300</pubDate>
      <category>Resources</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=e66924fb-847f-44c3-829e-7fba6e07e612</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=e66924fb-847f-44c3-829e-7fba6e07e612</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Programming-Quotes-and-Wisdom.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=e66924fb-847f-44c3-829e-7fba6e07e612</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=e66924fb-847f-44c3-829e-7fba6e07e612</feedburner:origLink></item>
    <item>
      <title>Real Options Underlie Agile Practices</title>
      <description>&lt;p&gt;
I&amp;#39;ve just been reading a well thought out article on Option Theory applied to software - &lt;a href="http://www.infoq.com/articles/real-options-enhance-agility" target="_blank"&gt;&amp;quot;Real Options&amp;quot; Underlie Agile Practices&lt;/a&gt;, posted by Chris Matts and Olav Maassen.
&lt;/p&gt;
&lt;p&gt;
I like the concept, and its common sense approach resonates well with my beliefs. I&amp;#39;ll try and summarize, but you should read their article for the full story.
&lt;/p&gt;
&lt;p&gt;
There are three possible decisions when faced with an option (in our case, an approach, an architectural choice, an implementation choice, etc) -
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Yes&lt;/li&gt;
	&lt;li&gt;No&lt;/li&gt;
	&lt;li&gt;No Decision Yet&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The 3rd choice is often overlooked and a decision is made earlier than it needs to be, curtailing any chance that you will learn more information and make a superior choice later on. The authors explain that when listing options, it is important to define when the true &amp;quot;must have a decision point is&amp;quot; for each option, and passing one of those &amp;quot;drop dead&amp;quot; points is actually making a decision &amp;quot;No&amp;quot; for an option.
&lt;/p&gt;
&lt;p&gt;
The key points for me from this article were:
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;List options early, and keep looking for new options&lt;/li&gt;
	&lt;li&gt;Determine what the true last possible time an option is still viable, and regularly assess if these change due to other decisions&lt;/li&gt;
	&lt;li&gt;Make a solid &amp;quot;Yes&amp;quot; decision for an option at the last possible moment - this leaves open the opportunity for newer options to emerge&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I came across this article by looking up the speakers at a local upcoming conference in Seattle. The authors are speaking at the &lt;a href="http://www.apln.org/summits.html"&gt;APLN Agile Leadership Summit&lt;/a&gt; in Seattle (July 17-18).
&lt;/p&gt;
&lt;p&gt;
Troy. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/5BuEX15uAOA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/5BuEX15uAOA/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/Real-Options-Underlie-Agile-Practices.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=68026390-b73e-418e-a9e4-270c9cacd16a</guid>
      <pubDate>Tue, 24 Jun 2008 04:00:00 -1300</pubDate>
      <category>Software Architecture</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=68026390-b73e-418e-a9e4-270c9cacd16a</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=68026390-b73e-418e-a9e4-270c9cacd16a</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/Real-Options-Underlie-Agile-Practices.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=68026390-b73e-418e-a9e4-270c9cacd16a</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=68026390-b73e-418e-a9e4-270c9cacd16a</feedburner:origLink></item>
    <item>
      <title>DfM for Software (Part 2) - Determining Factors</title>
      <description>&lt;h3&gt;What are factors?&lt;/h3&gt;
&lt;p&gt;
Factors represent an issue, or a requirement that has an impact on the final &amp;quot;cost&amp;quot; of a product. In electronics, a &amp;quot;cost&amp;quot; will either be an increase in monetary value of building an item, or an increase in time to delivery. &amp;quot;Costs&amp;quot; in the software domain might be -
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Cost of hardware or hosting monthly fee(s) &lt;/li&gt;
	&lt;li&gt;Increase in time to develop or deploy &lt;/li&gt;
	&lt;li&gt;Compensating technology required for security, or risk mitigation &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This isn&amp;#39;t a complete list, but its a good start. Our ultimate goal is to define a set of &amp;quot;Weighted Factors&amp;quot; that we will use to score a particular design option. But first, lets explore the different types of Design Options, and explore a few examples in the Software engineering domain.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Key Point: Each factor varies in how linearly it will effect the &amp;quot;cost&amp;quot; value. Higher costs are bad, lower costs are good. Costs will be normalized by the weighting scale applied to each factor to ensure one factor doesn&amp;#39;t overly control the outcome.&lt;/strong&gt;
&lt;/p&gt;
&lt;h3&gt;Types of Factors&lt;/h3&gt;
&lt;p&gt;
&lt;strong&gt;Binary Decision Factors&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Binary factors are those constraints that are an absolute Go or No-Go. Any factor that will clearly eliminate an option should be the first criteria analyzed. If a certain criteria is met (or not met), the highest cost should be assumed - ensuring that this option can never be chosen (not without due negotiation anyway!)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Tipping Point Factors&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Some factors have no &amp;quot;cost&amp;quot; impact until they pass a certain threshold. An example might be disk space use. Until your product passes the requirement to need more than 100MB of disk space, there is no cost; After that you pay a premium. These factors need to place the lowest cost on a factor, once the tipping point is reached, the factor must assume the highest cost ensuring this option cannot be chosen, otherwise this factor should be zero and not impact the rest of the decision tree.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Scaled Factors&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
These are general quantifiable factors. The offer a mechanism to determine (and indicate) how a factor impacts cost. E.g. Adding an extra business service layer will increase the deployment complexity and may need extra servers. We&amp;#39;ll discuss how to formulate a scale for these factors in a future article, but in this example you can imagine that adding servers has a cost, and each extra architectural layer increases the cost accordingly.
&lt;/p&gt;
&lt;h3&gt;Determining the Relevant Factors&lt;/h3&gt;
&lt;p&gt;
This is the crux of the story. We need to identify the factors that we will score. There is no master list of factors to draw upon. It is important that each factor fall into a category listed above - Binary, Tipping Point or Scaled.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The basic process is to get all the stakeholders into a room and extract (brainstorm) factors that will in their opinion cause an extra cost. No factor is too small at this stage (we&amp;#39;ll filter them later), just keep the crowd focused on identifying issues that can increase/decrease effort, cost, time and risk.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
By then end of a session you should have a stack of post-it notes littering a whiteboard. Use post-it notes so that you can join and link duplicate concepts and ideas. If you involve the right people, you should end up with a big list of factors. How many are too many? Impossible to quantify, but once a list of Factors is defined, the weighting process should spotlight those factors that fall below a level that will alter any outcome. These factors can then be dropped.
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve not got a complete list, or even a recommended list at the moment. Hopefully sometime in the future I&amp;#39;ll have something more, but for the fact of this article, here are a few I jotted down in three minutes (some overlap, some are duplicate, some can&amp;#39;t be measured, and some don&amp;#39;t make sense at all - all problems to look at later)-
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Bandwidth utilization &lt;/li&gt;
	&lt;li&gt;Disk space required &lt;/li&gt;
	&lt;li&gt;Number of Architectural Layers &lt;/li&gt;
	&lt;li&gt;Database size &lt;/li&gt;
	&lt;li&gt;Number of Database Objects &lt;/li&gt;
	&lt;li&gt;Number of different development languages &lt;/li&gt;
	&lt;li&gt;Number of different technologies&lt;/li&gt;
	&lt;li&gt;Number of integration points &lt;/li&gt;
	&lt;li&gt;Number of external partners integration points&lt;/li&gt;
	&lt;li&gt;Number of config settings, and ease of changing&lt;/li&gt;
	&lt;li&gt;Production event logging, how much, to where, how often?&lt;/li&gt;
	&lt;li&gt;Ease of deployment&lt;/li&gt;
	&lt;li&gt;Number of Servers&lt;/li&gt;
	&lt;li&gt;Number of third party components&lt;/li&gt;
	&lt;li&gt;Ease we could host at a co-located facility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In future articles, we&amp;#39;ll look at how to take this list and refine it down to a manageable set, and how we would scale and weight each factor.
&lt;/p&gt;
&lt;p&gt;
Troy.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/UFh05kJPcjI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/UFh05kJPcjI/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/DfM-for-Software-(Part-2)-Determining-Factors.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=27c92b74-e236-4308-bfae-5f0a6ace4fa0</guid>
      <pubDate>Mon, 23 Jun 2008 10:13:00 -1300</pubDate>
      <category>Software Architecture</category>
      <category>Software Business</category>
      <category>DFM</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=27c92b74-e236-4308-bfae-5f0a6ace4fa0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=27c92b74-e236-4308-bfae-5f0a6ace4fa0</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/DfM-for-Software-(Part-2)-Determining-Factors.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=27c92b74-e236-4308-bfae-5f0a6ace4fa0</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=27c92b74-e236-4308-bfae-5f0a6ace4fa0</feedburner:origLink></item>
    <item>
      <title>DfM for Software (Part 1) - Design for Manufacturing 101</title>
      <description>&lt;p&gt;
In electronics design, many elements can directly impact the cost of manufacturing a product. DfM aimed to move the tradeoff analysis for decisions affecting manufacturing as early as possible in a design phase. I&amp;#39;ll attempt to move this into the software architecture realm in a future article, but for now I want to explain how this worked in Electronic Product design. 
&lt;/p&gt;
&lt;h3&gt;What design decision matter in Electronics? &lt;/h3&gt;
&lt;p&gt;
In electronic product design, here are a few to start your thought process - 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Component Selection&lt;/strong&gt; - Choosing components from an approved supplier and components that meet requirements but don&amp;#39;t exceed specification (giving latitude to safety margins) directly impact cost of an item. Assisting engineers choose preferred part, parts already purchased and in inventory, and offering alternatives can really decrease costs and improve turnaround time. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Printed Circuit Board Size and Shape&lt;/strong&gt; - Small PCB&amp;#39;s aren&amp;#39;t made one at a time. They are panelized onto larger sheets, fabricated and even assembled (components positioned and soldered into place) in that form before being broken apart and put into their cases. The more individual boards you can fit to a panel, the less waste and fewer panels need to be moved through auto-assembly equipment. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Printed Circuit Board Technology&lt;/strong&gt; - If you make the board smaller to fit a certain device, you often need to add &amp;#39;layers&amp;#39; for interconnecting components. This adds cost; If you make individual features smaller to fit more interconnects onto fewer layers, the manufacturing yield decreases due to mis-registrations. Its a real trade-off and highly dependent on your partners capabilities. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Printed Circuit Board Hole Count and Sizes&lt;/strong&gt; - For some PCB technologies, drilling holes can be time consuming. Smaller holes needs to be positioned more accurately and these drill bits break more often. Normally, fewer holes of larger sizes is the cheapest way to go; However, some PCB technologies don&amp;#39;t incur a cost per hole - which one will you specify? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Component Placement&lt;/strong&gt; - Where is it safe to put large components? Where will the battery connect? Where are the pushbuttons? All of these decisions need to be considered when the PCB is being designed - BUT they seriously impact the final case design. How can the electronics designers and the mechanical (and brand) designers collaborate to agree on an acceptable design? For extremely high volume designs, placing similar components in the same orientation can reduce the number of machine rotations and component reel changes which reduces the total time of assembly. Saving 1 minute for 1 million pieces is substantial! 
&lt;/p&gt;
&lt;h3&gt;Early Focus and Scoring Matrix Definition&lt;/h3&gt;
&lt;p&gt;
Design for Manufacture initiatives aimed to bring focus on the types of decisions made above and allow engineers and designers to perform trade-off analysis as early as possible in the process. The product might have to be smaller than a competitors and that forces a smaller PCB size and shape, which then causes a specific choice of technology - However, the key aim was to understand that early and make informed choices about which remaining options fulfill the global good. 
&lt;/p&gt;
&lt;p&gt;
To build a Report Card or Scoring Matrix, the basic process is - 
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Get together with all of your partners, suppliers, fabricators and designers and brainstorm a set of issues that impact cost. Similar to the list provided above, the idea is to get the &amp;#39;issues list&amp;#39; on the table.&lt;/li&gt;
	&lt;li&gt;Group these issues into a sub-set that can actually be measured and scored. E.g. &amp;quot;Number of boards per panel&amp;quot;, &amp;quot;Number of holes smaller than 0.5mm&amp;quot;, &amp;quot;Number of different components types&amp;quot;, etc.&lt;/li&gt;
	&lt;li&gt;Determine relative weighting for each measurement. Some requirements cannot be broken, other just incur a cost. I&amp;#39;ll propose a process for determining this weighting in a future article; for now, just understand they won&amp;#39;t all have the same weighting factor.&lt;/li&gt;
	&lt;li&gt;Build the scoring scale for each factor. This step tries to normalize the different scales of measurements into a smaller linear set (i.e. 1 to 5, rather than 1 to 1 million for one factor, and 1 to 10 for another)&lt;/li&gt;
	&lt;li&gt;Calibrate the scorecard by testing on existing systems. Agree and alter the specific factor &amp;quot;Weightings&amp;quot; until you gain confidence in the scorecard&lt;/li&gt;
	&lt;li&gt;Use the scorecard on future design discussions.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;
Is it just as simple as substituting &amp;quot;IT Operations&amp;quot; for &amp;quot;Fabricators&amp;quot;; &amp;quot;Usability/Interactive Designers&amp;quot; for &amp;quot;Packaging Designers&amp;quot;; &amp;quot;External Hosting Partners&amp;quot; for &amp;quot;Suppliers&amp;quot;?&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In future articles i&amp;#39;ll look deeper into - 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;How to build a weighted score card based on issues relevant to software&lt;/li&gt;
	&lt;li&gt;Propose some software specific issues and attempt to weight those appropriately&lt;/li&gt;
	&lt;li&gt;Test our new scorecard and determine if it is achieving the goal we intended.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Be interested in comments as to whether other people agree there might by parity between DfM in Electronics to DfM in Software. 
&lt;/p&gt;
&lt;p&gt;
Troy. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LinqedIn/~4/facqBR-iqPs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LinqedIn/~3/facqBR-iqPs/post.aspx</link>
      <author>troy.nospam@nospam.aspiring-technology.com (t_magennis)</author>
      <comments>http://blog.aspiring-technology.com/post/DfM-for-Software-(Part-1)-Design-for-Manufacturing-101.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.aspiring-technology.com/post.aspx?id=67af7441-9c01-4ef1-ac9e-76bec99f052e</guid>
      <pubDate>Mon, 23 Jun 2008 08:18:00 -1300</pubDate>
      <category>DFM</category>
      <category>Software Architecture</category>
      <category>Software Business</category>
      <dc:publisher>t_magennis</dc:publisher>
      <pingback:server>http://blog.aspiring-technology.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.aspiring-technology.com/post.aspx?id=67af7441-9c01-4ef1-ac9e-76bec99f052e</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://blog.aspiring-technology.com/trackback.axd?id=67af7441-9c01-4ef1-ac9e-76bec99f052e</trackback:ping>
      <wfw:comment>http://blog.aspiring-technology.com/post/DfM-for-Software-(Part-1)-Design-for-Manufacturing-101.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.aspiring-technology.com/syndication.axd?post=67af7441-9c01-4ef1-ac9e-76bec99f052e</wfw:commentRss>
    <feedburner:origLink>http://blog.aspiring-technology.com/post.aspx?id=67af7441-9c01-4ef1-ac9e-76bec99f052e</feedburner:origLink></item>
  </channel>
</rss>
