<?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>High T</title>
	<atom:link href="http://timhigh.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://timhigh.wordpress.com</link>
	<description>High Tech talks with High, T.</description>
	<lastBuildDate>Sat, 12 Nov 2011 19:07:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='timhigh.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>High T</title>
		<link>http://timhigh.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://timhigh.wordpress.com/osd.xml" title="High T" />
	<atom:link rel='hub' href='http://timhigh.wordpress.com/?pushpress=hub'/>
		<item>
		<title>The Golden Rule for Coding Standards</title>
		<link>http://timhigh.wordpress.com/2011/07/22/the-golden-rule-for-coding-standards/</link>
		<comments>http://timhigh.wordpress.com/2011/07/22/the-golden-rule-for-coding-standards/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 19:49:15 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=251</guid>
		<description><![CDATA[It can be really tedious to define coding standards to the finest detail. The following rule covers about 80% of what you really need to know: Do unto your code as you would have others do This rephrasing of the Golden Rule gets to the heart of what standards are all about. Whatever code you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=251&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It can be really tedious to define coding standards to the finest detail. The following rule covers about 80% of what you really need to know:</p>
<h3>Do unto your code as you would have others do</h3>
<p>This rephrasing of the <a href="http://en.wikipedia.org/wiki/Golden_rule" target="_blank">Golden Rule</a> gets to the heart of what standards are all about. Whatever code you write, realize it is something that you are inflicting on other developers further down the line. Think of it as your legacy, because <a href="http://en.wikipedia.org/wiki/Legacy_code" target="_blank">legacy code</a> is what it is. Imagine yourself having to maintain the code (and you may, in fact, have to), and ask yourself if that&#8217;s code you can work with.</p>
<p>Also keep in mind that to some degree, you are <a title="Causes of Decay: Architecture by Accident" href="http://timhigh.wordpress.com/2008/09/04/causes-of-decay-architecture-by-accident/" target="_blank">setting the standards</a> for all work that follows, especially considering the corollary part of this rule:</p>
<h3>Do unto the code as others have already done</h3>
<p>If code already exists in the project, chances are there a slew of already-established coding conventions. Before writing a single line of code in a new project, take a look around at what&#8217;s already there. Ask yourself some questions, like:</p>
<ul>
<li>How is everyone formatting their code?</li>
<li>Which libraries are they already using?</li>
<li>Are there already examples of how to do what I have to do?</li>
<li>What are the overall design patterns, application layers, and so on that are already in force?</li>
</ul>
<p>and, lastly,</p>
<ul>
<li>Will I have to come up with some new conventions or solutions that others will have to follow?</li>
</ul>
<p>By looking around, you can save yourself a LOT of time in terms of decision-making for insignificant issues (<a title="Architect Commandments" href="http://timhigh.wordpress.com/2008/08/05/architect-commandments/" target="_blank">8-ball decisions</a>), and may come up with examples that solve the majority of your work right off the bat. If you find that you need to create some new conventions, try to follow the &#8220;feel&#8221; of the code that has already been established. Otherwise, you&#8217;re good to go &#8211; just remember the Golden Rule!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/251/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/251/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/251/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/251/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/251/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/251/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/251/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=251&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2011/07/22/the-golden-rule-for-coding-standards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
		<item>
		<title>Camel Hair, the A-Team and Programmer Cross-pollination</title>
		<link>http://timhigh.wordpress.com/2010/03/22/camel-hair-the-a-team-and-programmer-cross-pollination/</link>
		<comments>http://timhigh.wordpress.com/2010/03/22/camel-hair-the-a-team-and-programmer-cross-pollination/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 05:50:03 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Process]]></category>
		<category><![CDATA[enterprise2.0]]></category>
		<category><![CDATA[mentoring]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=238</guid>
		<description><![CDATA[&#8220;He who does not know the real Nsaa buys the fake of it&#8221; The Joys of Cross-Pollination One subject that comes up often in my work, but in many different guises, is the benefits of &#8220;cross-pollinating&#8221; your team. It&#8217;s a no-brainer that knowledge dissemination across your team results in more consistent work, more flexibility in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=238&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.adinkra.org/htmls/adinkra/nsaa.htm"><img class="alignnone" title="Nsaa" src="http://www.adinkra.org/images/nsaa_lg.gif" alt="Nsaa Adinkra Symbol" width="58" height="50" /></a> <em><a href="http://www.adinkra.org/htmls/adinkra/nsaa.htm">&#8220;He who does not know the real Nsaa buys the fake of it&#8221;</a></em></p>
<h2>The Joys of Cross-Pollination</h2>
<p>One subject that comes up often in my work, but in many different guises, is the benefits of &#8220;cross-pollinating&#8221; your team. It&#8217;s a no-brainer that knowledge dissemination across your team results in more consistent work, more flexibility in terms of resource assignments, and in the end, better programmers all around. The ways of disseminating that knowledge range from brown-bag lunch presentations (which generally work for 1 or 2 lunches before they run out of steam) to required code reviews to the extreme programming approach of <a href="http://www.extremeprogramming.org/rules/pair.html">pair programming</a>. I know a lot of people that cringe at this technique for any number of reasons, but even in places I&#8217;ve worked where I&#8217;ve encountered unmovable resistance to this method (either because it&#8217;s a &#8220;waste&#8221; of resources, or because the programmers themselves don&#8217;t like it), I have always been able to get an exception to the rule under one circumstance: as a way to quickly transfer knowledge from one more experienced developer to another. That&#8217;s because there&#8217;s no documentation in the world that can replace having someone explain something to you AS YOU DO IT.</p>
<p>Cross-pollination doesn&#8217;t end at training, however. And neither does the purpose of pair programming. Common practice states that if there&#8217;s a disparity of knowledge, the least &#8220;experienced&#8221; developer is that one that should be at the keyboard to ensure that they don&#8217;t get passed over and left behind. But it also states that the pairs should be swapped with some frequency. The exact frequency is up to the team, but I generally hear anywhere from 2 hours to one day, max. The reason for this is, in part, that &#8220;more&#8221; or &#8220;less experienced&#8221; isn&#8217;t just a question of who&#8217;s older: it&#8217;s a matter of context. I, for example, have been working in Java for more than a decade. But when I work on a Rails project, PHP, or something out of my comfort zone, I have pretty much everything to learn from  someone that&#8217;s been working with the technology longer than I. And when I roll onto a new project, I have to learn everything about their process, business logic, architecture, etc.</p>
<p>Of course, even &#8220;equal&#8221; developers have a lot to teach each other. I can&#8217;t count the number of times I was watching a presentation, doing a code review, or sitting at someone&#8217;s table when I saw their fingers hit some magic key combination that has since saved me hours of pointing and clicking. When you work that closely with others, you pick up new keyboard shortcuts, find out about cool tools, see what blogs they&#8217;re reading, and on and on. I&#8217;ve been trying out ways to replicate this kind of knowledge transfer for distributed teams using <a href="http://timhigh.wordpress.com/tag/enterprise20/">Enterprise 2.0</a> tools and techniques, but nothing so far can match what you get out of working on the same machine as someone else.</p>
<p>Cross-pollination works on other levels, too. I consider myself very lucky for the time I spent working for <a href="http://www.sapient.com/">Sapient</a>. That&#8217;s where I learned what it is that an architect does, and chose my personal career path in life. It&#8217;s also where I learned how teams get inspired, and how a process can work to bring people of different disciplines together. I&#8217;m also lucky to have worked at with fantastic people here in Brazil, where I learned how a process (yes, even a &#8220;heavy&#8221; process like RUP with CMMI) can work, where I learned about TDD, Continuous Integration, and more importantly, how to stay current and involved in the community at large.</p>
<p>In the meantime, I hear endless stories about software development shops that are stuck in the 20th-century mindset in terms of how to develop software. Everyone&#8217;s heard of TDD, but no one bothers to do it. Everyone says they do agile, but no one seems to get it right. I had a recent conversation with a good friend of mine who said that he had just been offered a promotion to be manager of the whole development team after only 6 months at a fairly successful small software and consulting company because he&#8217;d just turned around one of their most important projects from a glaring failure to a raging success. What did he do? He introduced the &#8220;radical&#8221; concepts of unit testing, continuous builds, and functional testing (and I don&#8217;t mean automated functional tests &#8211; I mean testing the software AT ALL). <a href="http://www.youtube.com/watch?v=IHyYhyp0kTc&amp;feature=related">&#8220;In the land of the blind, the one-eyed man is king.&#8221;</a></p>
<h2>The A-Team</h2>
<p><img class="alignright" src="http://www.palomar.edu/kksm/shows/shutupandlisten/Hannibal_a-team.jpg" alt="" width="200" height="147" /><br />
This is all old news, but what do I make of it? The first thing that came to mind was that there&#8217;s a great opportunity here to start a company specializing in fixing up run-down software factories and development teams. There are consultants out there doing the mentoring thing, but the ones I&#8217;ve seen generally focus on a couple of weeks of training, then they cut and run. It might be interesting to put an <a href="http://www.youtube.com/watch?v=PIfuaUTH9Y4">A-Team</a> spin on things to send in some experts that will actually work with the team to get all the right tools installed, and then make sure everyone is properly &#8220;cross-pollinated&#8221; before leaving. My ex-team at <a href="http://www.sknt.com/">Sakonnet</a> seems to have gotten its share of fame in the local market, since there were a number of employers hoping to snatch us up as soon as they heard we were available, so maybe I could pull us all back together again for this mission &#8211; as long as I get to be <a href="http://www.palomar.edu/kksm/shows/shutupandlisten/Hannibal_a-team.jpg">the one with the cigars</a>.</p>
<p>But thinking about this a little deeper, it occurs to me that it&#8217;s a pretty sad thing that there could be such disparity between work environments. I was discussing with my &#8220;one-eyed&#8221; friend about why this happens, and I came to the conclusion that people only learn what they have to, and only what they are exposed to. There is a saying in Ghana that &#8220;He who does not know the real Nsaa [a coarse cloth made from camel hair] buys the fake of it&#8221;. And people that have NEVER worked in a place that encourages process improvements and the quest for better practices won&#8217;t know what they&#8217;re missing. Any newcomer that aspires to modernize their work area is fighting against the tide, and if they want to make any permanent changes, they have to do it quick. As soon as they themselves get comfortable in their new environment, it&#8217;s all over. Perhaps the biggest enemy to following best practices and continuous improvement is safe, comfortable, long-term employment. I&#8217;ve been reading articles on promoting what people are calling <a href="http://thedailywtf.com/Articles/A-Culture-of-Quitting-The-Webinar.aspx">&#8220;Employment 2.0&#8243;</a> (when people start coining the phrase &#8220;Sex 2.0&#8243;, I&#8217;m unplugging the internet. Umm&#8230; <a href="http://sex20con.com/">nevermind</a>). The idea is that by loosening ties to one single job, you increase competitiveness, you let the cream rise to the top, blah blah blah. And you INCREASE CROSS-POLLINATION.</p>
<h2>Cross-Pollination as&#8230; a Business Model?</h2>
<p>So there it is: it&#8217;s good to cross-pollinate your developers with each other. It can also be good to cross-pollinate them with developers from OTHER companies. This already exists: in conferences, which may be sponsored by you employer. Also, in outside professional groups, like user groups, programming Dojos and the like. But&#8230; what if we could do this as a business? What if we could combine the idea of the A-Team with employer-supported open cross-pollination? You send in a crack team of two or three senior developers to fix up a dev team&#8217;s practices. You also get a team of less-seasoned developers to help out, for CHEAP, or even for FREE. Why? Because some other company is loaning them to the cause as a form of boot camp training for<br />
their own employees. When the short-term gig is over, they get them back, knowing that they have gained some real on-the-job experience working with the A-Team. This sort of developer loan-outs could be staggered as well. A company might loan out some key employees in advance of having the A-Team mentor the whole development department, or they may send them out on a project afterwards as a type of refresher (or because they promised to do the A-Team one favor some time in the future as payment&#8230;).</p>
<p>I don&#8217;t know if the idea above would really work. I&#8217;m just starting to think this through. It could be that with Employment 2.0 on the horizon, no one will want to invest in their employees anymore (in that case, it might be a good investment for you to loan out YOURSELF&#8230;). But imagine what regular company cross-pollination could do for the software and IT industry as a whole. If these <a href="http://timhigh.wordpress.com/2008/08/05/architect-commandments/">assumptions</a> are true:</p>
<ol>
<li>There is great disparity between the productivity of different software development teams</li>
<li>This disparity is caused by a lack of awareness and experience in better practices</li>
</ol>
<p>then it seems to follow that we would all have something to gain by getting out of our comfort zone every now and then and making yourself a junior to someone&#8217;s senior developer. I pity the fool who doesn&#8217;t. I&#8217;ll save any Hannibal quotes for when I have this plan working&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/238/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=238&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2010/03/22/camel-hair-the-a-team-and-programmer-cross-pollination/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>

		<media:content url="http://www.adinkra.org/images/nsaa_lg.gif" medium="image">
			<media:title type="html">Nsaa</media:title>
		</media:content>

		<media:content url="http://www.palomar.edu/kksm/shows/shutupandlisten/Hannibal_a-team.jpg" medium="image" />
	</item>
		<item>
		<title>Redmine Arch Decisions 0.0.9 released</title>
		<link>http://timhigh.wordpress.com/2010/03/01/redmine-arch-decisions-0-0-9-released/</link>
		<comments>http://timhigh.wordpress.com/2010/03/01/redmine-arch-decisions-0-0-9-released/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 05:42:21 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[redmine arch decisions]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=236</guid>
		<description><![CDATA[Just a quick note to let you know that version 0.0.9 of the Redmine Arch Decisions plugin has just been released. There is no new functionality in this release. Instead, I have taken the time to work on the recently-promised compatibility with Redmine 0.9.x (more specifically, I worked on &#8220;trunk&#8221;, which is currently 0.9.2). It [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=236&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Just a quick note to let you know that version 0.0.9 of the <a href="http://timhigh.wordpress.com/2010/02/23/announcing-the-arch-decisions-plugin-for-redmine/" target="_blank">Redmine Arch Decisions plugin</a> has just been released. There is no new functionality in this release. Instead, I have taken the time to work on the recently-promised compatibility with Redmine 0.9.x (more specifically, I worked on &#8220;trunk&#8221;, which is currently 0.9.2). It was hell to get all the tests working (one of those cases when they are more of a pain in the butt than a help), and there were some other changes that had to be made, so I&#8217;ve given up on the idea of trying to maintain backwards compatibility. Instead, I have created a separate branch for the 0.8.4 version of Redmine (which I may or may not try to maintain).</p>
<p>More information about the plugin and this release can be found below:</p>
<ul>
<li><a href="http://github.com/bigokro/redmine_arch_decisions" target="_blank">Github repository</a></li>
<li><a href="http://www.redmine.org/wiki/redmine/PluginArchDecisions" target="_blank">Redmine wiki</a></li>
<li><a href="http://www.redmine.org/boards/3/topics/11664" target="_blank">Discussion forum</a></li>
<li><a href="http://opensource.integritas.com.br/projects/redmine-ad/issues" target="_blank">Issue tracker</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/236/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/236/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/236/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/236/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/236/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/236/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/236/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/236/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=236&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2010/03/01/redmine-arch-decisions-0-0-9-released/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
		<item>
		<title>Announcing the Arch Decisions plugin for Redmine</title>
		<link>http://timhigh.wordpress.com/2010/02/23/announcing-the-arch-decisions-plugin-for-redmine/</link>
		<comments>http://timhigh.wordpress.com/2010/02/23/announcing-the-arch-decisions-plugin-for-redmine/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 04:07:07 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Visible Architecture]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[arch decisions]]></category>
		<category><![CDATA[architecture2.0]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[redmine arch decisions]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=229</guid>
		<description><![CDATA[I&#8217;ve been silent for a long time on this blog for two important reasons: I&#8217;ve decided not to post anything unless I really have some value to add I&#8217;ve been spending my spare time working on an open source plugin for the Redmine platform So, without further ado, I&#8217;d like to announce the release (of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=229&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been silent for a long time on this blog for two important reasons:</p>
<ol>
<li>I&#8217;ve decided not to post anything unless I really have some value to add</li>
<li>I&#8217;ve been spending my spare time working on an open source plugin for the <a href="http://www.redmine.org/" target="_blank">Redmine</a> platform</li>
</ol>
<p>So, without further ado, I&#8217;d like to announce the release (of version 0.0.8!) of the <a href="http://github.com/bigokro/redmine_arch_decisions" target="_blank">Redmine Arch Decisions</a> plugin! At <a href="http://www.sknt.com" target="_blank">Sakonnet</a>, my previous gig, they were using <a href="http://quickbase.intuit.com/" target="_blank">Quickbase</a> to track tasks, specs, and just about everything. It was a snap to add in a new feature to track &#8220;architecture&#8221; (or technical) decisions, configure notifications for collaboration, and hook them up to our issues trackers for reference and follow-up.  I wrote about this tool in a <a href="http://timhigh.wordpress.com/2008/08/25/documenting-architecture-decisions/" target="_blank">previous blog post</a>, and I have been known to make the comment before that I couldn&#8217;t imagine working on software again without it. Well, when the time came to move on, guess what? No tool for tracking my &#8220;arch decisions&#8221;.</p>
<p>Fortunately, my current employers at <a href="http://www.integritastech.com/" target="_blank">Integritas</a> are open to trying out new ideas, and are using the Rails-based Redmine for their issue tracking. Redmine, as with Rails in general, has a fairly usable plugin framework, and it was a great opportunity for me to get my hands dirty with RoR, so I jumped to it. Now, on the date of the release of the 8th version of my plugin (which we have been using for our projects), I feel I&#8217;m ready enough to announce it to anyone who&#8217;s looking for a way to record their technical decisions (and discuss them before they get made) without the overhead of stiff formal documents.</p>
<p>The following is a very brief overview of what you get in Redmine Arch Decisions 0.0.8:</p>
<h2>Arch Decisions</h2>
<div id="attachment_230" class="wp-caption aligncenter" style="width: 460px"><a href="http://timhigh.files.wordpress.com/2010/02/arch-decisions.png"><img class="size-full wp-image-230" title="Arch Decisions" src="http://timhigh.files.wordpress.com/2010/02/arch-decisions.png?w=450&#038;h=205" alt="" width="450" height="205" /></a><p class="wp-caption-text">Listing of Arch Decisions</p></div>
<p>The plugin includes a listing of the Arch Decisions themselves, which are currently limited to the scope of a single project. The ADs have an ID, a status, a summary, and a &#8220;Problem Description&#8221; field for more detailed information on the context of the decision. ADs currently follow a very simple workflow that isn&#8217;t being enforced, but is still useful:</p>
<ol>
<li>Not Started</li>
<li>Under Discussion</li>
<li>Decision Made</li>
<li>Work Scheduled (implies that issues and/or tasks have been registered to track the implementation)</li>
<li>Implemented (implies that all said issues and/or tasks have been completed, or at least to the satisfaction of the scope of the decision)</li>
<li>Canceled</li>
<li>Deprecated (implies that there&#8217;s another AD out there somewhere to replace it)</li>
</ol>
<p>Arch Decisions also have a text field called &#8220;Resolution&#8221; that should be filled out when the status is changed to &#8220;Decision Made&#8221;. The resolution should explain what the final decision was, summarize why that decision was made, and provide any additional guidance to any developers who will be making sure the AD gets implemented.</p>
<div id="attachment_231" class="wp-caption aligncenter" style="width: 460px"><a href="http://timhigh.files.wordpress.com/2010/02/arch-decision.png"><img class="size-full wp-image-231" title="Arch Decision" src="http://timhigh.files.wordpress.com/2010/02/arch-decision.png?w=450&#038;h=219" alt="" width="450" height="219" /></a><p class="wp-caption-text">Basic information for an Arch Decision</p></div>
<p>In addition to those basic text fields, there are also important supplemental elements embedded within the decisions that play an important role in the documentation and decision-making process (note that these are a new feature that I didn&#8217;t have in the old Quickbase version):</p>
<h2>Factors</h2>
<div id="attachment_232" class="wp-caption aligncenter" style="width: 460px"><a href="http://timhigh.files.wordpress.com/2010/02/factors.png"><img class="size-full wp-image-232" title="Factors" src="http://timhigh.files.wordpress.com/2010/02/factors.png?w=450&#038;h=242" alt="" width="450" height="242" /></a><p class="wp-caption-text">Factors associated with an AD</p></div>
<p>One of the most important benefits of tracking technical decisions in this way is the possibility of making all decision points and trade offs explicit. There are so many reasons why this is important :</p>
<ul>
<li>You can see on one place all the reasons for which a decision was made</li>
<li>You can weigh them against one another so that no one gets fixated on a single reason</li>
<li>You can truly validate your assumptions by making them visible and discussing them individually</li>
<li>If any of these reasons change in the future, you can go back and check to see if your decision is still valid</li>
</ul>
<p>Taking a cue from <a href="http://www.craiglarman.com/wiki/index.php?title=Main_Page" target="_blank">Craig Larman</a> and others, I call these reasons &#8220;Factors&#8221;. A factor can be just about anything &#8211; a requirement, a hunch, a feature, a factoid &#8211; that can be used as a justification for a particular decision. In my personal experience, I have seen these factors tossed about with reckless and wanton abandon, littering the sacred grounds of a design discussion. The RAD plugin attempts to put a little order to this chaos by giving you one place to record this information. In general, it can be detrimental to the flow of a discussion to continuously stop to record these factors, but it can be extremely productive to let the fur fly in the heat of the moment, and then carefully pick out the key factors afterwards when you&#8217;re ready to clean house.</p>
<p>Factors have a status, which is important in showing which ones have been &#8220;challenged&#8221; (by marking them as &#8220;Validated&#8221; once the discussion has completed), including ones that were later shown to be incorrect assumptions (&#8220;Refuted&#8221;). There is even a text field called &#8220;Evidence&#8221; wherein the user can record exactly how they came to the conclusion regarding the validity (via external URLs, quotes from a discussion, or even a lame but honest &#8220;because Tim said so&#8221;).</p>
<p>Also importantly, factors can be reordered on the AD view page by simply dragging a row and placing it in the order desired. This allows you to explicitly declare which factors have a greater weight or priority, which comes in useful when a trade off must be made.</p>
<p>One interesting thing to note about factors is that they may have varying scopes. Some may be very specific to the Arch Decision at hand (e.g. &#8220;We will get a big bonus if we pick Strategy A!&#8221; or &#8220;The coin said &#8216;heads&#8217;&#8221;). Some may related to more than one AD (e.g. &#8220;The company has mandated that we use open source tools for this project&#8221;). Still others may be &#8220;global truths&#8221; that can even be applied across multiple projects (e.g. &#8220;Amazon EC2 does not support multicast between instances&#8221; (can this one be refuted yet?)). Factors can be created on their own (via the separate Factors tab), or right in the AD itself. In the latter case, they are automatically given a scope of &#8220;Arch Decision&#8221;. But this can be changed to something a little more broad. When this happens, the Factor can then be added to multiple ADs as appropriate.</p>
<h2>Strategies</h2>
<div id="attachment_233" class="wp-caption aligncenter" style="width: 460px"><a href="http://timhigh.files.wordpress.com/2010/02/strategies.png"><img class="size-full wp-image-233" title="Strategies" src="http://timhigh.files.wordpress.com/2010/02/strategies.png?w=450&#038;h=149" alt="" width="450" height="149" /></a><p class="wp-caption-text">Strategies for an AD</p></div>
<p>What&#8217;s a decision without options to choose from? As with factors, my experience has been that people are good at tossing out ideas, but less good at remembering what they were later on. Or understanding anyone&#8217;s ideas but their own. So the RAD plugin also separates out a section just to track what those alternatives were that everyone proposed. Each one has a &#8220;short name&#8221;, which can be useful as reference (a little better than &#8220;wait, are you talking about the one where command comes in as a message which is then republished, or the one where you stick the command in the database and then you have a periodic task to look them up?&#8221;), plus a sightly longer summary. Then there is a detailed description for what that stratesugy would really entail.</p>
<p>Importantly, strategies can then be officially &#8220;rejected&#8221;, with an explanation as to why (in the future, it might be interesting to point to the key Factors). When this happens, they show up at the bottom of the list, with a big red &#8220;X&#8221; so that no one is confused as to whether or not that possibility is still being discussed (nor why it was rejected).</p>
<p>In some cases, you have a &#8220;there can only be one&#8221; situation, where a decision could only be considered to have been made when all the other competing strategies have been rejected. In this case, the Resolution will really just be a rewrite of the surviving strategy and its implications. In other cases, you might have multiple winners, each of which composes a part of the final resolution. I find this is especially the case when you are making decisions regarding standards &#8211; some will be rejected, while others will be accepted and adopted.</p>
<h2>Tracking</h2>
<div id="attachment_234" class="wp-caption aligncenter" style="width: 460px"><a href="http://timhigh.files.wordpress.com/2010/02/issue.png"><img class="size-full wp-image-234" title="Issue" src="http://timhigh.files.wordpress.com/2010/02/issue.png?w=450&#038;h=226" alt="" width="450" height="226" /></a><p class="wp-caption-text">An Issue with two related ADs</p></div>
<p>With this release, ADs can finally be associated with Redmine Issues. This is very important for tracking and governance (making sure the decision gets carried out, and that it is still followed in later implementations. It&#8217;s also true that during the course of making a decision, work has to be done on the side. Thus, the association between ADs and issues includes the &#8220;type&#8221; of relationship that an Issue bears to the AD:</p>
<ul>
<li>Task &#8211; the work is a task related to making the decision (e.g. for research)</li>
<li>Proof of Concept &#8211; partial implementation projects that are required to prove whether or not a particular strategy is viable</li>
<li>Implementation &#8211; software development work intended to implement a decision (e.g. the creation of a framework according to the design specifications stipulated by the resolution)</li>
<li>Governed &#8211; implementation of the issue is expected to follow the guidelines laid out by a (possibly previously-existing) decision</li>
</ul>
<p>Since I often work with issue trackers other than Redmine (and have been too lazy to implement a real integration), it&#8217;s also possible to define an Issue by an external URL rather than via a Redmine ID. Although the external tracker won&#8217;t have a back reference to the AD, and the AD won&#8217;t be able to report on the status of the issue, it&#8217;s certainly better than having no link at all.</p>
<h2>Collaboration</h2>
<p>The heart of the original idea for Arch Decisions was the ability to provide a voice to everyone involved in a decision. Ivory tower type architects would do well to take heed and use this tool. Developers don&#8217;t always like to have their instructions handed to them on a silver platter (especially when they think a bowl would be better for the soup they&#8217;re expected to eat). The RAD plugin gives developers the chance to speak up by posting comments in the Discussion sections (in fact, there&#8217;s one for each Factor and Strategy as well as the main AD itself, for those times when you need to focus on a specific subject). It also gives other project members a chance to respond, since there is a &#8220;watch&#8221; feature, and change notifications can go out via email.</p>
<p>In the previous incarnation of Arch Decisions, there was also a button on each issue so that a developer could raise a red flag whenever there was an implementation detail that needed to be discussed. Thus, the discussion could go both ways, so that architects are not always kept in the blue about what the developers are doing, and what they need to know. This worked very well at my last place of work. Unfortunately, I haven&#8217;t implemented this feature yet, but I&#8217;m sure it won&#8217;t be long before I do.</p>
<h2>Final Details</h2>
<p>Installing the plugin is very straightforward: just <a href="http://rubyforge.org/frs/?group_id=1850">download Redmine</a> and follow its basic instructions, then <a href="http://github.com/bigokro/redmine_arch_decisions">download the plugin</a>, stick it in the /vendors/plugins folder, and run &#8220;rake db:migrate_plugins&#8221; to set up the database. I&#8217;ll provide a more extensive guide in another post, but hopefully that&#8217;s enough to get you started. Unfortunately, the plugin only works with version 0.8.4 of Redmine. I&#8217;d like to get it working for 0.9.x soon, so if that&#8217;s important to you, give me a holler to get off my butt.</p>
<p>I&#8217;ve got more tips and details to discuss about the plugin, so I&#8217;ll try to get around to that as soon as possible. Until then, let me know if you have any feedback, and I really wish you the best in your future decisions!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/229/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=229&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2010/02/23/announcing-the-arch-decisions-plugin-for-redmine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>

		<media:content url="http://timhigh.files.wordpress.com/2010/02/arch-decisions.png" medium="image">
			<media:title type="html">Arch Decisions</media:title>
		</media:content>

		<media:content url="http://timhigh.files.wordpress.com/2010/02/arch-decision.png" medium="image">
			<media:title type="html">Arch Decision</media:title>
		</media:content>

		<media:content url="http://timhigh.files.wordpress.com/2010/02/factors.png" medium="image">
			<media:title type="html">Factors</media:title>
		</media:content>

		<media:content url="http://timhigh.files.wordpress.com/2010/02/strategies.png" medium="image">
			<media:title type="html">Strategies</media:title>
		</media:content>

		<media:content url="http://timhigh.files.wordpress.com/2010/02/issue.png" medium="image">
			<media:title type="html">Issue</media:title>
		</media:content>
	</item>
		<item>
		<title>Complexity Creep: Data Scavenger</title>
		<link>http://timhigh.wordpress.com/2009/05/17/complexity-creep-data-scavenger/</link>
		<comments>http://timhigh.wordpress.com/2009/05/17/complexity-creep-data-scavenger/#comments</comments>
		<pubDate>Sun, 17 May 2009 00:58:29 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[complexity creep]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=224</guid>
		<description><![CDATA[You&#8217;re given a simple task: get some XML data from a URL or web service, convert it to something else, and send it off down stream to some other system. Easy enough, right? Somewhere in the middle of your &#8220;80 percent done&#8221; report, you realize that the original XML is missing one silly little field [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=224&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>You&#8217;re given a simple task: get some XML data from a URL or web service, convert it to something else, and send it off down stream to some other system. Easy enough, right? Somewhere in the middle of your &#8220;80 percent done&#8221; report, you realize that the original XML is missing one silly little field &#8211; the customer&#8217;s middle name,  the timezone on the date, the preferred nickname for their online avatar, whatever. Unfortunately, this little detail is critical for completing your task at hand.</p>
<p>If there&#8217;s no way to get this information, there&#8217;s very little you can do, besides ask for an enhancement and wait. But very often, the data&#8217;s there for the taking; you just have to go out and get it from somewhere else. Just as common, however, that &#8220;somewhere else&#8221; is not as accessible as you&#8217;d like. If you&#8217;re lucky, you can just pull another object or rowset out of the same database. If you&#8217;re not, good luck with that &#8220;80 percent&#8221; thing&#8230;</p>
<p>Here are some of the complications you may come across in a data scavenger hunt:</p>
<ul>
<li>The data&#8217;s there, but you have to torture it out of data structures not meant to provide it (e.g. it&#8217;s buried in a string of text with no standard format, or in a numerical field with no clear designation for varying units)</li>
<li>The data&#8217;s on a remote server: performance may be impacted, you have to deal with the problem of making the call (if at all possible), handling errors, and so on</li>
<li>You don&#8217;t have the privilege to access the data</li>
<li>The data is not guaranteed to be transactionally consistent (you may be getting some stale data, or the new data reflects changes that aren&#8217;t seen by the rest of your data set)</li>
<li>The data is in a log file, system configuration file, admin-only database tables, or some other unholy &#8220;do not touch this!&#8221; artifact</li>
</ul>
<p>Each one of these little beauties is a mini-rat&#8217;s nest of <a href="http://timhigh.wordpress.com/2009/05/15/complexity-creep-aspect-infiltration/">complexity creeps</a> of their own. What do you do if your application doesn&#8217;t have privileges to get the data? Implement a &#8220;run-as&#8221; feature just to get the one field? Hard-code the root user password? Convince the guys on the other side of the fence to give you a user and wait?</p>
<p>In some cases, you may actually be able to modify the code itself to fit your needs. But that requires a new release of the software, which, if you&#8217;re accessing it from the outside, may not be an option (I&#8217;ll be posting another Complexity Creep article on this one some time soon). Also, this can lead to problems of its own: the &#8220;universal interface&#8221;, or the one-size-fits-all façade. I&#8217;ve worked with interfaces like this, where every new feature begets a new variation on the same old methods, just to avoid the need for scavenger hunting. It happens with database views, and in XML, too: to avoid making multiple remote requests, you keep adding new fields to your XML entities, until your Company XML document includes a list of all employees barfed up somewhere in the nested tags, complete with their &#8220;Address2&#8243; field and their in-flight meal preferences. This solution is the evil twin of the <em>Data Scavenger</em>: the <em>Data Tar Baby</em>.</p>
<p>Data scavenging is a common problem in integration projects, which is one of the reasons they can be so tough. But it can happen when building monitoring utilities, reporting features, or just about anywhere information is required. Unfortunately, when working in the &#8220;information technology&#8221; field, the odds are pretty high you&#8217;ll come across this more often than you&#8217;d like. And yet, when you do, it always seems to be that one last insignificant detail that turns your routine query into a scavenger hunt.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/224/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=224&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2009/05/17/complexity-creep-data-scavenger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
		<item>
		<title>Complexity Creep: Aspect Infiltration</title>
		<link>http://timhigh.wordpress.com/2009/05/15/complexity-creep-aspect-infiltration/</link>
		<comments>http://timhigh.wordpress.com/2009/05/15/complexity-creep-aspect-infiltration/#comments</comments>
		<pubDate>Fri, 15 May 2009 22:24:46 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[complexity creep]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=214</guid>
		<description><![CDATA[The other day, I was working on enhancements to a type of &#8220;job execution harness&#8221; that executes parallel tasks in our system. We had started out with the concept of &#8220;jobs&#8221;, essentially individual commands in a Command design pattern, and had recently evolved the idea of &#8220;groups&#8221; of jobs for managing dependencies between sets of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=214&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The other day, I was working on enhancements to a type of &#8220;job execution harness&#8221; that executes parallel tasks in our system. We had started out with the concept of &#8220;jobs&#8221;, essentially individual commands in a <a href="http://en.wikipedia.org/wiki/Command_pattern" target="_blank">Command design pattern</a>, and had recently evolved the idea of &#8220;groups&#8221; of jobs for managing dependencies between sets of parallel tasks. (note: just for fun I&#8217;m testing out <a href="http://www.yuml.me" target="_blank">yUML </a>for the images here)</p>
<p><div class="wp-caption aligncenter" style="width: 123px"><img class=" " title="Aspect Injection Classes 1" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job], [Harness]schedules-&gt;[Group], [Group]&lt;&gt;1-&gt;*[Job], [Group]depends on-&gt;[Group]." alt="Harness schedules Groups and executes Jobs" width="113" height="310" /><p class="wp-caption-text">Harness schedules Groups and executes Jobs</p></div>As with pretty much any <a href="http://timhigh.wordpress.com/2009/05/14/complexity-creep/">complexity creep story</a>, this one starts out with a pretty simple and elegant design. You basically had an execution harness, which took care of scheduling the jobs to be executed, and the jobs themselves, which were totally independent POJOs, with no knowledge of each other, nor of the harness itself. The harness itself provided monitoring capabilities which reported the start and end of the groups, and of the individual jobs.</p>
<p><div class="wp-caption aligncenter" style="width: 279px"><img class=" " title="Aspect Infiltration Class Diagram 2" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Harness]reports-&gt;[Monitor{bg:orange}]." alt="Harness executes Jobs and reports to Harness Monitor" width="269" height="128" /><p class="wp-caption-text">Harness executes Jobs and reports to Harness Monitor</p></div>We were living in separation-of-concerns bliss until the day we were given a new requirement: to support monitoring of job &#8220;steps&#8221;. &#8220;Um, what&#8217;s a job step?&#8221; we asked. It turns out that some of these jobs can take a looong time to run (several hours). Users wanted a way to see what was going on during these jobs in order to get a feel for when they would be done, and if everything was going ok.</p>
<p><div class="wp-caption aligncenter" style="width: 371px"><img class="  " title="Aspect Infiltration Class Diagram 3 - resize" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Job]&lt;&gt;-&gt;*[Step]." alt="Harness executes Jobs which contain Steps...?" width="361" height="55" /><p class="wp-caption-text">Harness executes Jobs which contain Steps...</p></div>We wanted at all costs to preserve the harness-agnostic nature of our jobs. We thought about breaking the bigger jobs up into smaller jobs, but unfortunately, it wasn&#8217;t possible since they are essentially atomic units of work. We considered solutions for providing some sort of outside monitor which could somehow generically track the execution, but these steps were basically execution milestones that only the job itself could know. Finally, we knew we were defeated, and gave in: because of one little logging requirement, we were going to have to introduce some sort of callback mechanism to let the once harness-agnostic jobs signal to the harness whenever a step was completed.</p>
<p><div class="wp-caption aligncenter" style="width: 108px"><img class=" " title="Aspect Infiltration Class Diagram 4" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Harness]reports-&gt;[Monitor{bg:orange}],%20[Job]reports-&gt;[Monitor]." alt="Harness and Job both report to Harness Monitor" width="98" height="310" /><p class="wp-caption-text">Harness and Job both report to Harness Monitor</p></div>From a pure layering perspective, you can see that we are in trouble if we are trying to keep all the harness code (in orange) in a top layer, and the business code below. So, what are some possible solutions to the problem? We could:</p>
<ol>
<li>Let the monitor know about the progress of the Job steps through some indirect method (e.g. through special text log statements, or indirect indications via data in the database). While it would avoid placing any explicit compile-time dependencies on the Job class to the harness, it would create a very fragile &#8220;know without knowing&#8221; relationship that the Jobs would have with the harness. Nasty.</li>
<li>Create a special &#8220;StepLoggingJob&#8221; abstract class that these Jobs would extend in order to gain access to some special logging facilities. Basically, these Jobs would no longer be POJO classes, in the sense that I used the terms, since they would have to extend a harness-specific framework. Unfortunately, this introduces a circular dependency.</li>
<li>Inject a special &#8220;StepLogger&#8221; utility class into the Jobs, either as a class member, or as a parameter on their &#8220;execute()&#8221; (or whatever) method</li>
</ol>
<div class="wp-caption aligncenter" style="width: 159px"><img class=" " title="Aspect Infiltration Diagram 5" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Harness]reports-&gt;[Monitor{bg:orange}],%20[Job]logs%20to-&gt;[DataStore{bg:green}],%20[Monitor]reads%20from-&gt;[DataStore]." alt="Option 1: Job writes special logging messages to a common store" width="149" height="310" /><p class="wp-caption-text">Option 1: Job writes special logging messages to a common store</p></div>
<div class="wp-caption aligncenter" style="width: 249px"><img class=" " title="Aspect Injection Diagram 6" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Harness]reports-&gt;[Monitor{bg:orange}],%20[StepLoggingJob{bg:orange}]^-[Job],%20[StepLoggingJob]reports-&gt;[Monitor]." alt="Job extends StepLoggingJob" width="239" height="209" /><p class="wp-caption-text">Option 2: Job extends StepLoggingJob</p></div>
<div class="wp-caption aligncenter" style="width: 139px"><img class=" " title="Aspect Injection Diagram 7" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Harness]reports-&gt;[Monitor{bg:orange}],%20[Job]calls-&gt;[StepLogger{bg:orange}],%20[StepLogger]reports-&gt;[Monitor]." alt="Option 3: Job calls a StepLogger which reports to the Monitor" width="129" height="437" /><p class="wp-caption-text">Option 3: Job calls a StepLogger which reports to the Monitor</p></div>
<p>Note that we still haven&#8217;t really solved the problem&#8230; the Job class still requires something in the &#8220;harness layer&#8221;. If we were using a dynamically typed language, we could do something of a mix between option 1 and option 3 by using <a href="http://en.wikipedia.org/wiki/Duck_typing" target="_blank">duck typing</a> (the Job would know it was getting SOMETHING that could log, but wouldn&#8217;t have to know it&#8217;s from the harness layer). In order to really separate the dependencies in Java, which we use, we have to create a new layer, the &#8220;harness API layer&#8221;, and place only the StepLogger interface there:</p>
<p><div class="wp-caption aligncenter" style="width: 141px"><img class=" " title="Aspect Infiltration Diagram 8" src="http://yuml.me/diagram/scruffy/class/[Harness{bg:orange}]executes-&gt;[Job],%20[Harness]reports-&gt;[Monitor{bg:orange}],%20[Job]calls-&gt;[StepLogger{bg:blue}],%20[StepLogger]^-implements[StepLoggerImpl{bg:orange}],%20[StepLoggerImpl]reports-&gt;[Monitor]." alt="Job knows only about the StepLogger interface" width="131" height="483" /><p class="wp-caption-text">Job knows only about the StepLogger interface</p></div>So, what happened? To summarize: because we wanted just a little more logging, we were forced to introduce a whole new layer into our application, and break the concept of 100% harness-agnostic commands. Is this an isolated case? Of course not. You see it all over the place, and logging is a great example of this. Have you ever heard someone talk about <a href="http://en.wikipedia.org/wiki/Aspect_oriented_programming" target="_blank">aspect-oriented programming</a> (AOP), and give logging as an example? It&#8217;s PERFECT! With some simple configuration, you can automatically enable logging on all your methods without a single line of code. So, you can get rid of a ton of boiler-plate code related to logging, and focus on just the business logic, right? Wrong. If that were true, we all would have thrown our logging libraries in the garbage years ago. Instead, <a href="http://logging.apache.org/log4j/" target="_blank">Log4J</a> is still one of the most heavily-used tools in our library. Why? Because aspects work by wrapping your methods (and so on) with before and after logic, but they can&#8217;t get INSIDE the methods themselves.</p>
<div id="attachment_215" class="wp-caption aligncenter" style="width: 370px"><img class="size-full wp-image-215 " title="AspectLogging" src="http://timhigh.files.wordpress.com/2009/05/aspectlogging.png?w=360&#038;h=202" alt="The really useful logs are written by the method itself" width="360" height="202" /><p class="wp-caption-text">The really useful logs are written by the method itself</p></div>
<p>I call this <em>Aspect Infiltration</em>: when your non-business infrastructure creeps into your business code. You can see this elsewhere, as well: in the J2EE container whose transaction control isn&#8217;t fine-grained enough for you (introduce a UserTransaction interface); in the security service that isn&#8217;t sufficiently detailed (give the code access to a security context), and so on. It&#8217;s a common issue for any container that wants to do all the work for you. There will come a time when the business code itself just knows better. And you&#8217;d better be ready to give it the API that it needs.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/214/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=214&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2009/05/15/complexity-creep-aspect-infiltration/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,Harnessschedules-&#062;Group,Group&#060;&#062;1-&#062;*Job,Groupdependson-&#062;Group." medium="image">
			<media:title type="html">Aspect Injection Classes 1</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Harnessreports-&#062;Monitorbg:orange." medium="image">
			<media:title type="html">Aspect Infiltration Class Diagram 2</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Job&#060;&#062;-&#062;*Step." medium="image">
			<media:title type="html">Aspect Infiltration Class Diagram 3 - resize</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Harnessreports-&#062;Monitorbg:orange,%20Jobreports-&#062;Monitor." medium="image">
			<media:title type="html">Aspect Infiltration Class Diagram 4</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Harnessreports-&#062;Monitorbg:orange,%20Joblogs%20to-&#062;DataStorebg:green,%20Monitorreads%20from-&#062;DataStore." medium="image">
			<media:title type="html">Aspect Infiltration Diagram 5</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Harnessreports-&#062;Monitorbg:orange,%20StepLoggingJobbg:orange-Job,%20StepLoggingJobreports-&#062;Monitor." medium="image">
			<media:title type="html">Aspect Injection Diagram 6</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Harnessreports-&#062;Monitorbg:orange,%20Jobcalls-&#062;StepLoggerbg:orange,%20StepLoggerreports-&#062;Monitor." medium="image">
			<media:title type="html">Aspect Injection Diagram 7</media:title>
		</media:content>

		<media:content url="http://yuml.me/diagram/scruffy/class/Harnessbg:orangeexecutes-&#062;Job,%20Harnessreports-&#062;Monitorbg:orange,%20Jobcalls-&#062;StepLoggerbg:blue,%20StepLogger-implementsStepLoggerImplbg:orange,%20StepLoggerImplreports-&#062;Monitor." medium="image">
			<media:title type="html">Aspect Infiltration Diagram 8</media:title>
		</media:content>

		<media:content url="http://timhigh.files.wordpress.com/2009/05/aspectlogging.png" medium="image">
			<media:title type="html">AspectLogging</media:title>
		</media:content>
	</item>
		<item>
		<title>Complexity Creep</title>
		<link>http://timhigh.wordpress.com/2009/05/14/complexity-creep/</link>
		<comments>http://timhigh.wordpress.com/2009/05/14/complexity-creep/#comments</comments>
		<pubDate>Thu, 14 May 2009 15:22:16 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[complexity creep]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=211</guid>
		<description><![CDATA[I&#8217;ve been silent in this blog for a while now not only because I&#8217;ve been busy with family, work, and organizing IASA encounters, but also because I&#8217;m reluctant to rehash anything that&#8217;s been written before. Fortunately, I think I&#8217;ve come across something worth the pixels its written on. While working on software design over the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=211&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been silent in this blog for a while now not only because I&#8217;ve been busy with family, work, and organizing <a href="http://www.google.com/calendar/embed?src=iasa.rj%40gmail.com&amp;ctz=America/Sao_Paulo" target="_blank">IASA encounters</a>, but also because I&#8217;m reluctant to rehash anything that&#8217;s been written before. Fortunately, I think I&#8217;ve come across something worth the pixels its written on. While working on software design over the years, I&#8217;ve noticed a common pattern, no matter how unrelated design tasks are: every design starts out really simple and elegant, but at some point can grow into a warted perturbed perversion of the original idea. In some cases, in response to a new requirement or complication, a new solution latches on to the side of the core design, like a barnacle on the keel of a ship. Other times, the whole design can be turned belly-up, like the Poseidon after a storm. What&#8217;s  fascinating to me is how the great upheavals in design are often caused by the smallest additional requirements.</p>
<p>Everyone has heard of the concept of &#8220;scope creep&#8221;, when the requirements seem to grow faster than you can code. I want to write about what I&#8217;d like to call <em>&#8220;complexity creep&#8221;</em>, those moments when a tiny little requirement can mean  a whole lot of extra work for the development team, or even turn your basic design concepts on their head.</p>
<p>Since this will be the beginning of a series of posts, inspired by some of the most agonizing moments from my ongoing work as a software architect, I won&#8217;t post any examples here. Look instead for my next posts, coming soon, on two &#8220;patterns&#8221; (oh no! YADSDPC &#8211; Yet Another Damned Software Design Pattern Catalog*) of complexity creep: &#8220;Aspect Infiltration&#8221; and &#8220;Data Scavenger&#8221;. If you come across any moments of your own, please let me know!</p>
<p>* Note that I use the term &#8220;pattern&#8221; here loosely, as in a group of unrelated issues with recongnizable commonalities. I&#8217;m not really planning on documenting these like <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)">software design patterns</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/211/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=211&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2009/05/14/complexity-creep/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
		<item>
		<title>Announcement: First meeting of the IASA-RJ study groups</title>
		<link>http://timhigh.wordpress.com/2009/03/13/announcement-first-meeting-of-the-iasa-rj-study-groups/</link>
		<comments>http://timhigh.wordpress.com/2009/03/13/announcement-first-meeting-of-the-iasa-rj-study-groups/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 17:19:54 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[ATAM]]></category>
		<category><![CDATA[IASA]]></category>
		<category><![CDATA[ITAC]]></category>
		<category><![CDATA[TOGAF]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=208</guid>
		<description><![CDATA[The first official meeting of the IASA-RJ study groups will be happening on Thursday, March 26 from 7 to 9 PM. The idea is to eventually be running (at least) three self-organizing study groups separately. But for this first meeting, and until we decide that we have enough interest for each, we will try to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=208&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The first official meeting of the <a href="http://www.iasahome.org" target="_blank">IASA</a>-RJ study groups will be happening on Thursday, March 26 from 7 to 9 PM. The idea is to eventually be running (at least) three self-organizing study groups separately. But for this first meeting, and until we decide that we have enough interest for each, we will try to touch on all three topics:</p>
<ul>
<li>A study of the <a href="http://www.sei.cmu.edu/architecture/ata_method.html" target="_blank">ATAM</a> methodology for evaluating software architectures</li>
<li>Study and preparation for The Open Group&#8217;s <a href="http://www.opengroup.org/itac/" target="_blank">ITAC</a> certification for IT Architects</li>
<li>Study of The Open Group Architecture Framework (<a href="http://www.opengroup.org/togaf/" target="_blank">TOGAF</a>) and preparation for those that want certification</li>
</ul>
<p>That&#8217;s a lot to cover in a single meeting, and a very ambitious undertaking for a single study group. In this first get-together I will be giving an overview of the ATAM, and <a href="http://www.linkedin.com/pub/dir/marcelo/s%C3%A1vio" target="_blank">Marcelo Sávio</a> will present the other two topics. Time permitting, we will then get down to business and discuss how we can organize the study group(s) and where to go from here.</p>
<p>If you&#8217;re interested in learning more about any of these topics, and happen to live in the Rio de Janeiro area, let me know. I&#8217;ll be happy to provide full information regarding the location of the meeting. Also, space is limited, so the sooner you let me know, the better. Lastly, if you are not yet a member of the IASA-RJ group, go to the <a href="http://groups.google.com/group/iasa-rj" target="_blank">Google Groups site</a> and request permission to join, or send me your email and I&#8217;ll be happy to oblige.</p>
<p>Hope to see you soon!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/208/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=208&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2009/03/13/announcement-first-meeting-of-the-iasa-rj-study-groups/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
		<item>
		<title>Do we need Yet Another Method to communicate?</title>
		<link>http://timhigh.wordpress.com/2009/03/10/do-we-need-yet-another-method-to-communicate/</link>
		<comments>http://timhigh.wordpress.com/2009/03/10/do-we-need-yet-another-method-to-communicate/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 12:08:58 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Software Process]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[architecture2.0]]></category>
		<category><![CDATA[enterprise2.0]]></category>
		<category><![CDATA[yammer]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=198</guid>
		<description><![CDATA[Lately I&#8217;ve been looking into Web 2.0-type tools to improve our commumication and workflow at work. There&#8217;s been some Enterprise 2.0 buzz about Twitter as a possible tool for communication on projects, and I&#8217;ve been scratching my head trying to figure out exactly how. One problem with Twitter is that it is wide out in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=198&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lately I&#8217;ve been looking into Web 2.0-type tools to improve our commumication and workflow at work. There&#8217;s been some <a href="http://enterprise2blog.com/" target="_blank">Enterprise 2.0</a> buzz about <a href="http://twitter.com" target="_blank">Twitter </a>as a possible tool for communication on projects, and I&#8217;ve been scratching my head trying to figure out exactly how. One problem with Twitter is that it is wide out in the open, for anyone to read. If loose lips sink ships, Twitter is the Bermuda Triangle of company secrets. It hardly seems wise to be encouraging your employees to discuss the intacies of internal projects in such an open forum.</p>
<p>I recently came across <a href="https://www.yammer.com/" target="_blank">Yammer</a>, which is an enterprise-friendly version of Twitter. Basically, it&#8217;s the same thing, but your comments are only visible to members of your &#8220;company&#8221; (currently defined by the domain name of your email address). There are other features like private groups, but you get the idea.</p>
<p>Now, there&#8217;s been a lot of talk recently about the importance of quiet time for productivity (c.f. <a href="http://oreilly.com/catalog/9780596519780/" target="_blank">The Productive Programmer</a>).  To many &#8220;yammers&#8221; (or &#8220;yams&#8221;&#8230;?) might appear to be nothing more than an acronym for &#8220;<strong>Y</strong>et <strong>A</strong>nother <strong>M</strong>ethod to <strong>M</strong>olest <strong>E</strong>veryone <strong>R</strong>elentlessly&#8221;. If there&#8217;s nothing more to this Yammer thing than posting your whims to the world, I wholeheartedly agree. We already use email for correspondence, IM for more immediate communication, Skype for voice and text conferences, web forums for context-related discussions, wikis, and on and on. So who needs yet another open window on our desktop, yet another way to have your train of thought interrupted, one more place you have to look to find a comment or note?</p>
<p>First, let&#8217;s take a look at the characteristics of the Yammer style of communication:</p>
<ol>
<li>It&#8217;s written (online)</li>
<li>Very brief (about the size of an IM message)</li>
<li>Can include attachments, but not common</li>
<li>Visible to all in the enterprise (unless posted to private group)</li>
<li>Messages can be tagged for organization/filtering by keywords</li>
<li>Only your &#8220;followers&#8221; (or followers of a tag used) are &#8220;notified&#8221; &#8211; except for messages targeted at an individual, the author doesn&#8217;t choose the audience</li>
<li>Mode of notification is configurable (from in-your-face to I&#8217;ll look it up when I remember)</li>
<li>Messages are searchable by all</li>
</ol>
<p>Twitter is billed as a microblog, where users post random thoughts and actions of the day (the form for posts asks you &#8220;What are you doing?&#8221;). The main benefit touted by users is that out of this chaos, you end up learning things about your friends you never knew. Yammer seems to be aiming for the same thing in a business setting (they ask &#8220;What are you working on?&#8221; in the desktop app. Online, they are more open-ended: &#8220;Share something with My Colleagues&#8221;). Unlike IMs and email, Twitter doesn&#8217;t seem to be for everyone; only those with a yen for connectivity really seem to grok it. In a business setting, particularly in a small company such as mine, it seems unlikely that we could achieve the critical mass necessary to make this work.</p>
<p>But there are some problems with communication out there in the corporate world that I have been looking to solve. The biggest issue I have is the need for a bottom-up &#8220;news from the trenches&#8221;-style way for developers to let me know what they do and I don&#8217;t. The types of things that may get mentioned at the water cooler and then forgotten; the fleeting idea that even the developer soon forgets; the magic shortcut command that only one guy in the corner is using; the little detail in the fine print of the new product we&#8217;re buying that means it&#8217;s not going to work with our software.</p>
<p>One would think that forums would work for this type of communication, but they don&#8217;t. Perhaps the problem is that there&#8217;s a certain sense of responsibility when you post to one: what if no one responds to my idea? What if people think it&#8217;s crap? A lot of people with really good ideas would rather remain anonymous than stick their necks out for what&#8217;s no more than a fleeting thought. But I think another part of the problem is just the sheer overhead involved in using forums: first you have to open the page, look to see if anyone&#8217;s posted something similar, create a new topic, write up some sort of backgroud story to fill up the big textarea&#8230; And who goes around browsing the forums for new posts, anyway?</p>
<p>Here&#8217;s where I think Twitter/Yammer-style communication may come in handy. It takes all of 10 seconds to post a single sentence, you can tag it so that it gets found by the people who care (<em>#yammer</em> <em>#productivity</em> hey! That chain icon on the plugin pastes a link to the current page), and there&#8217;s no expectation whatsoever that people will respond. The messages are searchable later, meaning that someone that wasn&#8217;t previously watching the tag could go and grab all the <em>#productivity</em> tips if they want to.</p>
<p>The other area I&#8217;m looking at is with project coordination and communication. An interesting thing that has evolved here at work is the use of Skype chats created specifically for members of a project team to coordinate their actions, ask questions, and so on. The one complaint I&#8217;ve heard about this approach is that people on the &#8220;outside&#8221; (not added to the chat) have no way of knowing what&#8217;s going on in the chat, and no way of looking at the history when they finally are. Yammer could be a solution to that problem, although it&#8217;s a terrible medium for active discussions.</p>
<p>So will it work? Will people use it freely, without putting a gun to their heads? Will it increase the sharing of knowledge at work and capture those important but elusive thoughts, or will it be just another icon on the desktop and another distraction from real work? I&#8217;m just starting to test it out here where I work, so I don&#8217;t have a conclusive answer yet, but I can make some initial observations.</p>
<p>First of all, It&#8217;s not a no-brainer. The best ideas catch on without any explanation, but with Yammer, people don&#8217;t seem to get it right away (me included). Twitter is the same way, so this doesn&#8217;t necessarily spell doom for this little experiment. Still, I sent out a general announcement to about 20 people, and got exactly 1 person who signed up (and since then hasn&#8217;t posted a single message). I next took the approach of asking people one at a time to join, explaining the basic concept to them in the process. While they seemed interested in the idea, I find I&#8217;m still pretty much the only one posting. Now I&#8217;m trying a 2-pronged approach of getting all the members of a small project to try it out for project-related communication, while encouraging developers to post some very specific ideas (around <em>#productivity </em>tips) when they have them.</p>
<p>I find that a few good examples help, and as I myself gain experience with it, I&#8217;m getting a feel for when to use it. Just today, I was in a meeting for one project, and had a quick thought about an unrelated subject. I grabbed my iPod and quickly &#8220;yammered&#8221; the idea out to the related tag. Too bad no one out there is listening&#8230;</p>
<p>So, perhaps this is an idea that will work, once people get used to it. Or perhaps Yammer&#8217;s value is no more that of Twitter: good for connecting the Web 2.0 addicts of your business in chaotic an unpredictable ways. Which is great for a fortune 500 enterprise, but sure feels lonely for us small guys.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/198/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=198&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2009/03/10/do-we-need-yet-another-method-to-communicate/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
		<item>
		<title>97 Things Every Software Architect Should Know &#8211; Released!</title>
		<link>http://timhigh.wordpress.com/2009/03/06/97-things-every-software-architect-should-know-released/</link>
		<comments>http://timhigh.wordpress.com/2009/03/06/97-things-every-software-architect-should-know-released/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 21:51:57 +0000</pubDate>
		<dc:creator>Timothy High</dc:creator>
				<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[97 things]]></category>

		<guid isPermaLink="false">http://timhigh.wordpress.com/?p=199</guid>
		<description><![CDATA[I guess it&#8217;s my turn to write about this. I&#8217;ve mentioned before that I participated in an online community project called &#8220;97 Things Every Software Architect Should Know&#8221;. It&#8217;s an ongoing (although currently quiet) collaboration to share the wisdom and experiences of software architects, a group that has only recently been gaining recognition as anything [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=199&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I guess it&#8217;s my turn to write about this. I&#8217;ve mentioned <a href="http://timhigh.wordpress.com/tag/97-things/">before</a> that I participated in an online community project called <a href="http://97-things.near-time.net/wiki" target="_blank">&#8220;97 Things Every Software Architect Should Know&#8221;</a>. It&#8217;s an ongoing (although currently quiet) collaboration to share the wisdom and experiences of software architects, a group that has only recently been gaining recognition as anything more than a job title.</p>
<p>Well, I am proud to say that I contributed 4 of those 97 things, or &#8220;axioms&#8221; as they&#8217;re called, and now am happy to announce that the book was finally released! You can buy a copy yourself via <a href="http://oreilly.com/catalog/9780596522698/index.html#top" target="_blank">O&#8217;Reilly</a>, <a href="http://www.amazon.com/Things-Every-Software-Architect-Should/dp/059652269X/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1235560838&amp;sr=8-1" target="_blank">Amazon.com</a>, or elsewhere. Or, if you prefer burning fossil fuels over killing trees, you can read the axioms for free (minus electric and internet fees) on the official web site. You&#8217;ll also find other nuggets of wisdom in the section entitled <a href="http://97-things.near-time.net/wiki/other-things-software-architects-should-know" target="_blank">&#8220;Other Things Software Architects Should Know&#8221;</a>, and can even contribute your own expertise via the <a href="http://97-things.near-time.net/forum/show/user-contributed-axioms" target="_blank">&#8220;Community Axioms&#8221;</a> page (I have <a href="http://97-things.near-time.net/forum/user-contributed-axioms/97-more-things-every-software-architect-should-know" target="_blank">two more</a> out there, including one that I think I expressed better in a <a href="http://timhigh.wordpress.com/2009/02/23/causes-of-decay-mutating-design/">recent blog post</a>).</p>
<p>As a side note, I&#8217;d just like to say that there was no pretense with this book to define that these principles are THE 97 things you need to know as a software architect, nor that there are only 97 (the additional contributions on the web site are a testament to that). In fact, the reason for the number 97 is a bit bizarre &#8211; I leave it as homework for you to find the explanation hidden in the forums of the 97 Things web site.  If this book is successful, O&#8217;Reilly may decide to print a second addition with more axioms, maybe even written by you! They are definitely going ahead with a whole new series of books in the &#8220;97 Things&#8221; style, on such subjects as programming, data architecture, and others. Keep an eye out for more opportunities to contribute to the community knowledge.</p>
<p>Lastly, if you really like the project or the book, and want to network with other contributors, I just created a <a href="http://www.linkedin.com/groups?gid=1835657&amp;trk=hb_side_g" target="_blank">group on LinkedIn.com</a> for this purpose &#8211; feel free to join!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timhigh.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timhigh.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timhigh.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timhigh.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timhigh.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timhigh.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timhigh.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timhigh.wordpress.com/199/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=timhigh.wordpress.com&amp;blog=4326211&amp;post=199&amp;subd=timhigh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://timhigh.wordpress.com/2009/03/06/97-things-every-software-architect-should-know-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/14430db23e8bcd683dfbfaa99f5faaf6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bigokro</media:title>
		</media:content>
	</item>
	</channel>
</rss>
