<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Architecture enabling business</title>
	<atom:link href="http://technogility.sjcarriere.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://technogility.sjcarriere.com</link>
	<description>Thoughts on how architecture, process and technology should enable business (and other miscellany)</description>
	<lastBuildDate>Sun, 16 Aug 2009 15:03:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='technogility.sjcarriere.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/eb61fa21371df3cfa96dfb9ad340e23d?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Architecture enabling business</title>
		<link>http://technogility.sjcarriere.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://technogility.sjcarriere.com/osd.xml" title="Architecture enabling business" />
	<atom:link rel='hub' href='http://technogility.sjcarriere.com/?pushpress=hub'/>
		<item>
		<title>Keyboards</title>
		<link>http://technogility.sjcarriere.com/2009/08/15/keyboards/</link>
		<comments>http://technogility.sjcarriere.com/2009/08/15/keyboards/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 22:10:20 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/08/15/keyboards/</guid>
		<description><![CDATA[I’m a keyboard junky.&#160; I have dozens. I sometimes switch between keyboards multiple times during a single day.&#160; Yes, it’s a problem. Here are my four favorites.&#160; Clearly, I like the tactile feedback of clicky keyboards: IBM Model M – the most obnoxious for my neighbors, but with the best feel ever.&#160; Unusable if you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=80&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I’m a keyboard junky.&#160; I have dozens. I sometimes switch between keyboards multiple times during a single day.&#160; Yes, it’s a problem.</p>
<p>Here are my four favorites.&#160; Clearly, I like the tactile feedback of clicky keyboards:</p>
<ol>
<li><a href="http://en.wikipedia.org/wiki/Model_M_keyboard">IBM Model M</a> – the most obnoxious for my neighbors, but with the best feel ever.&#160; Unusable if you have a headache.&#160; One of two keyboards on my list with a Wikipedia page. </li>
<li><a href="http://www.daskeyboard.com/">DAS Keyboard Professional</a> – came second because I think the keyclick is a bit high-pitched, and my spacebar squeaks.&#160; I don’t need the key labels, but I’m not geek enough, I guess, to go blank. </li>
<li>NMB RT8255C – good click, solid. This keyboard is so obscure I couldn’t even find something to link to.&#160;&#160; I came across this keyboard at a business center in the Albany airport, and it took me several years to find one (I bought two, actually).&#160;&#160; My one complaint is the weird placement of the backslash key, in the top row, left of backspace.</li>
<li><a href="http://www.kinesis-ergo.com/advantage.htm">Kinesis Advantage</a> – something completely different, for when the clicking gets to be too much, or my wrists start to hurt. I’ve got the cool Qwerty/Dvorak one, just for the key labels.&#160; I’ve been typing Dvorak for 20 years, and this is my first and only Dvorak-labeled keyboard. </li>
</ol>
<p>And the runners up:</p>
<ol>
<li><a href="https://www.microsoft.com/hardware/mouseandkeyboard/ProductDetails.aspx?pid=081">Microsoft Wireless Entertainment Desktop 7000</a> – love the action, hate the F-keys. </li>
<li><a href="http://www.clickykeyboards.com/index.cfm/fa/items.main/parentcat/20188/subcatid/0/id/243728">Dell AT101</a> – the “Black Alps” switches are quieter than the “buckling spring” switches in the Model M, and I find the keys a bit “loose” – they rattle. </li>
</ol>
<p>Finally, the ones you can’t pay me to use:</p>
<ol>
<li><a href="http://www.logitech.com/index.cfm/keyboards/keyboard_mice_combos/devices/140&amp;cl=MY,EN">Logitech MX3200</a> – totally flat, uninspired.&#160; Not sure why I bought it. </li>
<li>The new <a href="http://store.apple.com/us/product/MB110LL/A?fnode=MTY1NDA1Mg&amp;mco=NDE4NDIyOA">Apple Keyboard</a> – I don’t even know where to start. </li>
</ol>
<p>Just thought I’d share.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=80&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/08/15/keyboards/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
		<item>
		<title>It&#8217;s pronounced like &#8220;lamb&#8221;, not like &#8220;lame&#8221;</title>
		<link>http://technogility.sjcarriere.com/2009/05/11/its-pronounced-like-lamb-not-like-lame/</link>
		<comments>http://technogility.sjcarriere.com/2009/05/11/its-pronounced-like-lamb-not-like-lame/#comments</comments>
		<pubDate>Mon, 11 May 2009 23:55:24 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/05/11/its-pronounced-like-lamb-not-like-lame/</guid>
		<description><![CDATA[With that out of the way, it’s time for an update on the Lightweight Architecture Alternative Assessment Method (if you’re judging – negatively &#8211; the quality of the acronym, you wouldn’t be the first), which I first blogged about four years and three jobs ago.&#160; Since then, LAAAM has undergone some refinement, shaped by collaboration [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=78&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>With that out of the way, it’s time for an update on the Lightweight Architecture Alternative Assessment Method (if you’re judging – negatively &#8211; the quality of the acronym, you wouldn’t be the first), which I first <a href="http://blogs.msdn.com/jeromyc/archive/2005/08/27/457081.aspx">blogged</a> about four years and three jobs ago.&#160; Since then, LAAAM has undergone some refinement, shaped by collaboration and experience in its use at <a href="www.fidelity.com">Fidelity</a> and <a href="www.vistaprint.com">VistaPrint</a>. This week is <a href="http://www.msteched.com/teched/default.aspx">Microsoft TechEd</a>, and&#160; I’m giving a presentation on LAAAM this Tuesday at 10:15AM: ARC314.&#160; I’m also doing a Tech Talk Interview with <a href="http://blogs.msdn.com/bobfamiliar/">Bob Familiar</a> on Thursday.</p>
<h1></h1>
<h2>Why do LAAAM?</h2>
<p>The first question should actually be: “why evaluate architectures?” Generally speaking, analyzing architectures gives us an opportunity to make good decisions early in the software development lifecycle, reducing risk and improving the quality of what we deliver. This benefit is possible because architectural decisions – the earliest decisions in a system’s life – are the primary determiners of quality: performance, scalability, reliability, flexibility, and so forth.&#160; Unfortunately, the state of the practice in making architectural decisions is most senior/loudest/most patient debater wins. Sometimes this produces good decisions, but it’s not very predictable or repeatable, and we don’t usually end up with a clear and documented rationale.</p>
<p>LAAAM&#8217;s first, and perhaps most important, contribution to the software development lifecycle is its focus on defining what <i>quality</i> means for a given system or product.&#160; The &quot;–ilities&quot; are commonly used, coarsely, to talk about architectural quality, and they usually give us a nice warm-and-fuzzy; who wouldn’t want a system that exhibits scalability and reliability and flexibility and maintainability? </p>
<p>The second important contribution of LAAAM is the way it brings together stakeholders –&#160; i.e. <em>anyone</em> that cares about the outcome of a decision – from the business,the development team, operations, QA, etc.&#160; LAAAM helps achieve a common language and decision framework. LAAAM helps to build consensus. That doesn&#8217;t mean everyone has to agree on everything, but it does mean that everyone&#8217;s perspective is on the table and the final result represents a fusion of those perspectives into a rational whole. </p>
<p>Finally, LAAAM produces a set of artifacts that represent a rigorous, rational decision-making process. These artifacts are extremely valuable in justifying architectural decisions; yes, ideally all of the stakeholders in those decisions would participate in the process as described above, but obviously that&#8217;s not always possible. So the LAAAM artifacts give us a way to express the reasoning that went into a given decision, with a foundation in the definition of quality for a system. </p>
<h2>Quality</h2>
<p>The first, and most important, step in LAAAM is to figure out what quality means for a given decision.&#160; In other words, when all is said and done, and we look back on the decision, what’s going to make us say “that was the <em>right</em> decision”?&#160; The –ilities give us a starting point, but they’re not enough.&#160; LAAAM takes a page from the <a href="http://www.sei.cmu.edu/architecture/ata_method.html">ATAM</a> playbook here, and has us build a quality tree (ATAM calls it a utility tree, and LAAAM used to, but the term confused people) to structure our thinking.&#160; This is easiest by example:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb.png?w=644&#038;h=396" width="644" height="396" /></a>&#160;</p>
<p>Here, performance (an honorary –itility) and maintainability are the two important quality attributes for whatever decision we’re trying to make (yes, there are always more than two in the real world).&#160; Performance has been refined to have two sub-qualities: response time and scalability.&#160; You get the idea.</p>
<h3>Scenarios</h3>
<h3></h3>
<p>Now the punch line.&#160; LAAAM doesn’t let us stop here, but rather forces another level in the tree: scenarios.&#160; Scenarios (also borrowed from ATAM) give us the mechanism to be <em>precise</em> in defining quality, by ensuring each of our quality attributes are refined to a point of measurability.&#160; In other words, we can look at the alternatives we’re considering and assess how well they achieve a scenario.&#160; You can’t do this when you stop at “flexibility” or “scalability&#8217;”.&#160; Scenarios have a consistent structure: a context, a stimulus and a response.&#160; The context is the state of the environment when the scenario is applied, the stimulus is something happens to the system, and the response is how we want the system to react.&#160; Again, by example:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image1.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb1.png?w=536&#038;h=181" width="536" height="181" /></a> </p>
<p>A couple more:</p>
<ul>
<li>The system network is partitioned and restored to normal condition; complete database resynchronization occurs within 30 minutes. </li>
<li>For a new release, integrate a new component implementation within two days. </li>
</ul>
<p>The context/stimulus/response identification is left as an exercise (hopefully trivial) for the reader.&#160; But note that the last example is different from the first two: it doesn’t apply at run-time, but rather at development time.</p>
<p>(Sidebar: while I’ve presented this a top-down exercise &#8211; first level quality attributes, second level quality attributes, scenarios – it’s not always done this way; in fact, it’s probably rare.&#160; More often, the quality definition comes cyclically – you start with a few first level quality attributes that you think are important, someone throws out a scenario or two, you add some second level quality attributes to group them, and so on.&#160; LAAAM doesn’t insist on any specific approach to building the quality tree, so long as it gets done.)</p>
<p>Now, let’s put some scenarios into our example quality tree:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image2.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb2.png?w=644&#038;h=396" width="644" height="396" /></a></p>
<p>Great, I want it all!&#160; But wait …</p>
<h3>Knowing What’s Important</h3>
<p>Unfortunately, quality attributes trade off against one another.&#160; There come times when you have to choose to achieve versus another, and it’d be nice to know in advance how to know which to is the right one.&#160; In the most general case, we could try to weight all of our scenarios, but this is really hard, especially when trying to get people with competing concerns to agree.&#160; Instead, LAAAM follows an approach of <em>ranking</em> at each node in the quality tree, like so:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image3.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb3.png?w=644&#038;h=396" width="644" height="396" /></a> </p>
</p>
</p>
<p>So performance is more important than maintainability, scalability is more important than response time, and the steady state scenario is more important than the peak load scenario.&#160; Easy, right? Everyone’s happy to agree?&#160; Not always, but at least we we have a much more constrained series of problems to solve, rather than trying to tackle one big problem.&#160; Sometimes you have to resort to tricks like voting to get to closure, but I’ve seen this be pretty rare.</p>
<h3>Scenario Weights</h3>
<p>The next step is completely mechanical.&#160; Using a formula called “rank order centroids” ROC, we compute a weight for each scenario.&#160; I came across ROC in an <a href="http://msdn.microsoft.com/en-us/magazine/default.aspx">MSDN Magazine</a> Test Run article called “<a href="http://msdn.microsoft.com/en-us/magazine/cc300812.aspx">Competitive Analysis Using MAGIQ</a>”, but it originated with Barron and Barrett’s 1996 paper “<a href="http://mansci.journal.informs.org/cgi/content/abstract/42/11/1515">Decision Quality Using Ranked Attribute Weights</a>”.&#160; Anyhow, ROC computes a weight for a given ranking like this:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image4.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb4.png?w=118&#038;h=122" width="118" height="122" /></a> </p>
<p>Where <em>N</em> is the number of options and <em>k</em> is the rank.&#160; So above, flexibility was ranked 2 out of 3 options:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image5.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb5.png?w=244&#038;h=106" width="244" height="106" /></a>If you’re thinking “wow, this really favors the highly ranked options”, you’re right – that’s the point.&#160; The idea is that this is, psychologically speaking, how people actually apply importance to rankings. There’s lots of interesting other work in this area.&#160; Check out: <a href="http://www3.interscience.wiley.com/journal/4649/abstract?CRETRY=1&amp;SRETRY=0">Attribute Weighting Methods and Decision Quality in the Presence of Response Error: A Simulation Study</a>.</p>
<p>LAAAM isn’t wed to rank order centroids, and sometimes we use linear, or even manual (danger, Will Robinson) weightings at one node in the utility tree when the stakeholders decide it’s more reflective of the actual relative importance of sub-qualities or scenarios. Rank order centroids has proven pretty effective though, so it’s the default.&#160; Whichever approach you use to determine the weight for a given ranking, the last step is to compute the product of the rankings for each path through the utility tree, to come up with the scenario weights:</p>
<p><a href="http://technogility.files.wordpress.com/2009/05/image6.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://technogility.files.wordpress.com/2009/05/image_thumb6.png?w=644&#038;h=390" width="644" height="390" /></a> </p>
<p>So the steady state scenario has a total weight of .140625 and the peak load scenario has a total weight of .046875.&#160; Nothin’ to it.</p>
<h2>Alternatives</h2>
<p>Excellent, now we’ll know what we like when we see it. The next step is to figure out what the choices are – what are the alternative decisions, solutions, platforms, whatever, that we’re trying to choose among.&#160; But first, note that all of the work we’ve done up to this point (i.e. creating a fully ranked quality tree with scenarios) is completely independent of the decision itself – this makes it much more persistent through time, even able to outlive a single instantiation of a system.</p>
<p>Generally, compared to defining quality, it’s pretty easy to identify our alternatives; usually the participants in the process have a pretty good idea about the options &#8211; <a href="http://www.microsoft.com/NET/">.NET</a> or <a href="www.java.com">Java</a> or <a href="http://www.ruby-lang.org/en/">Ruby</a>? On-premise or in the <a href="http://en.wikipedia.org/wiki/Cloud_computing">cloud</a>? <a href="https://www.hibernate.org/">Hibernate</a> or <a href="http://ibatis.apache.org/">iBATIS</a>? <a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx">Entity Framework</a> or <a href="http://msdn.microsoft.com/en-us/library/bb386976.aspx">LINQ to SQL</a> or <a href="https://www.hibernate.org/343.html">NHibernate</a>? <a href="http://www.microsoft.com/Sharepoint/default.mspx">SharePoint</a> or <a href="http://www.documentum.com/">Documentum</a>?&#160; The common challenge at this point isn’t in identification of the alternatives, but in <em>defining</em> them to a sufficiently precise degree that we can assess them.&#160; Sometimes this means we have to do more investigative work during the LAAAM process, but the scenarios guide us to where this investigation is required.</p>
<h2></h2>
<h2>Assessment</h2>
<p>Finally, we get to the third A in LAAAM – Assessment.&#160; Somewhat counter-intuitively, this part is actually the easiest.&#160; All we need to do is fill in this table:</p>
<table border="1" cellspacing="0" cellpadding="2" width="468">
<tbody>
<tr>
<td valign="top" width="120">
<p align="left"><strong>Scenario</strong></p>
</td>
<td valign="top" width="120">
<p align="left"><strong>Alternative 1</strong></p>
</td>
<td valign="top" width="114">
<p align="left"><strong>Alternative 2</strong></p>
</td>
<td valign="top" width="112">
<p align="left"><strong>Alternative 3</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="127">Scenario 1</td>
<td valign="top" width="126">&#160;</td>
<td valign="top" width="118">&#160;</td>
<td valign="top" width="116">&#160;</td>
</tr>
<tr>
<td valign="top" width="128">Scenario 2</td>
<td valign="top" width="128">&#160;</td>
<td valign="top" width="120">How well does alternative 2 achieve scenario 2?</td>
<td valign="top" width="118">&#160;</td>
</tr>
<tr>
<td valign="top" width="126">…</td>
<td valign="top" width="128">&#160;</td>
<td valign="top" width="121">&#160;</td>
<td valign="top" width="119">&#160;</td>
</tr>
</tbody>
</table>
<p>Each cell will contain a very simple assessment measure: usually we use a scale like poor, fair, adequate, good, excellent. This part of the process is done collaboratively with the subject matter experts for each of the alternatives, plus whatever additional supporting players are required.&#160; Comparing alternatives is fine; in fact, it commonly makes the process go very quickly when you can establish a firm baseline (usually with the alternative that’s best understood) and ask questions like “is this solution better or worse?” </p>
<p>Now turn the ratings into numeric values (it doesn’t matter what they are, as long as they’re linearly distributed), multiply each by the weight, and you’re done (d’oh, I just realized the math in my TechEd deck is wrong):</p>
<table border="1" cellspacing="0" cellpadding="2" width="481">
<tbody>
<tr>
<td valign="top" width="97">
<p align="left"><strong>Scenario</strong></p>
</td>
<td valign="top" width="73">
<p align="left"><strong>Weight</strong></p>
</td>
<td valign="top" width="104">
<p align="left"><strong>Alternative 1</strong></p>
</td>
<td valign="top" width="103">
<p align="left"><strong>Alternative 2</strong></p>
</td>
<td valign="top" width="102">
<p align="left"><strong>Alternative 3</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="100">Scenario 1</td>
<td valign="top" width="77">.140625</td>
<td valign="top" width="107">Poor (0)</td>
<td valign="top" width="105">Fair (1)</td>
<td valign="top" width="104">Excellent (4)</td>
</tr>
<tr>
<td valign="top" width="100">Scenario 2</td>
<td valign="top" width="79">.046875</td>
<td valign="top" width="108">Good (3)</td>
<td valign="top" width="106">Adequate (2)</td>
<td valign="top" width="105">Fair (1)</td>
</tr>
<tr>
<td valign="top" width="98">Total</td>
<td valign="top" width="80">&#160;</td>
<td valign="top" width="108">.140625</td>
<td valign="top" width="106">.234375</td>
<td valign="top" width="105">.609375</td>
</tr>
</tbody>
</table>
<h2></h2>
<p>(Footnote: if you read my earlier blog on LAAAM, you’ll notice that each cell actually contained three assessment “dimensions”: <em>fit</em>, <em>development cost</em> and <em>operations cost</em>. Repeated application of the method made it clear that cost is almost always smeared across the scenarios in a way that makes asking about it in each cell very difficult.&#160; Effectively incorporating cost back into the method is an important subject for future work,&#160; but it hasn’t inhibited adoption yet.)</p>
<h2>Final Analysis</h2>
<p>Unfortunately, we don’t get to simply declare that Alternative 3 is the winner, even though it had the highest score.&#160; We do have an ordering of our alternatives, and we can get an idea about their relative adequacy.&#160; To be thorough with the method, though, we need to ask a question about <em>sensitivity</em>: which scenarios are heavily weighted and exhibit significant differentiation among the alternatives?&#160; These are the important ones, where we want to be sure about our assessment.&#160; A second pass to validate sensitive scenarios is a good follow-up.</p>
<p>Also, in cases where a narrow margin exists between highly-rated alternatives (e.g. when they’re within 20%), one approach to refining the analysis is to add scenarios to further differentiate the alternatives. One way to do this is to decompose sensitive scenarios into sub-scenarios to probe related concerns. Sometimes it&#8217;s necessary to refine the definition of one of the alternatives and iterate on the analysis; such refinement may require, for example, a proof-of-concept implementation.</p>
<h2>Tool</h2>
<p>At TechEd I showed a demo of the Quality-Oriented Decision Assessment (QODA) tool, developed by Gary Chamberlain, the lead for Platform Architecture here at <a href="www.vistaprint.com">VistaPrint</a>.&#160; Although it’s pretty new, there’s already plenty of evidence that adoption of the method (which we’re now calling QODA inside VistaPrint) is substantially assisted with this tool support.&#160; Previously the only “support” was an Excel spreadsheet, which was painful to work with. The tool isn’t currently generally available, but we’re hoping to make it so sometime soon.&#160; Stay tuned.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=78&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/05/11/its-pronounced-like-lamb-not-like-lame/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb5.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/05/image_thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Lessons learned</title>
		<link>http://technogility.sjcarriere.com/2009/04/09/lessons-learned/</link>
		<comments>http://technogility.sjcarriere.com/2009/04/09/lessons-learned/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 17:19:45 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/04/09/lessons-learned/</guid>
		<description><![CDATA[I believe every developer and architect should keep track of their personal &#34;lessons learned&#34; for software/process/organization design and, broadly, how they practice as a software professional. Further, I expect that I&#8217;m like a lot of other architects in doing so somewhat irregularly, and therefore almost certainly retreading and relearning more than necessary. So what better [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=52&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I believe every developer and architect should keep track of their personal &quot;lessons learned&quot; for software/process/organization design and, broadly, how they practice as a software professional. Further, I expect that I&#8217;m like a lot of other architects in doing so somewhat irregularly, and therefore almost certainly retreading and relearning more than necessary. So what better place to capture my lessons learned than here? </p>
<p>I actually made a first pass at this, somewhat sideways, as part of a talk called &quot;An Architecture Journey&quot; I gave at the <a href="http://www.sei.cmu.edu/architecture/saturn/2007/">SATURN conference</a> at the <a href="http://www.sei.cmu.edu">Software Engineering Institute</a> in 2007. The <a href="http://www.sei.cmu.edu/architecture/saturn/2007/keynotes.html">abstract</a> and <a href="http://www.sei.cmu.edu/architecture/saturn/2007/presentations/Carriere_keynote.pdf">slides</a> are posted. The gist of the talk was to share lessons I had learned during my various jobs as a developer and architect, along with some observations on how my definition and practice of software architecture evolved over that time. I gave a slightly perturbed version of this talk at Google Canada in Waterloo, where my good friend Steve Woods is the site director. Below are some of the lessons I came up with, paraphrased, and in chronological order.&#160; Sure, these don’t really stand on their own (and some may be downright cryptic), so the more interesting ones will likely become posts of their own.</p>
<p><u>Nortel</u></p>
<ul>
<li>Big systems are tough to get right; thinking about “architecture stuff” up front is required for success (like avoiding measuring time-to-dialtone in minutes after a major system reengineering effort).</li>
</ul>
<p><u>SEI</u></p>
<ul>
<li>Architecture is the bearer of quality, but reasoning about architecture is reasoning about <em>potential.</em> </li>
</ul>
<p><u>Quack/AOL</u></p>
<ul>
<li>Enabling autonomy of organizations and systems is the way you scale.</li>
</ul>
<p><u>Microsoft</u></p>
<ul>
<li>You don’t need to choose between reasoning top-down and bottom-up: do spiral. </li>
<li>You’ll rarely (never?) know in advance if a decision is right, but make sure you know afterward. </li>
<li>Technology doesn’t matter (much); it’s about the people, the process, and the consistency of practice. </li>
</ul>
<p><u>Fidelity</u></p>
<ul>
<li>Figure out who defines goodness of your work and make them happy. </li>
<li>Don’t let “pragmatism” become a disguise for shortsightedness. </li>
<li>Communication and understanding trump every technical problem. </li>
<li>Plan for technology retirement, not just adoption. </li>
</ul>
<p><u>VistaPrint</u></p>
<ul>
<li>Don&#8217;t boil the frog with standards. (As the most cryptic, there will definitely be a post coming on this one.)</li>
<li>Be dumb. Ask smart questions. </li>
<li>Don&#8217;t undervalue <a href="http://www.amazon.com/Slack-Getting-Burnout-Busywork-Efficiency/dp/0767907698/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1239297113&amp;sr=8-1">slack</a>. </li>
<li>Don’t forget your lesson about autonomy: define boundaries and common language when crossing them.</li>
</ul>
<p>I’m currently particularly excited about the autonomy and slack lessons (not coincidentally the last two on the list), so expect posts on them before too long.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=52&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/04/09/lessons-learned/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
		<item>
		<title>Technogility!?</title>
		<link>http://technogility.sjcarriere.com/2009/02/11/technogility/</link>
		<comments>http://technogility.sjcarriere.com/2009/02/11/technogility/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 14:25:49 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/02/11/technogility/</guid>
		<description><![CDATA[Maybe this should have been the first post on my new blog, but I didn&#8217;t want to show any (overt) signs of mental weakness too soon. The totally bogus pseudo-word &#34;technogility&#34; was one of those that jumped into my head and blocked any rational thought about better alternatives (that reminds me: go read Pragmatic Thinking [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=51&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Maybe this should have been the first post on my new blog, but I didn&#8217;t want to show any (overt) signs of mental weakness too soon.</p>
<p>The totally bogus pseudo-word &quot;technogility&quot; was one of those that jumped into my head and blocked any rational thought about better alternatives (that reminds me: go read <a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1234362212&amp;sr=8-1">Pragmatic Thinking and Learning: Refactor Your Wetware</a>, if you haven’t already). My only excuse is that somehow, at least to me, the word has an intuitive connection to how technology enables business &#8211; specifically the topic I think is most important to our industry (and the subtitle of this blog).</p>
<p>Technology organizations are always challenged to continue to deliver value to their business partners (i.e. the proxy for the end customer, trying to figure out what they want), particularly as both the technology organization and their partners scale. Sometimes they scale differently, and sometimes the scaling is transformational &#8211; that is, one of the organizations has to radically restructure in order to continue to deliver. Agility is therefore fundamental, and brittleness is the enemy. When we create cultures, organizations, processes, tools, frameworks, etc. that are rigidly aligned to a particular mode of delivery, we put the entirety of the business at risk.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=51&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/02/11/technogility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
		<item>
		<title>Talk at TechEd 2009</title>
		<link>http://technogility.sjcarriere.com/2009/01/29/talk-at-teched-2009/</link>
		<comments>http://technogility.sjcarriere.com/2009/01/29/talk-at-teched-2009/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 18:53:59 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/01/29/talk-at-teched-2009/</guid>
		<description><![CDATA[I’ve had a talk on the Lightweight Architecture Alternative Assessment Method accepted for the Architecture track at TechEd 2009.&#160; Here’s the abstract: Making good architectural decisions, fast! This session will present and demonstrate the Lightweight Architecture Alternative Assessment Method (LAAAM), a fast and efficient way to make good architectural decisions &#8211; decisions that are aligned [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=48&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I’ve had a talk on the <a href="http://blogs.msdn.com/jeromyc/archive/2005/08/27/457081.aspx">Lightweight Architecture Alternative Assessment Method</a> accepted for the Architecture track at <a href="http://www.microsoft.com/events/TechEd2009/">TechEd 2009</a>.&#160; Here’s the abstract:</p>
<p><b>Making good architectural decisions, fast!</b></p>
<p><i>This session will present and demonstrate the Lightweight Architecture Alternative Assessment Method (LAAAM), a fast and efficient way to make good architectural decisions &#8211; decisions that are aligned with the needs of your business. Making good architectural decisions early in the software development lifecycle helps reduce project risk and ensures that precious time and energy isn&#8217;t wasted delivering solutions that miss the mark. This is critical in our ever-accelerating software development world. LAAAM&#8217;s most unique characteristic is its focus on defining what quality means for a given system or product. We all want to create high-quality products, but LAAAM helps us go further in determining the aspects of quality that are important to the stakeholders for a given system. The &quot;-ilities&quot; are commonly used, coarsely, to talk about architectural quality; however, LAAAM won&#8217;t let us simply say &quot;my system has to be scalable&quot; or &quot;I need flexibility&quot;. Instead, LAAAM forces us to be a. precise in the kinds of scalability and flexibility that are important; and b. prioritize these quality attributes so that appropriate tradeoff decisions can be made. LAAAM produces a set of artifacts that represent a rigorous, rational decision making process. These artifacts are extremely valuable in justifying and communicating architectural decisions, since it&#8217;s rarely possible (or even desirable) to have every stakeholder involved in every conversation. The LAAAM artifacts give us a way to express the reasoning that went into a given decision, with a foundation in the definition of quality for a system. LAAAM has been successfully applied to make decisions large and small at Microsoft, Fidelity and VistaPrint. LAAAM draws its roots from the Architecture Tradeoff Analysis Method developed at the Software Engineering Institute at Carnegie Mellon University. </i></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=48&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/01/29/talk-at-teched-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
		<item>
		<title>Simple Architectures for Complex Enterprises</title>
		<link>http://technogility.sjcarriere.com/2009/01/26/simple-architectures-for-complex-enterprises/</link>
		<comments>http://technogility.sjcarriere.com/2009/01/26/simple-architectures-for-complex-enterprises/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 17:29:28 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/01/26/simple-architectures-for-complex-enterprises/</guid>
		<description><![CDATA[Last Wednesday I attended a meeting of the New England chapter of the International Association of Software Architects, where Roger Sessions, CTO of ObjectWatch, gave a great talk based on his &#8220;Simple Architectures for Complex Enterprises&#8221; book. (I bought the book during the talk using the Amazon iPhone app &#8230; the last thing I needed [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=42&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Last Wednesday I attended a meeting of the New England chapter of the <a href="http://www.iasahome.org">International Association of Software Architects</a>, where Roger Sessions, CTO of <a href="http://www.objectwatch.com">ObjectWatch</a>, gave a great talk based on his &#8220;<a href="http://www.amazon.com/Architectures-Enterprises-PRO-best-Practices-Microsoft/dp/0735625786/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1232629384&amp;sr=8-1">Simple Architectures for Complex Enterprises</a>&#8221; book. (I bought the book during the talk using the Amazon iPhone app &#8230; the last thing I needed was more enablement to buy stuff from Amazon.)</p>
<p>Below are my raw notes. Anything annotated &#8220;<strong>Thought</strong>&#8221; is something I was thinking, but didn&#8217;t say; generally I haven&#8217;t edited these, so some are addressed later in the talk (and some are just plain wrong). Further, I offer no guarantee that I haven&#8217;t misinterpreted something Roger said.<span style="font-family:Monaco;font-size:9px;"> </span></p>
<ul style="list-style-type:disc;">
<li>Address the &#8220;problem of complexity&#8221; &#8211; the &#8220;biggest problem in IT&#8221;</li>
<li>Federal IT</li>
<li>
<ul style="list-style-type:hyphen;">
<li>$71B in federal IT projects; $47B invested in &#8220;at risk&#8221; projects</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Opportunity cost? (What government can&#8217;t do without the projects delivered)</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Estimated at 5x; a company would demand 5x ROI on an IT project</li>
</ul>
</li>
</ul>
</li>
<li>100% of defense-related projects on the &#8220;at risk&#8221; list</li>
</ul>
</li>
<li>Map to private sector</li>
<li>
<ul style="list-style-type:hyphen;">
<li>$14T GDP; assume 5% in IT =&gt; $700B in IT (? something wrong)</li>
<li>Assume 33% at risk (no evidence) =&gt; $231B in at-risk projects</li>
<li><strong>Thought</strong>: aren&#8217;t there already good studies on this stuff?</li>
<li>Now assume 5x in opportunity cost again =&gt; $1.115T</li>
</ul>
</li>
<li>Back to federal IT</li>
<li>
<ul style="list-style-type:hyphen;">
<li>FEA rollout in 2006, specifically to address the problem if at-risk IT projects</li>
<li>Trend in IT projects considered at risk:</li>
<li>
<ul style="list-style-type:hyphen;">
<li>30% iin 2007; 43% in 2008; 66% in 2009</li>
</ul>
</li>
<li><strong>Thought</strong>: why would anyone think that FEA would address this?</li>
</ul>
</li>
<li>Epidemiology</li>
<li>
<ul style="list-style-type:hyphen;">
<li>In medicine, we assume some common factor when many exhibitions of common symptoms (illness, death)</li>
<li>How?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Look at all the characteristics of the individuals involved to identify commonality, and assume that it is the common factor or a contribution to it</li>
</ul>
</li>
</ul>
</li>
<li>What is the common factor for IT risk/failures?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Not geography, industry, methodology, technology</li>
<li>Roger&#8217;s belief: complexity: the only common factor across all failures</li>
</ul>
</li>
<li><strong>Thought</strong>: what are the long-term trends? Are we at a new peak of complexity relative to failures?</li>
<li>Questions</li>
<li>
<ul style="list-style-type:hyphen;">
<li>What&#8217;s complexity? all-in: organizational, data schema, code</li>
<li>My question: presume you consider also organizational complexity as well as systems complexity?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: Mostly organizational, actually; can rebuild systems</li>
</ul>
</li>
<li>Is communication the problem?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: A sympton, not the cause.</li>
</ul>
</li>
<li>Why not identified sooner? What happens to at-risk projects?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: Some fail because they run out of money. Some because they don&#8217;t meet the needs of the business.</li>
</ul>
</li>
</ul>
</li>
<li>Can&#8217;t build architectural quality attributes (security, as an example) into a complex system. Much harder than doing so for a simple system.</li>
<li>Complexity</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Glass&#8217;s Law</li>
<li>
<ul style="list-style-type:hyphen;">
<li>For every 25% increase in problem complexity, there is a 100% increase in solution complexity.</li>
<li>
<ul style="list-style-type:hyphen;">
<li>(Not stated by Glass, but implied by his &#8220;Facts and Fallacies of Software Engineering&#8221;)</li>
</ul>
</li>
</ul>
</li>
<li>If you have a system with 10 functions, how many functions can you add before doubling the complexity? 2 or 3.</li>
<li>If you double the number of functions in a system, you increase complexity by 8x.</li>
</ul>
</li>
<li>Implications</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Methodologies that work well for small projects don&#8217;t work well for large projects.</li>
<li>
<ul style="list-style-type:hyphen;">
<li>e.g. agile</li>
</ul>
</li>
</ul>
</li>
<li><strong>Thought:</strong> isn&#8217;t the solution to make our &#8220;systems&#8221; smaller. This is what SOA was about &#8211; autonomy.</li>
<li>Methodologies/frameworks don&#8217;t explicitly address complexity, so won&#8217;t succeed.</li>
<li>Questions</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Isn&#8217;t agile about breaking large projects/systems into small ones?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: Agile doesn&#8217;t tell you how to do that, but if you can conceive small systems/projects, agile be effective.</li>
</ul>
</li>
<li>Examples of projects/companies that have succeeded?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: A current client: a state government replacing their IT system. Using &#8220;this&#8221; methodology to decompose.</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Who could respond to a 400 page RFP? Only 3 or 4 firms. Predetermines the solution.</li>
</ul>
</li>
</ul>
</li>
<li>Problem is lack of cohesion and loss of knowledge? Doesn&#8217;t this increase complexity?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: Problem is when we lose knowledge of complex systems, not the root.</li>
<li>A: If complexity is managed as a primary concern, the others won&#8217;t manifest.</li>
</ul>
</li>
<li>Doesn&#8217;t this imply that we just spend more time on up-front design?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: Yes, but we need to design explicitly to manage complexity.</li>
</ul>
</li>
<li>Survivability of requirements/stability of organizations?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: Also symptoms. Need to address holistically.</li>
</ul>
</li>
</ul>
</li>
<li>Model for complexity: a function of the number of states a system can be in</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A penny has two; two have four (or three?); a six-sided die has 6</li>
<li><strong>Thought</strong>: this is unmeasurable for a software system of any relevance. Does that matter?</li>
<li>Generally: (number of states)^(number of objects)</li>
<li>Justifies Glass&#8217;s law: if we add functionality, we add variables linearly. If we add variables linearly, we add complexity exponentialy.</li>
</ul>
</li>
<li>Questions</li>
<li>
<ul style="list-style-type:hyphen;">
<li>What&#8217;s a database row in this model?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>A: &lt;shrug/&gt; Consider database columns as variables.</li>
</ul>
</li>
</ul>
</li>
<li>If we split up &#8220;systems&#8221;, we manage:</li>
<li>
<ul style="list-style-type:hyphen;">
<li>One system of 12 6-state objects =&gt; &gt;2B states</li>
<li>2 systems of 6 6-state objects each =&gt; &lt; 2 x 45K states</li>
</ul>
</li>
<li>Glass&#8217;s Law</li>
<li>
<ul style="list-style-type:hyphen;">
<li>100 -&gt; 1164 functions =&gt; 2048x increase in complexity</li>
<li>2 x 582 functions =&gt; 2 x 250 complexity measure</li>
<li>Keep going &#8230;</li>
</ul>
</li>
<li>(Mentions SOA in passing; presumes independence of systems; clearly motivated by previous work on Software Fortresses)</li>
<li>
<ul style="list-style-type:hyphen;">
<li><strong>Thought</strong>: Estimate independence with autonomy?</li>
</ul>
</li>
<li>As number of subsystems increases, you reach a complexity minimum, then complexity begins increasing</li>
<li>
<ul style="list-style-type:hyphen;">
<li>=&gt; need to know when to stop decomposing</li>
<li>Workflow and management complexity increases &#8211; need to address coordination among subsystems</li>
</ul>
</li>
<li>How to partition? Different complexity curves for each:<img src="http://technogility.files.wordpress.com/2009/01/img-0062.jpg?w=455&#038;h=372" alt="IMG_0062.JPG" width="455" height="372" /></li>
<li>Goal of architects should be to find the simplest possible solution</li>
<li>
<ul style="list-style-type:hyphen;">
<li><strong>Thought</strong>: slight misuse of Einstein&#8217;s &#8220;but no simpler&#8221; quote; impossible to be &#8220;too simple&#8221; in this model, but possible to over-decompose such that simplicity is lost</li>
</ul>
</li>
<li>Ha: &#8220;decibel-driven decision making&#8221; &#8211; whoever yells loudest</li>
<li>How do we know which partitioning is simplest?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Equivalence relations</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Five characteristics</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Binary function: F(x, y)</li>
<li>Boolean: F(x, y) in {true, false}</li>
<li>Reflexive: F(x, x) = true</li>
<li>Symmetric: F(x, y) = F(y, x)</li>
<li>Transitive: F(x, y) = true ^ F(y, z) = true =&gt; F(x, z) = true</li>
</ul>
</li>
<li>Can drive a unique partition with an equivalence function; e.g. same-category-as</li>
<li>But can you convince yourself that there&#8217;s an equivalence function that is correlated to simplicity?</li>
<li>Example: synergy</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Two functions are synergistic if, from the business perspective, neither is useful without the other</li>
<li>Perhaps the optimal equivalence relation</li>
<li>Issue is separating business function and IT realization</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Need collaboration between IT and business to get it right</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Process</li>
<li>
<ul style="list-style-type:hyphen;">
<li>SIP: Simple Iterative Partitions</li>
<li>Value proposition: dramatically improves return on IT investment by addressing complexity.</li>
<li><strong>Thought</strong>: a motivation for SOA. Ok.</li>
</ul>
</li>
<li>Recap</li>
<li>
<ul style="list-style-type:hyphen;">
<li>IT complexity is a major problem</li>
<li>Cannot be solved by existing methodologies</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Can&#8217;t judge architectures today without building them</li>
<li>
<ul style="list-style-type:hyphen;">
<li><strong>Thought</strong>: scenario-based assessments (like LAAAM and ATAM) can help</li>
</ul>
</li>
</ul>
</li>
<li>To solve complexity, must understand it</li>
<li>
<ul style="list-style-type:hyphen;">
<li>SOA by itself isn&#8217;t the answer, because it pre-supposes a decomposition (?)</li>
</ul>
</li>
<li>Can only be solved by &#8220;best possible&#8221; partitioning</li>
<li>Best partitions are driven by equivalence relations</li>
<li>SIP is based on best possible partitioning through equivalence relations</li>
</ul>
</li>
<li><strong>Thought</strong>: partitions today are temporal &#8211; groups of things built at the same time</li>
<li>My question: is there stability in the synergy equivalence relation?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>Argued not, Roger suggested that its the implementations that change, not the partitions</li>
<li>Same argument as documented in <a href="http://www.amazon.com/Enterprise-Architecture-Strategy-Foundation-Execution/dp/1591398398/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1232632242&amp;sr=8-1">Enterprise Architecture as Strategy</a>, <a href="http://msdn.microsoft.com/en-us/library/bb402954.aspx">Motion</a> (Microsoft&#8217;s business architecture methodology &#8211; unsure of its current state)</li>
<li><a href="http://www.lattix.com/about/management.php">Neeraj Sangal</a> of <a href="http://www.lattix.com">Lattix</a>: multi-allocation based on equivalence relation?</li>
<li>
<ul style="list-style-type:hyphen;">
<li>IT is a problem, because they want to select a single solution (implementation) for multiple business problems. e.g. scheduling, but scheduling of different kinds of things</li>
</ul>
</li>
</ul>
</li>
<li>Partition: &#8220;Autonomous Business Capability&#8221;</li>
<li><strong>Thought</strong>: (on my way home) What about on-the-same-P&amp;L-as as an equivalence function? Substantially stable</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=42&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/01/26/simple-architectures-for-complex-enterprises/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/01/img-0062.jpg" medium="image">
			<media:title type="html">IMG_0062.JPG</media:title>
		</media:content>
	</item>
		<item>
		<title>A domain-specific language for &#8230; interval workouts</title>
		<link>http://technogility.sjcarriere.com/2009/01/26/25/</link>
		<comments>http://technogility.sjcarriere.com/2009/01/26/25/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 11:27:35 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[cycling]]></category>
		<category><![CDATA[dsl]]></category>

		<guid isPermaLink="false">http://technogility.sjcarriere.com/?p=25</guid>
		<description><![CDATA[This is something of a cross-over personal/technology post, hopefully interesting nonetheless. Perhaps a something-for-everyone post &#8230; or a nothing-for-anyone post. I&#8217;m a fairly serious amateur cyclist. I raced for one season when I was in college (1992!), but I totally burned out and quit riding, almost entirely, until the 2007 season. I was helped back [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=25&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>This is something of a cross-over personal/technology post, hopefully interesting nonetheless. Perhaps a something-for-everyone post &#8230; or a nothing-for-anyone post.</p>
<p>I&#8217;m a fairly serious amateur cyclist. I raced for one season when I was in college (1992!), but I totally burned out and quit riding, almost entirely, until the 2007 season. I was helped back into riding through what I call &#8220;motivation through financial commitment&#8221; &#8211; I bought a $5000 (at the time) <a href="http://www.cervelo.com">Cervelo</a> Soloist Carbon. But my biggest motivation comes from the group I ride with &#8211; <a href="http://www.crackodawn.com">Crack o&#8217; Dawn</a> &#8211; that meets every weekday at 5:45 for a 25-30 mile ride and does weekend rides of 50-100 miles; the group convenes within 2 miles of my house in Newton, MA. I rode 5000ish miles in 2007 and 6500ish in 2008 (the CoD record this year was set by Michael Mercier, at 14105.69 miles, and many CoDers break 10K every year).</p>
<p>Now the bad news. It&#8217;s winter here in the Boston area. It&#8217;s a snowy winter. Unlike some of my CoD mates, I&#8217;m not all that fond of the cold or rolling the dice with icy roads (I had a crash late in the 2007 season, broken collarbone). I&#8217;m happy to ride if it&#8217;s above freezing, even if wet, and down to 20ish if it&#8217;s dry. But lately this has left precious little opportunity to ride outside. I&#8217;m coping by riding spin classes at <a href="http://www.spynergycyclingstudio.com/">Spynergy</a>, where follow CoDer and good friend Andy Schiller is an awesome instructor. I also have a <a href="http://www.saris.com/p-196-pro-300pt.aspx">CycleOps Pro 300PT</a> indoor trainer, which I ride 4-6 times a week. The coolest thing about about the trainer is that it has an integrated power meter, so you can track your wattage while you ride. There&#8217;s a lot of science behind training based on power; the <a href="http://www.peakscoachinggroup.com/">Peaks Coaching Group</a> is pretty well known, and their principal, Hunter Allen, is co-author of book on the topic: <a href="http://www.amazon.com/Training-Racing-Power-Meter-Hunter/dp/1931382794">Training and Racing with a Power Meter</a> (Allen and Coggan). This provides an excellent opportunity for me to integrate my bike self and my geek self into one well-trained, intellectually satisfied unit.</p>
<p>Here&#8217;s how: unlike some indoor training systems, like the <a href="http://www.computrainer.com">CompuTrainer</a>, which many of my cohorts swear by, the CycleOps doesn&#8217;t provide any facilities for guiding a workout. It just shows you your heart rate, cadence and power output in watts. I filled this gap with a small Windows Forms application (hopefully soon to be ported to WPF) that has a very simple UI (yes, some would say go so far as &#8220;lame&#8221;, and they&#8217;d be right, but that&#8217;s not the point):</p>
<p><img class="aligncenter size-full wp-image-33" title="picture-2" src="http://technogility.files.wordpress.com/2009/01/picture-2.png?w=450&#038;h=400" alt="picture-2" width="450" height="400" />This says: ride at 200 watts for 4 minutes and 44 seconds more; you&#8217;ve been riding for 19 seconds and have 54:44 to go. The pull down lets you select different workouts. You can skip over an interval (wimp) and pause/resume (say, to change the TV channel). Easy, to the point. But, there&#8217;s some underlying extra fun. When I first wrote this, I basically hardcoded workouts in a config file. They looked like this:</p>
<pre>        180     00:10:00
        220     00:10:00
        250     00:05:00
        280     00:02:00
        150     00:03:00
        220     00:10:00
        250     00:05:00
        280     00:02:00
        150     00:03:00</pre>
<p>Again, simple and to the point. But repetitive and not very flexible. The opportunity expands&#8230;</p>
<p>I&#8217;ve been working with domain-specific languages in various forms for a long time, including with Microsoft&#8217;s <a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx">DSL Tools</a>, <a href="http://www.manning.com/rahien/">Boo</a> and <a href="http://msdn.microsoft.com/en-us/oslo/default.aspx">Oslo</a>. As I&#8217;ve <a href="http://technogility.wordpress.com/2008/12/31/im-a-mac-pc/">mentioned</a> before, my good friend <a href="http://www.devhawk.net/">Harry Pierson</a> is a Product Manager with the <a href="http://en.wikipedia.org/wiki/Dynamic_Language_Runtime">DLR</a> group at Microsoft, so I&#8217;ve been playing with <a href="http://ironruby.rubyforge.org/">IronRuby</a> and <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython">IronPython</a> for a while (Harry gave an excellent talk at a brown bag session at VistaPrint on the DLR and IronPython a couple of months ago). I had read a few articles about implementing DSLs in Ruby, so &#8230; &lt;light bulb/&gt; Construct a Ruby DSL to express interval workouts and dispatch out from the WinForms app to the IronRuby runtime to fetch workout definitions.</p>
<div style="text-align:left;">Here&#8217;s a simple example of a definition in the resulting DSL:</div>
<pre class="brush: ruby;">
        workout &quot;W - intervals&quot; do
        interval.target(0).time('00:01:00')
        interval.target(180).time('00:05:00')
        repeat 4 do
              interval.target(220).time('00:10:00')
              interval.target(280).time('00:02:00')
              interval.target(150).time('00:03:00')
        end
end
</pre>
<p>This defines a workout called &#8220;W &#8211; intervals&#8221;, made up of a 1 minute 0-power &#8220;click start, get on the bike and clipped in&#8221; step, 5 minutes at 180 watts, then 4 repeats of 10 minutes at 220, 2 at 280 (what I believe to be my functional threshold power) and 3 at 150. Aside: I&#8217;m not proposing this is a <em>good</em> workout &#8211; I&#8217;m studying the <a href="http://www.amazon.com/Training-Racing-Power-Meter-Hunter/dp/1931382794">Allen and Coggan book</a> to figure out how to actually use power properly in training. Again, not the point.</p>
<div style="text-align:left;">
<p>Simple enough, and the &#8220;repeat&#8221; construct achieves a lot of the intended benefit of reducing repetition. But there&#8217;s so much more potential. As I was reading the training book today, I came up with this one:</p></div>
<pre class="brush: ruby;">
ftp = 280
work = 0.9*ftp
warmup = 0.68*ftp
rest = warmup

workout &quot;L4 - Ride A&quot; do
        interval.target(0).time('00:01:00')
        interval.target(warmup).time('00:05:00')
        interval.target(ftp).time('00:02:30')

        repeat 2 do
                interval.target(work).time('00:13:00')
                interval.target(rest).time('00:02:00')
        end

        repeat 6 do
                interval.target(work).time('00:01:00').message(&quot;high cadence&quot;)
                interval.target(rest).time('00:02:00')
        end

        interval.target(rest).time('00:05:00')
end
</pre>
<p>This is an adaptation (shortening to 1 hour) of a &#8220;typical level 4 threshold&#8221; workout from <a href="http://www.amazon.com/Training-Racing-Power-Meter-Hunter/dp/1931382794">Coggan and Allen</a>, on page 83.</p>
<p>The power of using an embedded DSL is clear: there are very few domain-specific implementation constructs required, making the DSL specification extremely short. All that was required was the definition of the workout and interval classes and the simple &#8220;repeat&#8221; construct, and that&#8217;s really only a personal preference (6.times would have done just as well).</p>
<div style="text-align:left;">
<p>The core of the Ruby DSL looks like this:</p></div>
<pre class="brush: ruby;">
$intervals = []

class RInterval
        def initialize()
                @interval = Interval.new
                $intervals.push self
        end

        def target(t)
                @interval.Target = t
                self
        end

        // message and time look the same as target

        def Interval
                @interval
        end
end

def repeat(count, &amp;block)
        count.times do
                yield
        end
end

def workout(name, &amp;block)
        yield

        intervals = System::Collections::ArrayList.new

        $intervals.each {|interval| intervals.Add interval.Interval}

        $intervals.clear

        workouts.Add name, intervals
end

def interval
        RInterval.new
end
</pre>
<div style="text-align:left;">
<p>On the .NET side, there&#8217;s a simple Interval class:</p>
<pre class="brush: csharp;">
public class Interval
{
        public TimeSpan Time { get; set; }
        public int Target { get; set; }
        public string Message { get; set; }
}
</pre>
<p>At runtime, the .NET application instantiates the IronRuby engine, sets up a <span style="font-family:Consolas;">Dictionary&lt;string, ArrayList&gt;</span> in the engine&#8217;s <span style="font-family:Consolas;">ScriptScope</span> (no interoperable generics right now <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> ) and loads and executes the DSL spec and the DSL instance:</div>
<pre class="brush: csharp;">
            _scope = _engine.CreateScope();
            _scope.SetVariable(&quot;workouts&quot;, new Dictionary&lt;string, ArrayList&gt;());

            // ...

            _engine.Execute(code, _scope); // code is the DSL definition + the DSL instance
            object ret = _scope.GetVariable(returnVar);
</pre>
<p>And that&#8217;s it.  The UI code is dead simple, and again, not the point.  I&#8217;ve obviously got some more to learn about doing DSLs in Ruby, but this has proven to me the utility of the approach.  And it helps with the winter riding blues.</p>
<p><strong>Update</strong>: Here&#8217;s the code from Jim&#8217;s comment, which I couldn&#8217;t make show up <em>in</em> his comment:</p>
<pre>;; User setting
(setq *ftp_limit 280)

;; Workout routine
(progn
  (wait 1 "click start, get on the bike and clipped in")
  (warmup 5)
  (ftp 2.5)
  (repeat 2
                (work 13)
                (relax 2))
  (repeat 6
                (work 1 "high cadence")
                (relax 2))
  (relax 5))

;; Here’s the DSL implementation

(defmacro interval (pace duration &amp;optional message)
  `(progn
                 (format t "~&amp;~6a (~2$) for ~5 minutes" (car ,pace) (cadr ,pace) ,duration)
                 (and ,message (format t " *** ~a ***" ,message))))

(defmacro proportional-interval (name proportion duration &amp;optional message)
  `(interval (list ',name (* ,proportion *ftp_limit*)) ,duration ,message))

(defmacro deffactor (name factor)
  `(defmacro ,name (duration &amp;rest args)
                 `(proportional-interval ,',name ,',factor ,duration ,@args)))

(defmacro repeat (times &amp;body body)
    (let ((x (gensym)))
      `(dotimes (,x ,times)
         ,@body)))

;; You can argue about whether the following is in the DSL designer
;; land, or in user land. Since it seems effort ratios would be
;; uniform across many workouts, I’ve put it here (though users could
;; override for their own workout easily enough.)

(deffactor ftp           1)
(deffactor work          0.9)
(deffactor relax         0.68 )
(deffactor warmup        0.68 )
(deffactor wait          0)
(defvar    *ftp_limit* 280)</pre>
<p><strong>Update</strong>: I couldn&#8217;t leave this alone, after Jim&#8217;s elegance put me to shame.  Here&#8217;s the same workout I had before in my new DSL:</p>
<pre class="brush: ruby;">
workout &quot;L4 - Ride A&quot; do
	setup 1
	warmup 5
	work 2

	2.times do
		work 13
		rest 2
	end

	6.times do
		work 1, &quot;high cadence&quot;
		rest 2
	end

	rest 5
end
</pre>
<p>Not quite ready to share the DSL definition yet &#8211; it&#8217;s still a bit ugly, but improving.  I&#8217;m also trying to smooth out the IronRuby integration so that I can test the DSL independent of a .NET runtime.</p>
<p><strong>Update</strong>: Here&#8217;s the new DSL definition.  Much much cleaner.  Thanks, <a href="http://it.ataprofitable.com/itblog/">Jim</a>, for driving me to get this right.</p>
<pre class="brush: ruby;">

$ftp = 280
$effort = {&quot;setup&quot; =&gt; 0, &quot;ftp&quot; =&gt; $ftp, &quot;easy&quot; =&gt; 0.8*$ftp, &quot;work&quot; =&gt; 0.9*$ftp, &quot;warmup&quot; =&gt; 0.68*$ftp, &quot;rest&quot; =&gt; 0.68*$ftp}

class WorkoutDSL
    def method_missing(sym, *args)
          interval = {:target =&gt; $effort[&quot;#{sym}&quot;], :time =&gt; args[0], :message =&gt; args[1]}
          @workouts[@name].push interval
    end

    def workout(name, &amp;block)
          @name = name
          @workouts[@name] = []

        yield
    end

    def load(filename)
          @workouts = {}
           instance_eval(File.read(filename), filename)
        @workouts
  end
end

WorkoutDSL.new.load(&quot;intervals.dsl&quot;)
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=25&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/01/26/25/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>

		<media:content url="http://technogility.files.wordpress.com/2009/01/picture-2.png" medium="image">
			<media:title type="html">picture-2</media:title>
		</media:content>
	</item>
		<item>
		<title>Welcome Jim!</title>
		<link>http://technogility.sjcarriere.com/2009/01/13/welcome-jim/</link>
		<comments>http://technogility.sjcarriere.com/2009/01/13/welcome-jim/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 14:27:23 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/01/13/welcome-jim/</guid>
		<description><![CDATA[My VistaPrint colleague, Jim Sokoloff, has started his blog: IT @ A Profitable Dot Com with an excellent first post about VistaPrint&#8217;s recent data center move (roughly 8 tons of gear). Jim runs our customer-facing IT organization, but was down there in the trenches with his team moving servers over New Year&#8217;s. An awesome reflection [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=24&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>My VistaPrint colleague, Jim Sokoloff, has started his blog: <a href="http://it.ataprofitable.com/itblog/">IT @ A Profitable Dot Com</a> with an excellent first post about VistaPrint&#8217;s recent data center move (roughly 8 tons of gear). Jim runs our customer-facing IT organization, but was down there in the trenches with his team moving servers over New Year&#8217;s. An awesome reflection of how committed VistaPrint employees are to the success of the business.&nbsp;&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=24&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/01/13/welcome-jim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
		<item>
		<title>Fun with VoodooPad/Outlook integration</title>
		<link>http://technogility.sjcarriere.com/2009/01/06/fun-with-voodoopadoutlook-integration/</link>
		<comments>http://technogility.sjcarriere.com/2009/01/06/fun-with-voodoopadoutlook-integration/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 14:01:09 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2009/01/06/fun-with-voodoopadoutlook-integration/</guid>
		<description><![CDATA[I mentioned in a previous post that I&#8217;ve been using VoodooPad under Mac OS for taking notes. I like the expressiveness of the wiki paradigm for managing my own jumble of meeting notes, random thoughts/ideas and formal preparation for presentations and documents: naturally a corpus that contains a lot of interrelated concepts. But, I also [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=22&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I mentioned in a <a href="http://technogility.wordpress.com/2008/12/31/im-a-mac-pc/">previous post</a> that I&#8217;ve been using <a href="http://www.flyingmeat.com/voodoopad/">VoodooPad</a> under Mac OS for taking notes. I like the expressiveness of the wiki paradigm for managing my own jumble of meeting notes, random thoughts/ideas and formal preparation for presentations and documents: naturally a corpus that contains a lot of interrelated concepts. But, I also mentioned a lingering love for <a href="http://office.microsoft.com/en-us/onenote/default.aspx">OneNote</a>. One of the specific capabilities of OneNote that I missed when I switched to VoodooPad is the ability to keep tasks in sync between OneNote and Outlook &#8211; this is very important, because I manage my workload and plan my days substantially via Outlook tasks.</p>
<p>Here&#8217;s my solution. First, I defined a convention for annotating a line in VoodooPad as a task:</p>
<ul>
<li>An incomplete task is a line starting with &#8220;[ ]&#8221; &#8211; open/close square brackets with a space between.</li>
<li>A task that has been transferred to Outlook is annotated with &#8220;[/]&#8221; &#8211; the space is replaced with a forward slash.</li>
<li>A completed task is annotated with &#8220;[*]&#8220;.</li>
</ul>
<p>Clearly more sophistication is possible here, including annotations for due dates, priorities, categorization (I tag tasks extensively, along with email and appointments &#8211; more on that in a later post on my Outlook tagging add-in).</p>
<p>Next, I defined a simple exchange mechanism between Mac OS and Windows. In my Dropbox folder there&#8217;s a file imaginatively named &#8220;todo.txt&#8221; that contains a line per task, including the annotation. Dropbox takes care of file synchronization between the environments.</p>
<p>Finally, I implemented the synchronization with Outlook, in two pieces. First: a Python plug-in for VoodooPad that reads todo.txt, then scans all of my VoodooPad pages for task-annotated lines, adding any missing tasks to the file, and updating any changed annotations in VoodooPad. Second: a Windows console app (that should be a tray icon or maybe even a Windows service) that has a FileSystemWatcher keeping an eye on my Dropbox folder. When todo.txt changes, the app reads the file, adds any &#8220;[ ]&#8220;-annotated tasks to Outlook and updates these tasks with the &#8220;[/]&#8221; annotation.</p>
<p>The hard part was implementing updates back into VoodooPad. Figuring out the specific incantations required to manipulate the page content via the <a href="http://pyobjc.sourceforge.net/">PyObjC</a> bridge was a long experimental challenge, ultimately resulting in a process of counting characters line-by-line, creating an NSRange representing the string range to replace (thanks to a <a href="http://flyingmeat.com/voodoopad/docs/example%20python%20scripts.html">FlyingMeat sample</a>), doing a replaceCharactersInRange_withString_ on my AttributedString (thanks to a <a href="http://diveintopython.org/power_of_introspection/index.html">tutorial on Python&#8217;s introspection capabilities</a>), then doing a setDataAsAttributedString_ on the page. Whew.</p>
<p>All I have left to do is catch task state changes (i.e. tasks being marked completed) on the Outlook side and do the appropriate updates to todo.txt, and it should be all set. The obvious weakness with this whole approach is implicitly using the text of the task as the key, but I very rarely, if ever, alter this once a task is created.</p>
<p><strong>UPDATE</strong>: A colleague suggested I include this <a href="http://www.newamerica.net/blog/files/Rube%20Goldberg.jpg">picture</a> illustrating my solution. And I guess I should consider using the <a href="http://todotxt.com/">todo.txt format</a> for my todo.txt file.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=22&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2009/01/06/fun-with-voodoopadoutlook-integration/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
		<item>
		<title>I&#8217;m a Mac-PC</title>
		<link>http://technogility.sjcarriere.com/2008/12/31/im-a-mac-pc/</link>
		<comments>http://technogility.sjcarriere.com/2008/12/31/im-a-mac-pc/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 21:31:42 +0000</pubDate>
		<dc:creator>jeromyc</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://technogility.wordpress.com/2008/12/31/im-a-mac-pc/</guid>
		<description><![CDATA[For the last couple of months, I&#8217;ve been using a MacBook Pro (17&#8243;/2.6 GHz/4GB) as my primary machine. My workload is pretty diverse, from basic browsing (although these days &#8220;basic&#8221; browsing doesn&#8217;t have much surface area) to email to fairly heavy Excel/Powerpoint usage to development. Here&#8217;s the thing: I split my tasks between Mac OS [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=20&subd=technogility&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>For the last couple of months, I&#8217;ve been using a <a href="http://www.apple.com/macbookpro/">MacBook Pro</a> (17&#8243;/2.6 GHz/4GB) as my primary machine. My workload is pretty diverse, from basic browsing (although these days &#8220;basic&#8221; browsing doesn&#8217;t have much surface area) to email to fairly heavy Excel/Powerpoint usage to development.</p>
<p>Here&#8217;s the thing: I split my tasks between <a href="http://www.apple.com/macosx/">Mac OS</a> and <a href="http://www.microsoft.com/windows/windows-vista/">Windows Vista</a> under <a href="http://www.parallels.com/">Parallels</a>. Here&#8217;s the breakdown:</p>
<ol>
<li>I do browsing almost entirely <a href="http://www.mozilla.com/en-US/firefox/">Firefox</a> 3 under Mac OS. Occasionally IE 7 under Windows for intranet applications that require it.</li>
<li>I read personal email using <a href="http://www.apple.com/macosx/features/mail.html">Apple Mail</a> and do corporate email using <a href="http://office.microsoft.com/en-us/outlook/default.aspx">Outlook</a>. I tried <a href="http://www.microsoft.com/mac/products/entourage2008/default.mspx">Entourage</a> and I wanted to hurt myself after a very short time.</li>
<li>I run <a href="http://office.microsoft.com/en-us/products/default.aspx">Excel/Word/Powerpoint</a> under Windows. Once in a while I&#8217;ll use the <a href="http://www.microsoft.com/mac/products/Office2008/default.mspx">Mac versions</a>, but I find them particularly hard to use on an infrequent basis (mostly due to different shortcut gestures).</li>
<li>Development primarily in <a href="http://msdn.microsoft.com/en-ca/vstudio/products/default.aspx">Visual Studio 2008</a>. I&#8217;ve been doing some <a href="http://ruby-lang.org">Ruby</a> and <a href="http://www.python.org/">Python</a> on the Mac side, using <a href="http://macromates.com/">TextMate</a>. I&#8217;ve started using <a href="http://www.e-texteditor.com/">E</a>, a TextMate-like editor under Windows, after a long run with <a href="http://www.ultraedit.com/">UltraEdit</a>, mostly because it has the same Python-based extensibility model as TextMate &#8211; although this advantage of this is mostly theory at this point. (As an aside, I&#8217;ve also been working with <a href="http://ironruby.rubyforge.org/">IronRuby</a> and <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython">IronPython</a> to take advantage of dynamic language capabilities with .NET; my good friend <a href="http://www.devhawk.net">Harry Pierson</a> is a Product Manager with the <a href="http://en.wikipedia.org/wiki/Dynamic_Language_Runtime">DLR</a> group, focused on IronPython.)</li>
<li>I do notetaking mostly in <a href="http://flyingmeat.com/voodoopad/">VoodooPad</a> on the Mac side, but this is a recent switch from <a href="http://office.microsoft.com/en-us/onenote/default.aspx">OneNote</a>, which I have a lingering love for. I had a brief tryst with <a href="http://evernote.com/">EverNote</a> (which is nicely cross-platform), but I couldn&#8217;t get comfortable with it. (And I really dig the plug-in model in <a href="http://flyingmeat.com/voodoopad/">VoodooPad</a>, another reason I&#8217;m learning Python.)</li>
<li>I run <a href="http://www.mindjet.com">MindJet</a>&#8216;s <a href="http://www.mindjet.com/products/mindmanager/default.aspx">MindManager</a> under Windows for brainstorming and organizing my thoughts. I haven&#8217;t sprung for the <a href="http://www.mindjet.com/products/mindmanager/mac/default.aspx">Mac version</a> yet (another $349 &#8211; ouch &#8211; and also a version behind), but I&#8217;d love to have this in both environments.</li>
<li>I write blog entries using <a href="http://illuminex.com/ecto/">Ecto</a> under Mac OS. I like <a href="http://get.live.com/writer/overview">LiveWriter</a>, but haven&#8217;t used it much lately.</li>
<li>When I do UML, I usually use <a href="http://www.altova.com/">Altova</a>&#8216;s <a href="http://www.altova.com/products/umodel/uml_tool.html">UModel</a> (which I bought as part of their <a href="http://www.altova.com/products/missionkit/software_architect_tools.html">Mission Kit for Software Architects</a>) under Windows, but this is pretty infrequent &#8211; not because I have anything specifically against UML, but mostly because I haven&#8217;t had the energy to devote to getting it accepted around here.)</li>
</ol>
<p>So why put myself through this? This is a complex environment to live in &#8211; mostly because of the different UI paradigms in the different environments: just try training yourself to type Ctrl-A to go to the beginning of a line and Command-A to select all under Mac OS and Home/Ctrl-A for the same pair of actions under Windows. There are some integration challenges &#8211; clicking a link in an email on the Windows side opens <a href="http://www.google.com/chrome">Chrome</a>, but whatever; Parallels makes sharing files between the environments easy, at least. I do use <a href="http://www.getdropbox.com">Dropbox</a> as well to keep files in sync between different machines, including my host Mac OS and my guest Vista instance.</p>
<p>First off, this setup <em>works for me</em> &#8211; the Mac goes to sleep and wakes up faster than I&#8217;ve ever seen a PC take a nap (and can do so repeatedly without losing its mind), the whole thing is very stable, I can segregate resource usage by Windows applications, and I have the best PC and Mac applications to draw from to get my job (and life) done. I can snapshot my Windows environment with a single click, and Time Machine makes sure I have ongoing backups of the whole shebang.</p>
<p>Second: I <em>have</em> to run Windows because we&#8217;re a Windows development shop. But even if I didn&#8217;t <em>have</em> to, I still would. The things I do in Windows, Windows is best at. Arguably, some of the stuff I do under Mac OS would be better under Windows too.</p>
<p>The third, and most concerning reason for doing this is that I think I&#8217;m a complexity junky: I seem to enjoy managing all of the minutiae and training myself to work in the split environment. Whatever.</p>
<p>So, I&#8217;m a Mac-PC. I&#8217;m proud to not have any serious technology religion, and instead to use the best tool for the job at hand. There&#8217;s a price to pay, but I&#8217;m wiling, at least for my personal setup (i.e. this isn&#8217;t an enterprise strategy <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technogility.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technogility.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technogility.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technogility.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technogility.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technogility.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technogility.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technogility.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technogility.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technogility.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technogility.sjcarriere.com&blog=4899722&post=20&subd=technogility&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://technogility.sjcarriere.com/2008/12/31/im-a-mac-pc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeromyc</media:title>
		</media:content>
	</item>
	</channel>
</rss>