<feed xmlns:dc="http://purl.org/dc/elements/1.1/" 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="http://www.w3.org/2005/Atom" xml:lang="en-US">
    <title>A Technical Debtor</title>
    <link rel="self" type="application/xml" href="http://blog.dotnetspeech.net/Atom.aspx" />
    <subtitle type="html">Toward continuous improvment</subtitle>
    <id>http://blog.dotnetspeech.net/Default.aspx</id>
    <author>
        <name>Jeff Certain</name>
        <uri>http://blog.dotnetspeech.net/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 0.0.0.0">Subtext</generator>
    <updated>2009-10-15T11:15:07Z</updated>
    <entry>
        <title>Why is &amp;ldquo;Legacy&amp;rdquo; a Pejorative?</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/10/15/why-is-ldquolegacyrdquo-a-pejorative.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/10/15/why-is-ldquolegacyrdquo-a-pejorative.aspx</id>
        <published>2009-10-15T11:15:07-05:00:00</published>
        <updated>2009-10-15T11:15:07Z</updated>
        <content type="html">&lt;p&gt;I had the tremendous privilege in the last couple days to spend time with a bunch of architects at ITARC in NYC. I’m still trying to wrap my head around it all… but that’s always the result when I spend a couple days around a bunch of people smarter than me. (Those of you who know me know that’s not too hard to accomplish… but just to drop some names, some of the people who were there – and accessible – included Grady Booch, Eric Evans, Len Bass, Roger Sessions, Angela Yochem, Bill Imnon).&lt;/p&gt;  &lt;p&gt;One of the thoughts that struck me in the midst of Grady Booch’s keynote yesterday was that the word “legacy” tends to have a completely different connotation when dealing with code than in pretty much any other connotation.&lt;/p&gt;  &lt;p&gt;Technically, the definition of “legacy” (from &lt;a href="http://m-w.com"&gt;http://m-w.com&lt;/a&gt;) is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;something transmitted by or received from an ancestor or predecessor or from the past &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hmmm. Pretty neutral. Yet, when we talk about wanting to “leave a legacy,” it’s always with the implication that we want to leave behind some positive proof that we were here.&lt;/p&gt;  &lt;p&gt;On the other hand, when we talk about “legacy code,” well… there’s always the implication that the code is poorly written, poorly designed, unmaintainable, etc. Michael Feathers defines legacy code as any code that isn’t under test, which is a slightly more neutral statement, yet much of his book is spent describing ways to make testable all that poorly written, poorly designed, unmaintainable code.&lt;/p&gt;  &lt;p&gt;Now, I work for an ISV that is about to celebrate it’s 20th anniversary. We’re growing rapidly – we’ve grown from 65 employees to nearly 100 in the past 18 months. Not quite Moore’s Law growth, but getting close! We’re currently engaged in transitioning from an Access over Oracle to .NET against Oracle/SQL Server application. This is, to put it lightly, a significant undertaking.&lt;/p&gt;  &lt;p&gt;And, while our older code base is both a legacy code base and one that could be cleaner, those are two separate issues. (Side note: any developer who tells you that their code base can’t use some cleanup isn’t paying attention!) My challenge is to separate those two concepts, and remember that the older code base is indeed a legacy from the past . But it’s a legacy in the positive sense. The product has been, and continues to be, successful in the marketplace. It allowed the company to grow to the point that we’re at today – and to be one of the best work environments I’ve heard of (and I talk to a lot of developers). It’s also a window into the past. Twenty years is a long time in this industry. Our current product has had something like 18 releases, so it’s been around for a while… the state of the art has changed dramatically. And there are just some things that can’t be done in VBA/Access (like OO programming).&lt;/p&gt;  &lt;p&gt;After all that rambling, let me sum up. Don’t confuse the value of the legacy of the code with the value of the legacy code.&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/135485.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/135485.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/135485.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/135485.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Regular Expressions in Visual Studio &amp;ldquo;Find&amp;rdquo;</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/09/24/regular-expressions-in-visual-studio-ldquofindrdquo.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/09/24/regular-expressions-in-visual-studio-ldquofindrdquo.aspx</id>
        <published>2009-09-24T10:35:31-05:00:00</published>
        <updated>2009-09-24T10:35:31Z</updated>
        <content type="html">&lt;p&gt;I had a case today where I wanted to find all the spots within our application that a developer had explicitly set the BackColor property of a control at run-time. As you can imagine, a simple search ended up with my finding a ton of designer code where the generated code was setting the property. (It sure would be nice if Visual Studio would let you exclude comments and designer files from the search – but that’s not in VS2008 or VS2010 Beta 1, unless it’s well hidden in both.)&lt;/p&gt;  &lt;p&gt;Wildcards seems like a fairly good starting point, but I couldn’t think of a way to exclude particular strings using wildcards… so it was time to delve into the other options – “Use Regular Expressions.” (This option is exposed through the combo box at the bottom of the Find/Replace dialog, as shown below.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/TechnicalDebtor/WindowsLiveWriter/RegularExpressionsinVisualStudioFind_868D/FindReplace_4.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="FindReplace" border="0" alt="FindReplace" src="http://geekswithblogs.net/images/geekswithblogs_net/TechnicalDebtor/WindowsLiveWriter/RegularExpressionsinVisualStudioFind_868D/FindReplace_thumb_1.jpg" width="345" height="311" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To be perfectly frank about it, I approach regular expressions with quite a bit of trepidation. It’s not so much that I don’t…. well, okay, I’ll admit it. I just plain don’t understand them. It’s not that the concept it hard – it’s that every implementation of RegEx I’ve seen has a different syntax. And I’ve never found a particularly definitive syntactical lexicon for .NET regular expressions with useful expressions.&lt;/p&gt;  &lt;p&gt;So, it was off to &lt;a href="http://www.regular-expressions.info/examples.html" target="_blank"&gt;Google&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/2k3te2cs(VS.80).aspx" target="_blank"&gt;MSDN help&lt;/a&gt;. Neither of these was as helpful as I would have liked. The piece I didn’t see with a quick scan? Enclosing a string literal in parentheses makes the RegEx engine treat that as a phrase.&lt;/p&gt;  &lt;p&gt;After poking around a little bit, I was able to cobble together something that was really helpful:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;~((Appearance|Shape):a#)(.BackColor = )~(System|True|False)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, that may look rather impenetrable, so I’ll walk through it. We use Infragistics controls, so there’s dozens, if not hundreds, of Appearance objects in the designer-generated code. The ~ is a negation character. The pipe (|) is a logical OR. The phrase “:a#” means “match any number of alphanumeric characters in this position.” (In retrospect “:d#” might have been better, since that would match on numbers only.) So, “~((Appearance|Shape):a#)” translates as “don’t show me any matches that include Appearance## or Shape##”.&lt;/p&gt;  &lt;p&gt;The next piece of the RegEx specifies that I’m looking for instances of “.BackColor = “. Finally, for some Infragistics-specific reasons, it helped clear out the noise if I excluded (~) any property settings that were Boolean values (True|False). (Remember that True and False are treated as string literals here, not Boolean values).&lt;/p&gt;  &lt;p&gt;This really helped me narrow down what I was looking for – not a matter of trivial importance when searching through a few hundred thousand lines of code across 75 or so projects!&lt;/p&gt;  &lt;p&gt;Of course, after the fact, I thought about checking to see if Sara Ford has a tip for this on her blog. Of course she did! Where I hand-rolled my RegEx, she shows &lt;a href="http://blogs.msdn.com/saraford/archive/2007/11/02/did-you-know-how-to-use-wildcards-and-regular-expressions-while-searching.aspx" target="_blank"&gt;how to use the expression builder&lt;/a&gt; to do the same.&lt;/p&gt;  &lt;p&gt;Hopefully, this will help demystify RegEx searches in Visual Studio a little bit, and save you some time!&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/135072.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/135072.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/135072.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/135072.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Oracle + Azure = Crash and Burn</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/09/07/oracle--azure--crash-and-burn.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/09/07/oracle--azure--crash-and-burn.aspx</id>
        <published>2009-09-07T23:06:19-05:00:00</published>
        <updated>2009-09-07T23:06:19Z</updated>
        <content type="html">&lt;p&gt;One of the downsides to Azure is that it’s error messages need a LOT of work. I just installed the July CTP of Azure. After doing so, even the simplest cloud project would fail. I’m talking “Create New Project” then F5… wait 30 seconds… bomb.&lt;/p&gt;  &lt;p&gt;I kept getting the ubiquitous “Role instances did not start within the time allowed. Please try again. If you continue to encounter this behavior please try shutting down the Development Fabric." message. Nice and descriptive.&lt;/p&gt;  &lt;p&gt;Digging into the problem, it looked like everything spun up just fine. Then Azure pondered the situation, decided it was unhappy, and departed for clouds unknown.&lt;/p&gt;  &lt;p&gt;I’m usually impressively fast with Google/Bing. Turns out nothing useful came up. This error seems to be the one that gets thrown whenever anything goes in the least bit wrong. Finally, I posted a message on the Microsoft forums. &lt;a href="http://social.msdn.microsoft.com/Profile/en-US/?user=Yi-Lun%20Luo&amp;amp;referrer=http%3a%2f%2fsocial.msdn.microsoft.com%2fForums%2fen-US%2fwindowsazure%2fthread%2f9b2d73f6-7dbf-48cf-a526-f11cdd907894&amp;amp;rh=xIZkxHkM%2bmSz%2feND2bG%2b%2bnGTpLUCJMjOxBAObeVCBkA%3d&amp;amp;sp=forums"&gt;Yi-Lun Luo&lt;/a&gt; to the rescue!&lt;/p&gt;  &lt;p&gt;He was able to point me at the trick of spinning things up, and in the 30 seconds before everything came crashing down, try to hit &lt;a href="http://127.0.0.1:81"&gt;http://127.0.0.1:81&lt;/a&gt; (the default location for Azure web roles). &lt;/p&gt;  &lt;p&gt;Turns out (drum roll please) that I had made the mistake of installing the Oracle web tools when I installed the Oracle Developer Tools. This inserted some crazy health monitoring stuff into machine.config. &lt;/p&gt;  &lt;pre&gt;Line 172:    &amp;lt;healthMonitoring&amp;gt;
Line 173:      &amp;lt;providers&amp;gt;
Line 174:        &amp;lt;add name="OracleWebEventProvider" type="Oracle.Web.Management.OracleWebEventProvider, et cetera” /&amp;gt;
Line 175:      &amp;lt;/providers&amp;gt;
Line 176:    &amp;lt;/healthMonitoring&amp;gt;&lt;/pre&gt;

&lt;p&gt;Once I nuked that out, everything started working again. Full details can be found &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/9b2d73f6-7dbf-48cf-a526-f11cdd907894" target="_blank"&gt;here&lt;/a&gt;, if you want them.&lt;/p&gt;

&lt;p&gt;Just figured I’d leave this little bread crumb out there for the next adventurous soul who finds themselves lost in the clouds…&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/134543.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/134543.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/134543.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/134543.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Crazy Battery Life</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/08/20/crazy-battery-life.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/08/20/crazy-battery-life.aspx</id>
        <published>2009-08-20T16:41:06-05:00:00</published>
        <updated>2009-08-20T16:41:06Z</updated>
        <content type="html">&lt;p&gt;I recently got a new laptop. One of the first changes I made was to put in a solid state drive. I still have the standard drive in. Today, I happened to check my battery life, and saw this.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/TechnicalDebtor/WindowsLiveWriter/CrazyBatteryLife_DC9A/PowerIssue_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="PowerIssue" border="0" alt="PowerIssue" src="http://geekswithblogs.net/images/geekswithblogs_net/TechnicalDebtor/WindowsLiveWriter/CrazyBatteryLife_DC9A/PowerIssue_thumb.jpg" width="244" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I wonder what the battery life would be like on “Power Saver” mode?&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/134223.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/134223.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/134223.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/134223.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Colorado CustomWare Is Hiring&amp;hellip;</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/07/10/colorado-customware-is-hiringhellip.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/07/10/colorado-customware-is-hiringhellip.aspx</id>
        <published>2009-07-10T12:00:40-05:00:00</published>
        <updated>2009-07-10T12:00:40Z</updated>
        <content type="html">&lt;p&gt;Want to join a growing software company with a 20-year track record of delivering great software?&lt;/p&gt;  &lt;p&gt;Or maybe you’re looking to join a development team where the corporate leadership is committed to making a difference – not just within the company walls, but throughout the industry and in the lives of their employees and customers?&lt;/p&gt;  &lt;p&gt;Perhaps you’re tired of doing the same thing the same way, every day. &lt;/p&gt;  &lt;p&gt;Or maybe you’ve just noticed that Fort Collins, CO has this nasty habit of showing up pretty near the top of the list of the top 10 places to live in the US.&lt;/p&gt;  &lt;p&gt;Whatever your reason for wanting to join a terrific company, we’re hiring for a variety of development positions. Check out the postings at &lt;a title="http://www.coloradocustomware.com/Careers.aspx" href="http://www.coloradocustomware.com/Careers.aspx"&gt;http://www.coloradocustomware.com/Careers.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/133407.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/133407.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/133407.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/133407.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Colorado CustomWare Wins Ethics Award</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/07/09/colorado-customware-wins-ethics-award.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/07/09/colorado-customware-wins-ethics-award.aspx</id>
        <published>2009-07-09T12:07:33-05:00:00</published>
        <updated>2009-07-09T12:07:33Z</updated>
        <content type="html">&lt;p&gt;While this is, admittedly, rather overdue, I do want to take a chance to brag on my employers for a moment.&lt;/p&gt;  &lt;p&gt;This spring, Colorado CustomWare was one of seven Colorado and Wyoming businesses to receive the BBB Torch Award for Business Ethics. (Read the &lt;a href="http://wynco.bbb.org/article/bbb-bestows-torch-awards-upon-seven-colorado-and-wyoming-businesses-10435" target="_blank"&gt;BBB announcement&lt;/a&gt; and the &lt;a href="http://www.ncbr.com/article.asp?id=99802" target="_blank"&gt;Northern Colorado Business Report&lt;/a&gt; article.)&lt;/p&gt;  &lt;p&gt;What makes this award particularly cool in my eyes is that we were nominated by “peers, colleagues and customers.” Local university students did the research, and presented entries to an independent panel of judges who, in turn, selected the winners.&lt;/p&gt;  &lt;p&gt;After being here for a year (at least at the time of the award), I’ve been consistently impressed with the integrity, passion and commitment to do the right thing that our staff consistently demonstrates. The award is nice, but working with these folks is even nicer!&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/133384.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/133384.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/133384.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/133384.aspx</trackback:ping>
    </entry>
    <entry>
        <title>IASA Denver &amp;ndash; Making Architecture Business-Value Driven (Dave Guevara)</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/04/20/iasa-denver-ndash-making-architecture-business-value-driven-dave-guevara.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/04/20/iasa-denver-ndash-making-architecture-business-value-driven-dave-guevara.aspx</id>
        <published>2009-04-20T19:41:59-05:00:00</published>
        <updated>2009-04-20T19:41:59Z</updated>
        <content type="html">&lt;p&gt;Let me preface this by saying that I couldn’t keep up with Dave, and he has much more to say than I could capture here. He’s quite willing to discuss this more. Feel free to contact me for his contact info &lt;/p&gt;  &lt;p&gt;Problem statement: architecture is challenged by a perception that design and development standards are too abstract or irrelevant. This is exacerbated by the misperception that agile processes eliminate the need for good design and architecture practices. So, how do we build enterprise-class solutions and assure the adoption and use by software and EDW/BI teams?&lt;/p&gt;  &lt;p&gt;Gartner gives good guidance for CIOs in creating an EA plan. However, the framework itself is an implementation choice, be it TOGAF or Zachman (ZIFA).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Nothing is particularly hard if you divide it into small jobs.” Henry Ford&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There’s lots of reasons that we have problems with this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;we get less time than we need &lt;/li&gt;    &lt;li&gt;our business world and rules are complex &lt;/li&gt;    &lt;li&gt;stuff happens &lt;/li&gt;    &lt;li&gt;we have lots of processes and standards… but they don’t tell us how to ensure value &lt;/li&gt;    &lt;li&gt;general mandate to create business value &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Concentrate on reducing friction and improving speed. All the pieces must work efficiently together… or value is lost.&lt;/p&gt;  &lt;p&gt;How do we get there? Some lean concepts:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;simplify your business model &lt;/li&gt;    &lt;li&gt;modularize the blocks &lt;/li&gt;    &lt;li&gt;standardize the interfaces &lt;/li&gt;    &lt;li&gt;look at the points of rapid change &lt;/li&gt;    &lt;li&gt;know the overall economics and throughput &lt;/li&gt;    &lt;li&gt;focus on the constraints on value throughput &lt;/li&gt;    &lt;li&gt;manage to the vital signs (3-5 KPIs) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;What do we need to know? Strategic goals, operational goals and operational capabilities. Our intuition is valid – there is a complex neurological engine that solves complex problems. However, we need to formalize this intuition; otherwise, we end up with assumptions that cause problems.&lt;/p&gt;  &lt;p&gt;How do we get there? Business capabilities, technical capabilities, organizational capabilities, integration capabilities.&lt;/p&gt;  &lt;p&gt;Steps&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;define dimensions and service level expectations &lt;/li&gt;    &lt;li&gt;use top-down thinking in combination with bottoms-up &lt;/li&gt;    &lt;li&gt;adapt use case outline to manage user story inventories      &lt;ul&gt;       &lt;li&gt;connect User Stories together in context with the business value &lt;/li&gt;        &lt;li&gt;carve up the problem into bite-sized pieces &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;map business architecture to solution design architecture components &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;What are the dimensions of alignment?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Business processes &lt;/li&gt;    &lt;li&gt;Domains &lt;/li&gt;    &lt;li&gt;Environments &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Managing User Story Inventories for Completeness&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;helps ensure that we cover the basic requirements (precedence, end states, exceptions, business rules, UI specifications, domain, environment)  for each user story &lt;/li&gt;    &lt;li&gt;spreadsheet-style tools, like Rally, can help &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The structure of an organization is slower-moving than the requirements or the capabilities. The architecture shouldn’t need to change unless the company change what they’re doing (or unless a technology shift occurs).&lt;/p&gt;  &lt;p&gt;Michael Porter (“&lt;em&gt;Competitive Advantage,” 1985&lt;/em&gt;) suggested that there are &lt;a href="http://www.ifm.eng.cam.ac.uk/dstools/paradigm/valuch.html" target="_blank"&gt;5 primary activities we do as a business&lt;/a&gt; (inbound logistics, operations, outbound logistics, market/sell, service) to create value. Secondary activities (procurement, HR, technological development, infrastructure) support the creation of value. Projects that don’t clearly affect the value chain are questionable.&lt;/p&gt;  &lt;p&gt;Remember: Strategic Goal =&amp;gt; Operational Goals =&amp;gt; Operational Capabilities&lt;/p&gt;  &lt;p&gt;Once we know what we need to do, we can design the business architecture and the technical architecture. The business architecture should be a logical arrangement of tasks or capabilities, but does not dictate organizational structure or roles. Note that it is the business processes, not the tasks, that provide business value.&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/131337.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/131337.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/131337.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/131337.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Numeric Chicanery</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/04/02/numeric-chicanery.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/04/02/numeric-chicanery.aspx</id>
        <published>2009-04-02T11:37:24-05:00:00</published>
        <updated>2009-04-02T11:37:24Z</updated>
        <content type="html">&lt;p&gt;For those of you who have been around since the VB6 days, you surely remember the interesting rounding behavior of CInt(x). Specifically, it rounded a number ending in .5 to the nearest &lt;em&gt;even&lt;/em&gt; number. That is, CInt(2.5) rounded to 2 and CInt(3.5) rounded to 4.&lt;/p&gt;  &lt;p&gt;This behavior still exists in VB.NET. No real surprise there. And, to be honest, I don’t mind it that much. When I see “CInt,” I really don’t have any preconceived, intuitive understanding of what it does.&lt;/p&gt;  &lt;p&gt;Math.Round(x) is another question entirely. I &lt;em&gt;expect&lt;/em&gt; it to… well, round. The way I expect. The way were all taught in second grade. Point-five and bigger rounds up; smaller than point-five rounds down. &lt;em&gt;Every time.&lt;/em&gt; Not rounding up sometimes, rounding down other times.&lt;/p&gt;  &lt;p&gt;But, after that rant, you’re not going to be surprised when I tell you that Math.Round behaves just like CInt by default.&lt;/p&gt;  &lt;p&gt;Want proof? Just see what this code outputs:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Console.WriteLine(Math.Round(1.5))     &lt;br /&gt;Console.WriteLine(Math.Round(2.5))      &lt;br /&gt;Console.WriteLine(Math.Round(3.5))      &lt;br /&gt;Console.WriteLine(Math.Round(4.5))&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There is an easy way to make this code work more intuitively. This code yields the results you’d expect:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Console.WriteLine(Math.Round(1.5, MidpointRounding.AwayFromZero))     &lt;br /&gt;Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero))      &lt;br /&gt;Console.WriteLine(Math.Round(3.5, MidpointRounding.AwayFromZero))      &lt;br /&gt;Console.WriteLine(Math.Round(4.5, MidpointRounding.AwayFromZero))&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The insidious thing about this problem is that you often have to create very specific test cases to uncover this issue. It’s particularly nasty, since the actual behavior differs very slightly from the intuitive behavior.&lt;/p&gt;  &lt;p&gt;You’ve been warned.&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/130683.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/130683.aspx</wfw:comment>
        <slash:comments>3</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/130683.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/130683.aspx</trackback:ping>
    </entry>
    <entry>
        <title>MVP renewal</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/04/01/mvp-renewal.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/04/01/mvp-renewal.aspx</id>
        <published>2009-04-01T08:26:47-05:00:00</published>
        <updated>2009-04-01T08:26:47Z</updated>
        <content type="html">&lt;p&gt;Just got the e-mail from Microsoft, so it’s official. I’ve been renewed as a Microsoft MVP for another year!&lt;/p&gt;  &lt;p&gt;And, no.. this isn’t an April Fools’ Day joke. I’m an April 1 MVP.&lt;/p&gt;  &lt;p&gt;Congrats to all those renewed, and especially to those who were awarded for the first time.&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/130636.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/130636.aspx</wfw:comment>
        <slash:comments>3</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/130636.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/130636.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Microsoft P&amp;amp;P team releases VB support for Composite Application Guidance for WPF and Silverlight (aka &amp;quot;Prism&amp;quot;)</title>
        <link rel="self" type="text/html" href="http://blog.dotnetspeech.net/archive/2009/03/25/microsoft-pampp-team-releases-vb-support-for-composite-application-guidance.aspx" />
        <id>http://blog.dotnetspeech.net/archive/2009/03/25/microsoft-pampp-team-releases-vb-support-for-composite-application-guidance.aspx</id>
        <published>2009-03-25T10:37:31-05:00:00</published>
        <updated>2009-03-25T10:37:31Z</updated>
        <content type="html">&lt;p&gt;One of the places lacking good VB support was the Microsoft Patterns &amp;amp; Practices’ Composite Application Guidance for WPF and Silverlight (formerly code-named "Prism"). The P&amp;amp;P team is now releasing VB versions of the QuickStarts, Hands-On Labs, and How-to Topics! &lt;/p&gt;  &lt;p&gt;Get all the good stuff &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=537da1cd-43e1-4799-88e7-a1da9166fb46" target="_blank"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This download is provided to help Visual Basic .NET developers use the Composite Application Library. While Prism is not yet 100% VB, this is a big step in the right direction. The VB code was reviewed by VB Language PM Jonathan Aneja as well as VB Doc Writer Doug Rothaus, so you can be sure this won't be the usual "C# run through a code converter" translation.&lt;/p&gt;  &lt;p&gt;Great work by the team!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=537da1cd-43e1-4799-88e7-a1da9166fb46"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.dotnetspeech.net/aggbug/130405.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.dotnetspeech.net/comments/130405.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.dotnetspeech.net/comments/commentRss/130405.aspx</wfw:commentRss>
        <trackback:ping>http://blog.dotnetspeech.net/services/trackbacks/130405.aspx</trackback:ping>
    </entry>
</feed>