<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Kirk's Planet</title>
	<link>http://localhost/planet/kirk</link>
	<language>en</language>
	<description>Kirk's Planet - http://localhost/planet/kirk</description>

<item>
	<title>@kirkk.com blog: JarAnalyzer in Google Code</title>
	<guid>http://techdistrict.kirkk.com/2008/11/20/jaranalyzer-in-google-code/</guid>
	<link>http://techdistrict.kirkk.com/2008/11/20/jaranalyzer-in-google-code/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.kirkk.com/main/Main/JarAnalyzer&quot;&gt;&lt;a href=&quot;http://code.google.com/p/jaranalyzer/&quot;&gt;&lt;img src=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2008/11/jargcode.jpg&quot; width=&quot;361&quot; height=&quot;158&quot; /&gt;&lt;/a&gt;JarAnalyzer&lt;/a&gt; now has it&amp;#8217;s own &lt;a href=&quot;http://code.google.com/p/jaranalyzer/&quot;&gt;Google Code location&lt;/a&gt;. You can browse the source code online, check the source code out, and do all of the other exciting things that you can do with a subversion repository. The source in the google code repository is the same as can be found at the &lt;a href=&quot;http://www.kirkk.com/main/Main/JarAnalyzer&quot;&gt;JarAnalyzer homepage&lt;/a&gt; (which is also where the binary is still found), except that the Google Code location also contains the &lt;a href=&quot;http://techdistrict.kirkk.com/2007/09/07/new-jaranalyzer-xsl/&quot;&gt;JarAnalyzer XSLT&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Eventually, I hope to move the documentation over to the Google repository. Yeah&amp;#8230;right! Update the documentation? I don&amp;#8217;t think so!&lt;/p&gt;</description>
	<pubDate>Thu, 20 Nov 2008 17:01:28 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: I’m on Twitter</title>
	<guid>http://techdistrict.kirkk.com/2008/11/20/im-on-twitter/</guid>
	<link>http://techdistrict.kirkk.com/2008/11/20/im-on-twitter/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.twitter.com/pragkirk&quot;&gt;&lt;img src=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2008/11/twitter.gif&quot; alt=&quot;&quot; width=&quot;142&quot; height=&quot;91&quot; /&gt;&lt;/a&gt;I&amp;#8217;ve jumped on the &lt;a href=&quot;http://www.twitter.com&quot;&gt;Twitter&lt;/a&gt; bandwagon. Possibly a little slow, but better late than never. I&amp;#8217;ve started following a few people, and so far I find it fun and interesting. I intend to post mostly on tech stuff. I&amp;#8217;ve also included my tweet feed on the right sidebar of this blog. Or you can subscribe to my &lt;a href=&quot;http://twitter.com/statuses/user_timeline/17481654.rss&quot;&gt;tweet feed&lt;/a&gt; separately. Or you can start &lt;a href=&quot;http://www.twitter.com/pragkirk&quot;&gt;following me now&lt;/a&gt;! You decide.&lt;/p&gt;</description>
	<pubDate>Thu, 20 Nov 2008 03:06:41 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi interest via MarkMail</title>
	<guid>http://techdistrict.kirkk.com/2008/11/19/osgi-interest-via-markmail/</guid>
	<link>http://techdistrict.kirkk.com/2008/11/19/osgi-interest-via-markmail/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2008/11/markmailosgi.jpg&quot; alt=&quot;&quot; width=&quot;523&quot; height=&quot;269&quot; /&gt; An image I swiped from &lt;a href=&quot;http://markmail.org&quot;&gt;MarkMail&lt;/a&gt; showing the increase in &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi&lt;/a&gt; related posts on various mailing lists. No surprise that the most popular lists are &lt;a href=&quot;http://markmail.org/search/?q=osgi#query:osgi%20list%3Aorg.apache.felix.dev+page:1+state:facets&quot;&gt;Felix Dev&lt;/a&gt; and &lt;a href=&quot;http://markmail.org/search/?q=osgi#query:osgi%20list%3Acom.googlegroups.spring-osgi+page:1+state:facets&quot;&gt;Spring-OSGi&lt;/a&gt;. The traffic shows the rise in interest in OSGi the past couple of years. Again, no surprise. It does appear, however, that most of the posts are closely tied to development of OSGi products (like &lt;a href=&quot;http://felix.apache.org&quot;&gt;Felix&lt;/a&gt; and &lt;a href=&quot;http://springframework.org/osgi&quot;&gt;Spring dm&lt;/a&gt;) and not from developers leveraging OSGi within their applications. OSGi hasn&amp;#8217;t achieved deep enterprise penetration yet, and won&amp;#8217;t until we get support from product vendors along with better tooling.&lt;/p&gt;</description>
	<pubDate>Wed, 19 Nov 2008 14:39:07 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: The XO Laptop - Give 1, Get 1</title>
	<guid>http://techdistrict.kirkk.com/2008/11/18/the-xo-laptop-give-1-get-1/</guid>
	<link>http://techdistrict.kirkk.com/2008/11/18/the-xo-laptop-give-1-get-1/</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://laptop.org/en/&quot;&gt;OLPC&lt;/a&gt; has instituted their &amp;#8220;Give a laptop. Get a laptop.&amp;#8221; program again this year. If you&amp;#8217;re not familar with the &lt;a href=&quot;http://laptop.org/en/laptop/index.shtml&quot;&gt;XO laptop&lt;/a&gt;, it&amp;#8217;s a cool little deviced in a pretty small package. The picture at left shows the XO sitting next to a Dell XPS with a 15&amp;#8243; display (click to enlarge).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2008/11/xo.jpg&quot;&gt;&lt;img src=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2008/11/xo.jpg&quot; width=&quot;145&quot; height=&quot;110&quot; /&gt;&lt;/a&gt;The OLPC offered the same deal around the same time last year when I ordered mine, and their was quite a backlog. It took almost six months for them to ship, so if you&amp;#8217;re interested in getting your hands on the XO, it might be wise to place the order soon.&lt;/p&gt;
&lt;p&gt;You can order your XO through &lt;a href=&quot;http://www.amazon.com/xo&quot;&gt;Amazon&lt;/a&gt;. For $399, you give a laptop to a child in need, and also get your own laptop.&lt;/p&gt;</description>
	<pubDate>Tue, 18 Nov 2008 15:46:17 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi Progress</title>
	<guid>http://techdistrict.kirkk.com/2008/11/13/osgi-progress/</guid>
	<link>http://techdistrict.kirkk.com/2008/11/13/osgi-progress/</link>
	<description>&lt;p&gt;It&amp;#8217;s been a while since I&amp;#8217;ve posted. Since I joined &lt;a href=&quot;http://www.burtongroup.com&quot;&gt;Burton Group&lt;/a&gt;, I&amp;#8217;ve spent most of my time over on the &lt;a href=&quot;http://apsblog.burtongroup.com&quot;&gt;APS Blog&lt;/a&gt;. I hope to spend a bit more time here going forward. We&amp;#8217;ll see if I can pull it off. &lt;/p&gt;
&lt;p&gt;InfoQ recently posted a great snippet on the progress of &lt;a href=&quot;http://www.infoq.com/news/2008/11/osgi-in-the-enterprise&quot;&gt;OSGi in the Enterprise&lt;/a&gt;. The article mentions &lt;a href=&quot;http://www.springsource.com&quot;&gt;SpringSource&lt;/a&gt;, who is clearly paving the trail for OSGi in the Enterprise. While other app server vendors are using OSGi to modularize their platforms, they aren&amp;#8217;t exposing the capabilities of OSGi to developers. Eventually, they&amp;#8217;ll have to, but for now, they are not. That&amp;#8217;s too bad.&lt;/p&gt;
&lt;p&gt;If you take a step back and look at what SpringSource has done the last six months, it&amp;#8217;s significant. First came &lt;a href=&quot;http://springframework.org/osgi&quot;&gt;Spring Dynamic Modules&lt;/a&gt;, which I showed in a &lt;a href=&quot;http://techdistrict.kirkk.com/2008/05/06/osgi-spring/&quot;&gt;previous blog entry&lt;/a&gt;. Then &lt;a href=&quot;http://www.springsource.com/products/suite/applicationplatform&quot;&gt;SpringSource Application Platform&lt;/a&gt;. Then &lt;a href=&quot;http://www.springsource.com/products/suite/dmserver&quot;&gt;SpringSource dm Server&lt;/a&gt;. And now the &lt;a href=&quot;http://www.springsource.com/repository/app/&quot;&gt;SpringSource Enterprise Bundle Repository&lt;/a&gt;. Of all, it&amp;#8217;s the bundle repository that may be most important. While it&amp;#8217;s been possible for a while to develop OSGi bundles, the dearth of OSGi tools and third party frameworks packaged as OSGi bundles has been a barrier to entry for enterprise developers. The bundle repository made available by SpringSource has removed that barrier.&lt;/p&gt;
&lt;p&gt;While the InfoQ article offered a great synopsis of OSGi in the Enterprise, comparing OSGi to Maven is like comparing a Porsche to a Volkswagon. In other words, there is no comparison. OSGi wins hands down, and while offering the comparison might help explain modularization to those familiar with Maven but not with OSGi, it confuses and dilutes OSGi.&lt;/p&gt;
&lt;p&gt;InfoQ does sum it up well, though. &amp;quot;&amp;#8230;building dynamic, modular applications is where the industry is headed.&amp;quot; That&amp;#8217;s spot on. And as OSGi continues to penetrate the market, it means great things for the Java platform. &lt;/p&gt;</description>
	<pubDate>Thu, 13 Nov 2008 05:49:40 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi Survey Results</title>
	<guid>http://techdistrict.kirkk.com/2008/06/19/osgi-survey-results/</guid>
	<link>http://techdistrict.kirkk.com/2008/06/19/osgi-survey-results/</link>
	<description>&lt;p&gt;I&amp;#8217;ve published a summary of the OSGi survey results on the &lt;a href=&quot;http://apsblog.burtongroup.com/2008/06/osgi-survey-res.html&quot;&gt;APS blog&lt;/a&gt; at &lt;a href=&quot;http://www.burtongroup.com&quot;&gt;Burton Group&lt;/a&gt;. Definitely some interesting numbers. The highlights? &lt;strong&gt;80% said they&amp;#8217;ll be developing software using OSGi in the next 6 - 12 months&lt;/strong&gt;, and almost &lt;strong&gt;90% said they would today if their application server supported OSGi&lt;/strong&gt;. Those are some convincing numbers! The biggest hurdle to OSGi adoption within the enterprise? No surprise here - better enterprise vendor support, integrated toolsets, and more OSGi resources to help understand the benefits and usage patterns.&lt;/p&gt;
&lt;p&gt;There are more details to the survey that I&amp;#8217;ve yet to explore, and I&amp;#8217;ll try to share with everyone what I find after further crunching the numbers&lt;/p&gt;</description>
	<pubDate>Thu, 19 Jun 2008 14:51:17 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi Survey Deadline Extended</title>
	<guid>http://techdistrict.kirkk.com/2008/06/02/osgi-survey-deadline-extended/</guid>
	<link>http://techdistrict.kirkk.com/2008/06/02/osgi-survey-deadline-extended/</link>
	<description>&lt;p&gt;If you haven&amp;#8217;t taken the time to fill out the &lt;a href=&quot;http://www.surveymonkey.com/s.aspx?sm=hIxqFsf4LSnJUWZf1Kslyg_3d_3d&quot;&gt;OSGi survey&lt;/a&gt; yet, I have to encourage you to do so. The survey will remain live until  June 13th. Your feedback and help is greatly appreciated, and I hope to publish the results sometime in June or July&lt;/p&gt;</description>
	<pubDate>Mon, 02 Jun 2008 19:51:00 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi Survey</title>
	<guid>http://techdistrict.kirkk.com/2008/05/20/osgi-survey/</guid>
	<link>http://techdistrict.kirkk.com/2008/05/20/osgi-survey/</link>
	<description>&lt;p&gt;I&amp;#8217;ve created a simple &lt;a href=&quot;http://www.surveymonkey.com/s.aspx?sm=hIxqFsf4LSnJUWZf1Kslyg_3d_3d&quot;&gt;on-line survey&lt;/a&gt; to gauge interest in OSGi within the enterprise. I appreciate anyone who can spare a few moments to provide their input. I plan to leave the survey open until May 30th, 2008. At some point, I hope to share the results.&lt;/p&gt;</description>
	<pubDate>Tue, 20 May 2008 05:16:56 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi &amp; Spring</title>
	<guid>http://techdistrict.kirkk.com/2008/05/06/osgi-spring/</guid>
	<link>http://techdistrict.kirkk.com/2008/05/06/osgi-spring/</link>
	<description>&lt;p&gt;It&amp;#8217;s time to move on and show the simple elegance Spring brings to OSGi development using the HelloWorldSpec sample from the &lt;a href=&quot;http://techdistrict.kirkk.com/2008/04/24/osgi-modularity/&quot;&gt;OSGi &amp;amp; Modularity post&lt;/a&gt;. But first, a little primer on &lt;a href=&quot;http://www.springframework.org/osgi&quot;&gt;Spring Dynamic Modules&lt;/a&gt;. Spring DM is not an OSGi implementation. Instead, Spring DM aims to make working with OSGi easier just as Spring makes the world of Enterprise Java simpler. One of the more striking characteristics of Spring DM is that it removes most your code&amp;#8217;s dependencies on OSGi by taking care of the OSGi plumbing. To function in an OSGi runtime environment, the Spring .jars have been packaged as OSGi bundles.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-66&quot;&gt;&lt;/span&gt;The easiest way to show this is by expanding on the HelloWorldSpec sample from &lt;a href=&quot;http://techdistrict.kirkk.com/2008/04/24/osgi-modularity/&quot;&gt;my previous post&lt;/a&gt;. Reviewing the &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpec/client/src/com/extensiblejava/hello/client/HelloConsumer.java&quot;&gt;HelloConsumer &lt;/a&gt;and &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpec/service/src/com/extensiblejava/hello/service/impl/HelloServiceImpl.java&quot;&gt;HelloServiceImpl &lt;/a&gt;classes reveal that each are rather tightly coupled to the OSGi API. As we&amp;#8217;ll soon see, using Spring removes those dependencies, making the Spring edition of &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpecSpring/client/src/com/extensiblejava/hello/client/HelloConsumer.java&quot;&gt;HelloConsumer &lt;/a&gt;and &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpecSpring/service/src/com/extensiblejava/hello/service/impl/HelloServiceImpl.java&quot;&gt;HelloServiceImpl &lt;/a&gt;simple POJOs. Of course, the dependency on OSGi has to live somewhere, and for those familiar with Spring, we know it lives in the Spring configuration files.&lt;/p&gt;
&lt;p&gt;The Spring DM configuration files live in a META-INF/Spring directory, which you can see in &lt;a href=&quot;http://code.google.com/p/kcode/source/browse&quot;&gt;my Google Code Repository&lt;/a&gt; for the HelloWorldSpecSpring project. There are two files, and each are described below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpecSpring/service/META-INF/spring/helloservice.xml&quot;&gt;helloservice.xml&lt;/a&gt; - Defines the helloService bean.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpecSpring/service/META-INF/spring/helloservice-osgi.xml&quot;&gt;helloservice-osgi.xml&lt;/a&gt; - Exports the helloService bean as an OSGi service.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It isn&amp;#8217;t necessary to separate the configuration into two separate files. However, experienced Spring users typically separate configuration elements to making management and testing easier. In this case, the two configuration files allows me to test the helloService bean outside of the OSGi runtime.&lt;/p&gt;
&lt;p&gt;Since Spring is now managing the service within the Felix runtime, I have to install the necessary Spring bundles to Felix. As with the other examples, I&amp;#8217;ve done this for you within the HelloWorldSpecSpring project. Of course, when starting Felix, you can always create a new profile by entering a different profile name and install the bundles yourself. The bundles within the SpringLib directory are those I found were required to ensure the Spring DM modules resolvd correctly. If you do choose to create your own profile, it&amp;#8217;s likely you&amp;#8217;ll have to modify the &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorldSpecSpring/config.properties&quot;&gt;config.properties&lt;/a&gt; file to point to the location of your Felix runtime, which means you&amp;#8217;ll have to download Felix to get these bundles since I only include the Felix runtime in the HelloWorldSpecSpring distribution, not the bundles.  You won&amp;#8217;t have to do this if you use the HelloWorldSpecSpring profile because the bundles have already been installed.&lt;/p&gt;
&lt;p&gt;After installing the client.jar and service.jar, I should be able to perform the execute same start, stop, and install sequence described in my earlier post on OSGi &amp;amp; Modularity, and receive the exact same results. Except this time, Spring is managing the dependencies on the OSGi API and my classes remain simple POJOs. Spring&amp;#8217;s simple elegance helping yield a higher quality design with fewer dependencies on the OSGi API.&lt;/p&gt;</description>
	<pubDate>Tue, 06 May 2008 14:26:54 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Software Development Failure</title>
	<guid>http://techdistrict.kirkk.com/2008/05/01/software-development-failure/</guid>
	<link>http://techdistrict.kirkk.com/2008/05/01/software-development-failure/</link>
	<description>&lt;p&gt;&lt;span class=&quot;660474414-20032008&quot;&gt;Software failure statistics are abundant and  serve as clear evidence that we must reform software development. While industry  claims an IT labor shortage is the motivating force behind outsourcing, the  greatest factor is directly related to our inability to deliver value-add  software. As organizations continue to lose faith in IT as a trusted  partner, the services we offer are little more than an ample commodity, and the  search for cheaper labor will persist. But, there is &lt;a href=&quot;http://techdistrict.kirkk.com/?p=58&quot;&gt;no IT labor shortage&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-59&quot;&gt;&lt;/span&gt;&lt;span class=&quot;660474414-20032008&quot;&gt;We fail for many reasons. But mostly, it&amp;#8217;s  of our own accord. The original &lt;a href=&quot;http://www.cs.nmt.edu/%7Ecs328/reading/Standish.pdf&quot;&gt;CHAOS report&lt;/a&gt;,  published by &lt;a href=&quot;http://www.standishgroup.com/sample_research/index.php&quot;&gt;The Standish  Group&lt;/a&gt; in 1994, supports the claim that the primary impediment to successful  software delivery surrounds requirements. Since the publication of that report,  more evidence has emerged to support its findings: &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;660474414-20032008&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;35 percent of requirements change throughout the software lifecycle (Jones,  C. 1997. &lt;em&gt;Applied Software Measurement&lt;/em&gt;. McGraw Hill.)&lt;/li&gt;
&lt;li&gt;45 percent of delivered features are never used. (Johnson, J. 2002. Keynote  speech, XP 2002, Sardinia, Italy.)&lt;/li&gt;
&lt;li&gt;82 percent of projects cited incomplete and unstable requirements as the  number one reason for failure. (Thomas, M. 2001. &amp;#8220;IT Projects Sink or Swim.&amp;#8221;  &lt;em&gt;British Computer Society Review&lt;/em&gt;.)&lt;/li&gt;
&lt;li&gt;Large projects, those costing more than $10 million, are successful exactly  &lt;em&gt;zero&lt;/em&gt; (0) percent of the time. (Johnson, J. 1999. &amp;#8220;CHAOS Into Success.&amp;#8221;  &lt;em&gt;Software magazine&lt;/em&gt;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, many organizations attempt to rectify this situation by  applying traditional software development techniques that emphasize early  requirements elicitation and stabilization, followed by the other phases of the  SDLC excecute&lt;span class=&quot;660474414-20032008&quot;&gt;d&lt;/span&gt; serially. While a noble  goal, it is not possible to stabilize that which is inherently unstable.  Experience has also shown &lt;span class=&quot;660474414-20032008&quot;&gt;me &lt;/span&gt;that &lt;strong&gt;many  process improvement efforts result in little more than a varied manifestation of  the same flawed processes that have plagued the software industry for  decades&lt;/strong&gt;. &lt;span class=&quot;660474414-20032008&quot;&gt;Yes, I put that in bold type for a reason - in many cases, we attempt to solve the  problem using solutions that directly contribute to the problem.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Clearly,  to improve software delivery, a more nimble and adaptive approach is required. Returning value to IT requires shedding the flawed processes of  yesterday, and introducing methods that create greater alignment between IT and  business by promising incremental delivery of functional software. &lt;span class=&quot;660474414-20032008&quot;&gt;Obviously, you see where I&amp;#8217;m going with this, but the  details will have to wait for another day. Instead, I want to point out some  alarming failure statistics.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;span class=&quot;660474414-20032008&quot;&gt;&lt;/span&gt;&lt;/ul&gt;
&lt;li&gt;After five years and $26 million dollars, the &lt;a href=&quot;http://www.wisconsin.edu/&quot;&gt;University of Wisconsin System&lt;/a&gt; discontinued  implementation of a system-wide payroll and benefit initiative.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://www.dwd.state.wi.us/&quot;&gt;Department of Workforce  Development&lt;/a&gt; recently canceled the EnABLES project. Overall, $23.6 million  was spent on the project, including approximately $10 million on the phase II  appeals system that was never completed.&lt;/li&gt;
&lt;li&gt;Wisconsin is attempting to recover $2.1 million after a failed &lt;a href=&quot;http://www.oracle.com/&quot;&gt;Oracle&lt;/a&gt;-based e-mail installation.&lt;/li&gt;
&lt;li&gt;In 2005, after spending more than $170 million, the &lt;a href=&quot;http://www.fbi.gov/&quot;&gt;FBI&lt;/a&gt; canceled development of it&amp;#8217;s Virtual Case  File (VCF) without deploying it.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://spectrum.ieee.org/sep05/1685/failt1&quot;&gt;Software Hall of Shame&lt;/a&gt; shows other startling statistics.&lt;/li&gt;

&lt;p&gt;I can promise &lt;span class=&quot;660474414-20032008&quot;&gt;there are &lt;/span&gt;many  other &lt;span class=&quot;660474414-20032008&quot;&gt;examples of failure &lt;/span&gt;with equally  staggering numbers. Why do we fail? In the case of the VCF, failure was the  direct result of poorly defined and evolving requirements and overly ambitious  schedules.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;660474414-20032008&quot;&gt;Obviously, our current approach is not  working. In an era where IT services are viewed as an easily obtainable  commodity, the onus is on IT to earn back the trust of our business partners. To  do so requires a more adaptable and nimble approach to software delivery that  results in more innovative use of technology. I&amp;#8217;m a firm believer that increased  development agility is the fundamental element in software development  reform.&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 01 May 2008 03:46:19 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: OSGi &amp; Modularity</title>
	<guid>http://techdistrict.kirkk.com/2008/04/24/osgi-modularity/</guid>
	<link>http://techdistrict.kirkk.com/2008/04/24/osgi-modularity/</link>
	<description>&lt;p&gt;The .jar file has always been a great unit of modularity on the Java platform. Unfortunately, it also comes with the classpath baggage, and .jar files were never treated as first class components. &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi &lt;/a&gt;is the next generation component platform that will bring greater modularity to the Java platform. In &lt;a href=&quot;http://techdistrict.kirkk.com/2008/04/17/simple-osgi-service/&quot;&gt;my previous blog&lt;/a&gt;, I showed the simplest OSGi components imaginable. Now I want to expand on that slightly by introducing a third component that exposes a key architectural and design benefit enabled by OSGi.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-64&quot;&gt;&lt;/span&gt;A classic design statement in the GOF book states that we should &lt;strong&gt;&lt;em&gt;separate interface from implementation&lt;/em&gt;&lt;/strong&gt;. Java provides first class support for this heuristic through it&amp;#8217;s use of interfaces, and we use it all the time. We know it&amp;#8217;s good design.  But another important design heuristic less often used states that &lt;strong&gt;&lt;em&gt;interfaces should be placed separate from the classes that implement them&lt;/em&gt;&lt;/strong&gt;. By placed, I mean the modules containing those interfaces. The result is subtle, yet has an important impact on design quality. The HelloWorld example serves as a good illustration.&lt;/p&gt;
&lt;p&gt;The HelloService interface is the specification implemented by the HelloServiceImpl. It decouples HelloClient from the implementation, and adheres to the GOF heuristic of separating interface from implementation. But bundling the interface in the same component as the implementation compromises design quality, and is the basis for the modularity heuristic above.  Why? Because while I can still gain extensibility through new implementations of the interface, I lose flexibility in how I manage the implementations if the interface and implementation are deployed in the same component. For instance, in &lt;a href=&quot;http://techdistrict.kirkk.com/2008/04/17/simple-osgi-service/&quot;&gt;my previous example&lt;/a&gt; where the interface and implementation are deployed in service.jar, I don&amp;#8217;t have the ability to dynamically replace the existing implementation with another because I can&amp;#8217;t remove the implementation from the OSGi run-time if the interface and implementation are deployed together.&lt;/p&gt;
&lt;p&gt;But if I move the interface to a separate bundle, call it spec.jar, while leaving the implementation in service.jar, I do have the ability to swap implementations at run-time when using OSGi. In &lt;a href=&quot;http://code.google.com/p/kcode/source/browse&quot;&gt;my Google Code repository&lt;/a&gt; exists the HelloWorldSpec project. There are four bundles - client.jar, spec.jar, service.jar, and service2.jar. Still a pretty simple example, but it illustrates the key design heuristic.&lt;/p&gt;
&lt;p&gt;In my initial deployment to &lt;a href=&quot;http://felix.apache.org&quot;&gt;Felix&lt;/a&gt;, I install client.jar, spec.jar, and service.jar.  The results are the same as in my previous blog entry. But now, if I deploy and start service2.jar, stop service.jar, and stop client.jar, the OSGi run-time has managed to dynamically adapt to the changing conditions and discovers the service2.jar implementation of HelloWorldService. To experiment for yourself, do something like the folllowing after checking out the project from Google Code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build all four projects using ant build.all from the HelloWorldSpec root directory.&lt;/li&gt;
&lt;li&gt;Start felix (you may have to modify the script  - .bat or .sh - to find the felix.jar).&lt;/li&gt;
&lt;li&gt;Use HelloWorldSpec as the profile if you want to use the bundles already installed, or create your own profile if you want to install them yourself.&lt;/li&gt;
&lt;li&gt;If you used HelloWorldSpec as the profile, uninstall the service2.jar bundle. If you created your own profile, install spec.jar, service.jar and client.jar.&lt;/li&gt;
&lt;li&gt;Stop client.jar and notice the message. Start client.jar back up.&lt;/li&gt;
&lt;li&gt;Install and start service2.jar&lt;/li&gt;
&lt;li&gt;Stop service.jar.&lt;/li&gt;
&lt;li&gt;Stop client.jar again. Notice the message. Cool - an environment adaptable to changing conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As OSGi adoption continues, a new set of design principles are going to emerge surrounding modularity. I show but one example here of the benefit of placing interface in a module separate from implementation. An example of another important design principle enabled by OSGi is a &lt;a href=&quot;http://martinfowler.com/bliki/PublishedInterface.html&quot;&gt;PublishedInterface&lt;/a&gt; - public classes in a bundle&amp;#8217;s exported packages. Something not supported by the JVM, but enabled by OSGi. In fact, I&amp;#8217;ve long been an advocate of the .jar as a first class Java component, and some time ago launched &lt;a href=&quot;http://www.extensiblejava.com&quot;&gt;Extensible Java&lt;/a&gt; to capture many of these modularity patterns. It&amp;#8217;s also why I created &lt;a href=&quot;http://www.kirkk.com/main/Main/JarAnalyzer&quot;&gt;JarAnalyzer&lt;/a&gt;. It&amp;#8217;s time I revisit those ideas.&lt;/p&gt;</description>
	<pubDate>Thu, 24 Apr 2008 21:36:29 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Simple OSGi Service</title>
	<guid>http://techdistrict.kirkk.com/2008/04/17/simple-osgi-service/</guid>
	<link>http://techdistrict.kirkk.com/2008/04/17/simple-osgi-service/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;Lately, I&amp;#8217;ve been  experimenting more with &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi&lt;/a&gt;, and I want to share some of the examples I&amp;#8217;ve put  together. The examples involve &lt;a href=&quot;http://felix.apache.org/site/index.html&quot;&gt;Felix&lt;/a&gt;, &lt;a href=&quot;http://www.springframework.org/osgi&quot;&gt;Spring Dynamic Modules&lt;/a&gt;, and &lt;a href=&quot;http://www.mortbay.org/&quot;&gt;Jetty&lt;/a&gt;, though  could easily be used with &lt;a href=&quot;http://www.eclipse.org/equinox/&quot;&gt;Equinox&lt;/a&gt;. Once I&amp;#8217;m finished with these exercises, I&amp;#8217;m  hoping to compare and contrast the different approaches I&amp;#8217;ve taken, as well as  comparing embedded Jetty with the &lt;a href=&quot;http://www.eclipse.org/equinox/server/&quot;&gt;Equinox Servlet Bridge&lt;/a&gt;. I&amp;#8217;m a believer that  OSGi is a disruptive technology that stands to transform Java development as we  know it today.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-63&quot;&gt;&lt;/span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;There are numerous  OSGi tutorials, blogs, and samples posted around the web. My &lt;a href=&quot;http://techdistrict.kirkk.com/2007/10/17/enterprise-osgi/&quot;&gt;OSGi resources page&lt;/a&gt;  lists some of these, and if you know of other good resources not listed, please  let me know. &lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;When I experiment with a new technology, I like to  focus exclusively on the technology itself, without code generators, wizards, or  other utilities that do half the work for me. I feel it maximizes the  experience. To that end, all of my exercises avoid using tools like Maven or  Eclipse. I find Maven confusing and using Eclipse for some of these smaller  exercises is overkill. Save for a few necessary tools like Ant and the Felix  framework itself, I&amp;#8217;ll roll everything by hand. Hopefully, this helps clarify  the core essence of OSGi.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;The first sample is  the canonical HelloWorld example where I create two simple bundles - a  client.jar and service.jar. Again, in OSGi parlance, a bundle is a .jar file.  You can find the working code in &lt;a href=&quot;http://code.google.com/p/kcode/&quot;&gt;My Google Code repository&lt;/a&gt; (the  HelloWorld project), complete with the Ant build script, the bundle cache, and  a .bat or .sh script to start Felix depending on your OS. The only two  prerequisites for these samples is Felix (I used version 1.0.0) and Ant, which  you&amp;#8217;ll have to download separately. Let&amp;#8217;s walk through the creation of these two  simple bundles.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;First, let&amp;#8217;s look at  &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorld/client/src/com/extensiblejava/hello/client/HelloConsumer.java&quot;&gt;HelloConsumer &lt;/a&gt;in client.jar. HelloConsumer uses the HelloService to get the  hello and goodbye messages when the client.jar bundle is started and stopped,  respectively. HelloConsumer implements OSGi&amp;#8217;s BundleActivator, meaning Felix  will invoke the start method when the bundle is started, and the stop method  when the bundle is stopped. As seen on line 26, HelloConsumer obtains a  reference to the HelloService using the OSGi ServiceTracker class.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;The &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorld/service/src/com/extensiblejava/hello/service/HelloService.java&quot;&gt;HelloService &lt;/a&gt;and &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorld/service/src/com/extensiblejava/hello/service/impl/HelloServiceImpl.java&quot;&gt;HelloServiceImpl  &lt;/a&gt;form the OSGi service. HelloService is a simple Java interface that defines the  API, while HelloServiceImpl implements the BundleActivator and is the class  invoked when the server bundle is started and stopped. As seen on line 18,  HelloServiceImpl registers itself as an OSGi service. Without registration,  HelloConsumer would not be able to use HelloService as an OSGi  service.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;There&amp;#8217;s a bit more  magic here that makes this all work. &lt;span class=&quot;898282413-25032008&quot;&gt;A wonderful  aspect of OSGi is that dependencies must be managed explicitly, with each  bundle&amp;#8217;s manifest declaring the packages the bundle imports and exports.  Bundle  manifests specify other key pieces of information, too. Notably, it tells the  OSGi environment of the BundleActivator to invoke on start and stop. If a bundle  imports a package, then another bundle within that OSGi run-time must export  that same package. The &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorld/client/META-INF/Manifest.mf&quot;&gt;client bundle manifest&lt;/a&gt;  imports the package containing HelloService while the &lt;a href=&quot;http://code.google.com/p/kcode/source/browse/trunk/osgi/HelloWorld/service/META-INF/Manifest.mf&quot;&gt;service bundle manifest&lt;/a&gt;  exports that same package. Were these imports and exports not explicitly  declared, we&amp;#8217;d receive OSGi run-time errors. In our example above,  &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;HelloServiceImpl registers itself as an OSGi service  allowing clients to obtain a reference to HelloService using the OSGi  ServiceTracker. &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;The client and  service OSGi bundles can be deployed to any OSGi run-time. I&amp;#8217;ve used Felix for  this example, but could have used Equinox just as easily. To run these examples,  you can checkout the code from the Google Code repository. Since I include the  bundle cache in the repository, you should be able to start felix and experiment  with OSGi. You&amp;#8217;ll likely have to modify the start script (OS-based) to ensure  Felix is in your classpath. Upon starting Felix, you&amp;#8217;ll be asked to enter a  profile name. To use the bundle cache included with the example, simply use  HelloWorld as your profile.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;If you&amp;#8217;re feeling a  bit more adventurous, you can make some changes to the HelloServiceImpl message  and rebuild the project by invoking the Ant build script. Once compiled, move  back into the Felix shell and update the service bundle using the Felix update  command. For a listing of all Felix commands, simply type &amp;#8216;help&amp;#8217;.  &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;If you want to  deploy the bundles to your own Felix cache, restart Felix and enter a different  profile name. Any name will do, and Felix will create a new bundle cache for  you. Here are some more suggested steps to build, install, and continue  experimenting with the bundles and OSGi:&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Build service by  executing ant within service directory&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt; Build client by executing ant  within client directory&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;Run startfelix.bat or startfelix.sh depending on  your OS&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;install the bundles from the felix shell&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;install  file:service/bin/service.jar&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;install  file:client/bin/client.jar&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;ps&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;start  {service-bundle-id}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;start {client-bundle-id}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt; Experiment by  starting and stopping client and service to get a feel for OSGi.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;Now  change the service message printed in HelloServiceImpl.java and compile. Then do  the following while client is running.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;stop  {service-bundle-id}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;update {service-bundle-id}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;start  {service-bundle-id}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;stop {client-bundle-id}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt; When stopping the  client bundle, you should see a different goodbye message than what you saw in  step 4.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;&lt;/span&gt;&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;898282413-25032008&quot;&gt;OSGi offers a very  dynamic and adaptable run-time environment. Even when not using OSGi services,  reuse across bundles can occur so long as the package dependencies are  explicitly managed in the bundle manifests. The benefit with OSGi services is  that the OSGi run-time manages the service lifecycle, however. Many of the  presentations I give on architecture &amp;amp; design talk about the importance of  managing .jar relationships, and I&amp;#8217;ve long felt that the .jar file is a great  candidate as a first class component on the Java platform. In the next post,  I&amp;#8217;ll explore the simple benefits of an incredibly important heuristic that  states we should &amp;#8220;separate interface from implementation.&amp;#8221; You can get a head  start by taking a look at the HelloWorldSpec project on &lt;a href=&quot;http://code.google.com/p/kcode/&quot;&gt;My Google Code  repository&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 17 Apr 2008 20:55:39 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: The H-1B Fraud</title>
	<guid>http://techdistrict.kirkk.com/2008/04/03/the-h-1b-fraud/</guid>
	<link>http://techdistrict.kirkk.com/2008/04/03/the-h-1b-fraud/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;304500019-26032008&quot;&gt;Some of you may have  seen &lt;a href=&quot;http://www.youtube.com/watch?v=TCbFEgFajGU&quot;&gt;this video&lt;/a&gt; explaining the placement of phony job ads that are subsequently  used to prove to the Department of Labor that there is an IT labor shortage.  Lou Dobbs also got in on the mix as shown in this &lt;a href=&quot;http://www.youtube.com/watch?v=lL_fTICwFCA&amp;amp;NR=1&quot;&gt;YouTube video&lt;/a&gt;, or take a look at the &lt;a href=&quot;http://transcripts.cnn.com/TRANSCRIPTS/0704/03/ldt.01.html&quot;&gt;transcript&lt;/a&gt;. This ammunition is used to secure green cards for H-1B Visa workers. It&amp;#8217;s  repulsive. Bottom line - there is &lt;a href=&quot;http://techdistrict.kirkk.com/2008/03/27/it-labor-shortage-myth/&quot;&gt;no IT labor shortage&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;304500019-26032008&quot;&gt;Here are some more numbers from the Dobbs video. Universities are pumping out over 300,000 bachelors, masters, or PhD degrees annually in computer or information science, math, and engineering. The Department of Labor predicts the average yearly job creation in those fields to be 120,000 jobs.  &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;304500019-26032008&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;304500019-26032008&quot;&gt;I&amp;#8217;m a believer in  competition, but it must be fair. &lt;a href=&quot;http://www.workpermit.com/news/2005_10_26/us/us_h1b_visa_holders_earn_less.htm&quot;&gt;Data suggests&lt;/a&gt; that on average, H-1B Visa Holders are paid between $12,500 and $20,000 less  than their American counterparts. I&amp;#8217;m not anti-H-1B. I&amp;#8217;ve worked with a large  share of very good developers who were H-1B visa holders. Unfortunately, the  H-1B visa program is being used to replace the jobs of U.S. IT professionals  with cheaper labor.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;304500019-26032008&quot;&gt;A two pronged approach is required to fix the problem and  requires a professional code of conduct between employees and employers. The  result is a win-win-win situation for all involved. First, we need not eliminate  or minimize the H-1B visa program, but instead must bring the salaries of visa  holders up to levels equal to that of their American peers. Second, we must  reform IT through incremental delivery of quality software. Until these happen,  U.S. citizens will continue to suffer job loss due to anti-competitive and  fraudulent practices.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 03 Apr 2008 13:29:36 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: IT Labor Shortage Myth</title>
	<guid>http://techdistrict.kirkk.com/2008/03/27/it-labor-shortage-myth/</guid>
	<link>http://techdistrict.kirkk.com/2008/03/27/it-labor-shortage-myth/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;270553813-19032008&quot;&gt;There is no IT labor  shortage in the U.S. There is no dearth of software developers. Instead, this shortage is reinforced through repetitious  pronouncements by industry of the impending labor crisis, and is used  as outsourcing ammunition. In reality, organizations outsource because of two  simple and related factors:&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;270553813-19032008&quot;&gt;Business believes IT  costs are too high and by outsourcing IT labor, cost is  reduced.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;270553813-19032008&quot;&gt;IT doesn&amp;#8217;t deliver  value-add business software.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;270553813-19032008&quot;&gt;&lt;/span&gt;&lt;/font&gt; &lt;a href=&quot;http://techdistrict.kirkk.com/2008/03/27/it-labor-shortage-myth/#more-58&quot; class=&quot;more-link&quot;&gt;(more&amp;#8230;)&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 27 Mar 2008 04:38:22 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: New Job New Skin</title>
	<guid>http://techdistrict.kirkk.com/2008/03/25/new-job-new-skin/</guid>
	<link>http://techdistrict.kirkk.com/2008/03/25/new-job-new-skin/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;781590016-20032008&quot;&gt;March 31st marks  my first day as an Analyst with &lt;a href=&quot;http://www.burtongroup.com&quot;&gt;Burton Group&lt;/a&gt; working in the &lt;a href=&quot;http://www.burtongroup.com/Research/Default.aspx&quot;&gt;Application Platform  Strategies&lt;/a&gt; group. To an extent, this is a career change for me. Since I&amp;#8217;ve been  in IT, I&amp;#8217;ve worked exclusively on enterprise development projects. Over the  years, I&amp;#8217;ve played most roles on the software development team, but my favorite  has always been as the guy who gets his hands dirty writing code. Through  writing and speaking, I&amp;#8217;ve enjoyed sharing these experiences with others. To  this point, however, any writing or speaking I&amp;#8217;ve done has always been an  extracurricular activity, making it feel like I&amp;#8217;ve always had two jobs instead  of one.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;781590016-20032008&quot;&gt;My role as an  analyst means I&amp;#8217;m no longer a software developer working in the trenches. The  reality over the past couple years is that I was working less in the trenches  anyway. As I continued to shape and express my software development beliefs, I  also began to gravitate more toward leadership roles, though not always  intentionally. Whereas I once coded all day every day, I now code only a few  hours each week. Instead, I spend more time mentoring developers, evaluating  emerging technologies, and guiding teams through the process improvement  quagmire. But yes, through it all, I still code even if it&amp;#8217;s of my own  accord.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;781590016-20032008&quot;&gt;My new role offers  some exciting opportunities. Foremost, I&amp;#8217;ll be working for a great organization with a stellar reputation. I also feel I have a single job that that combines my passion of technology, software development, and software  process with that of my desire to learn and teach. I&amp;#8217;m excited for what lies  ahead, knowing that I must be careful to remember the important real world  lessons I&amp;#8217;ve learned. I intend to continue writing code, hopefully experimenting  with new languages, platforms, and tools. I look forward to working with new  organizations, and meeting new people.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;781590016-20032008&quot;&gt;Since I&amp;#8217;m moving  onto what feels like a career change, I&amp;#8217;ve also decided to update my web sites (Yes, I love to hack!).  First in queue is this blog, which now has a new skin. I&amp;#8217;ll also be moving  content away from &lt;a href=&quot;http://www.kirkk.com&quot;&gt;my home page&lt;/a&gt; and onto this blog. Eventually, the code I  write will reside on &lt;a href=&quot;http://code.google.com/&quot;&gt;Google Code&lt;/a&gt;. Probably other presently unforeseen changes  too. I&amp;#8217;m excited about what lies ahead, and my expectations are high.  &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 25 Mar 2008 04:31:10 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: The Agile Roadmap</title>
	<guid>http://techdistrict.kirkk.com/2008/03/12/the-agile-roadmap/</guid>
	<link>http://techdistrict.kirkk.com/2008/03/12/the-agile-roadmap/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://www.agilejournal.com/images/stories/articles2/march-08-roadmapwide.jpg&quot; /&gt;For the past two years, I&amp;#8217;ve been writing &lt;a href=&quot;http://www.agilejournal.com/c/the-agile-developer.html&quot;&gt;The Agile Developer&lt;/a&gt; column at &lt;a href=&quot;http://www.agilejournal.com&quot;&gt;Agile Journa&lt;/a&gt;&lt;a href=&quot;http://www.agilejournal.com&quot;&gt;l&lt;/a&gt;. Most of the articles are small focused pieces that share my experience with a specific agile practice. This month&amp;#8217;s theme is sharing agile successes, so I took the opportunity to traverse back through many of my previous articles and discuss how each of these practices fit into a more complete agile development approach. &lt;a href=&quot;http://www.agilejournal.com/articles/the-agile-developer/the-agile-roadmap.html&quot;&gt;The Agile Roadmap&lt;/a&gt; can serve as a launching pad for those teams new to agile, or as a gap filler for struggling teams.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure there are some omissions and gaps in coverage - some I know of, others I may not.  If you feel strongly about a practice or technique not mentioned in the article, please comment.&lt;/p&gt;</description>
	<pubDate>Wed, 12 Mar 2008 15:40:08 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Code Quality’s Singular Metric</title>
	<guid>http://techdistrict.kirkk.com/2008/02/14/code-qualitys-singular-metric/</guid>
	<link>http://techdistrict.kirkk.com/2008/02/14/code-qualitys-singular-metric/</link>
	<description>&lt;p&gt;I wonder if &lt;a href=&quot;http://testearly.com/2007/09/26/code-qualitys-singular-metric/&quot;&gt;Andy&lt;/a&gt; has seen this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.osnews.com/images/comics/wtfm.jpg&quot; height=&quot;471&quot; width=&quot;500&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 14 Feb 2008 14:24:31 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Agile Journal</title>
	<guid>http://techdistrict.kirkk.com/2008/01/30/agile-journal/</guid>
	<link>http://techdistrict.kirkk.com/2008/01/30/agile-journal/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;159450221-29012008&quot;&gt;Since it&amp;#8217;s inception  almost two years ago, I&amp;#8217;ve been writing the &lt;a href=&quot;http://www.agilejournal.com/c/the-agile-developer.html&quot;&gt;Agile Developer column&lt;/a&gt; for the &lt;a href=&quot;http://www.agilejournal.com&quot;&gt;Agile  Journal&lt;/a&gt;. Shortly thereafter, I started the &lt;a href=&quot;http://www.agilejournal.com/c/agile-junction.html&quot;&gt;Agile Junction&lt;/a&gt; blog. While I&amp;#8217;ve continued  to write the column, I haven&amp;#8217;t posted a blog entry in damn near a year. In my  new role as Online Editor over at Agile Journal, I&amp;#8217;ll be turning my attention  toward managing all types of on-line content. Hopefully, that means more  blogging, but it definitely means more activity surrounding other forms of  on-line content. Thankfully, Liz will still be serving as Editor-In-Chief of the  Agile Journal monthly publication. In the next few months, there are going to  be some exciting changes taking place at Agile Journal. Be sure to check it  out.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 30 Jan 2008 22:26:57 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Eat your own Dogfood</title>
	<guid>http://techdistrict.kirkk.com/2008/01/18/eat-your-own-dogfood/</guid>
	<link>http://techdistrict.kirkk.com/2008/01/18/eat-your-own-dogfood/</link>
	<description>&lt;p&gt;&lt;span class=&quot;633115821-08012008&quot;&gt;&lt;font size=&quot;2&quot;&gt;Quite a few moons  ago, I interviewed a gentleman working for a CASE tool vendor. They had just  shutdown one of their development shops, and employees had two choices. Find  another job, or be relocated. This chap decided to go searching, and our paths  crossed. It didn&amp;#8217;t take long for me to get way off track with my questions, and  eventually I point-blank asked him if they used their own CASE tool on internal  development projects. He said &amp;#8220;no&amp;#8221;, and then nervously suggested that we get the  interview back on track. I can&amp;#8217;t recall if we ended up hiring the guy, but that  interview left an indelible impression and taught an important lesson. If the  guy who developed the software doesn&amp;#8217;t use it, then you shouldn&amp;#8217;t use it. How  many open source projects do you think are created where the authors have never  used the tool or framework? I&amp;#8217;m guessing very few. How many product companies  develop products that they don&amp;#8217;t use internally? I&amp;#8217;m guessing quite a  few.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;633115821-08012008&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;633115821-08012008&quot;&gt;&lt;font size=&quot;2&quot;&gt;It&amp;#8217;s a pretty simple  question to ask the next tool vendor trying to sell you their product. If they  say yes, then ask them what they like and dislike about the tool. Their honesty  is apparent.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 18 Jan 2008 17:58:19 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Fluff Season Kick-Off</title>
	<guid>http://techdistrict.kirkk.com/2008/01/11/fluff-season-kick-off/</guid>
	<link>http://techdistrict.kirkk.com/2008/01/11/fluff-season-kick-off/</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://www.nofluffjuststuff.com/conference/milwaukee/2008/02/index.html&quot;&gt;Greater Wisconsin Software Symposium&lt;/a&gt; marks the kick-off of the 2008 No Fluff Just Stuff Software Symposiums. The &lt;a href=&quot;http://www.nofluffjuststuff.com/conference/milwaukee/2008/02/schedule.html&quot;&gt;session schedule&lt;/a&gt; looks amazing. Traditional sessions on good ole J2EE are still aplenty, but there is also a lot of exciting content surrounding Groovy and Grails, DSLs, Ruby and Rails, Ajax, and agile development that keep things out there on the edge. I&amp;#8217;d encourage everyone to attend Sunday&amp;#8217;s session on OSGi, which arguably is the most important technology you&amp;#8217;ve never heard of - &lt;a href=&quot;http://www.sdtimes.com/article/story-20070601-27.html&quot;&gt;possibly even technology of the decade&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And after a couple months off the tour, you can rest assured that their will be a special energy brought to the conference as it kicks off this year&amp;#8217;s tour. Be sure to check it out.&lt;/p&gt;</description>
	<pubDate>Fri, 11 Jan 2008 19:46:06 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Importance of Continuous Integration</title>
	<guid>http://techdistrict.kirkk.com/2007/12/28/importance-of-continuous-integration/</guid>
	<link>http://techdistrict.kirkk.com/2007/12/28/importance-of-continuous-integration/</link>
	<description>&lt;p&gt;&lt;span class=&quot;199492818-28122007&quot;&gt;&lt;font size=&quot;2&quot;&gt;I encountered an  incredibly interesting situation recently that clearly illustrates the  importance of Continuous Integration. Two separate teams were each working on  separate software modules. Eventually, these teams knew they&amp;#8217;d need to integrate  the two modules into a larger whole. Unfortunately, communication wasn&amp;#8217;t that  great between the two teams, and while they each had a robust suite of unit  tests (they created stubs when testing the integration points between each  other), and regularly tested their individual components, they did not ever test  them together. Finally, the day came (late in the project, mind you), when the  two teams needed to integrate. In fact, integration even went fairly well, with  the two modules able to communicate between each other without many problems.  Integration testing revealed something alarming, however. A major piece of  functionality was missing. Each team thought the other was providing that  behavior. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;199492818-28122007&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;199492818-28122007&quot;&gt;&lt;font size=&quot;2&quot;&gt;The moral of the  story, of course, is that had these separate teams been focused on integrating  their two components early and often, this problem would have been discovered  much earlier in the development lifecycle. But working in silos is easy and  integration is hard. By creating a false sense of progress by avoiding  integration until late in the lifecycle, they jeopardized the  project.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 28 Dec 2007 18:42:20 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: SpamBots Getting Through</title>
	<guid>http://techdistrict.kirkk.com/2007/12/06/spambots-getting-through/</guid>
	<link>http://techdistrict.kirkk.com/2007/12/06/spambots-getting-through/</link>
	<description>&lt;p&gt;I use WordPress as my blogging system, and a while back, I installed the &lt;a href=&quot;http://lordchaos.dominatus.net/wordpress-plugin-challenge&quot;&gt;Challenge Captcha&lt;/a&gt;. But recently the SpamBots broke it and have been able to find the correct answer to the math questions. As a result, they&amp;#8217;ve been leaving their nasty comments. So, I&amp;#8217;ve reconfigured the Challenge to ask the question in a more English style. I guess it&amp;#8217;s pretty easy for the SpamBots to evaluate &amp;#8220;3 x 4 + 2&amp;#8243;. But now we&amp;#8217;ll see how easy it is for them to evaluate &amp;#8220;What is the sum of 2 and 4&amp;#8243;.&lt;/p&gt;
&lt;p&gt;I really don&amp;#8217;t know who has the time or energy to waste on such things. And I don&amp;#8217;t know what they are trying to accomplish other than being a nuisance.&lt;/p&gt;</description>
	<pubDate>Thu, 06 Dec 2007 00:36:45 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Agile 2008</title>
	<guid>http://techdistrict.kirkk.com/2007/12/05/agile-2008/</guid>
	<link>http://techdistrict.kirkk.com/2007/12/05/agile-2008/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.agile2008.org&quot;&gt;Agile 2008&lt;/a&gt;, being held in Toronto August 4 to 8, seems like a long ways away. However, the &lt;a href=&quot;http://submissions.agile2008.org/&quot;&gt;submission system&lt;/a&gt; just went live this week. I&amp;#8217;m excited because I have the opportunity to help organize the &lt;a href=&quot;http://www.agile2008.org/stage-developers.html&quot;&gt;Developer Jam stage&lt;/a&gt;. There are a few changes surrounding the conference for 2008, starting with the submission system, which is wide open to the public. Any session proposed can be reviewed by any registered user, so hopefully we&amp;#8217;ll build some great sessions with the level of community involvement we hope to achieve. Because the conference has been a sell-out the past few years, we&amp;#8217;ve also secured a venue in Toronto that can host up to 1600+ individuals.&lt;/p&gt;
&lt;p&gt;But what&amp;#8217;s most exciting for me is the return of agile in the trenches&amp;#8230;getting down and dirty with the developer again. &lt;a href=&quot;http://techdistrict.kirkk.com/2007/08/23/agile-2007-recap/&quot;&gt;My main issue&lt;/a&gt; with last years conference was that it seemed to have forgotten about the developer. There was so much &amp;#8220;agile in the enterprise this&amp;#8221;, and &amp;#8220;application lifecycle management that&amp;#8221;. So I&amp;#8217;m very excited to help build a track (we&amp;#8217;re calling them stages) that focuses exclusively on the developer. I know we can all still stand to learn more about unit testing, continuous integration, refactoring, and more. Please, take a look at the Developer Jam, submit a proposal or two, and provide some constructive feedback. We&amp;#8217;ve assembled a great review committee consisting of some outstanding professional developers (listed at the bottom of the &lt;a href=&quot;http://www.agile2008.org/stage-developers.html&quot;&gt;Developer Jam page&lt;/a&gt;). Let us know what you think would be cool to incorporate into the Developer Jam stage at Agile 2008.&lt;/p&gt;</description>
	<pubDate>Wed, 05 Dec 2007 05:30:47 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Crap4J - Alarming EULA</title>
	<guid>http://techdistrict.kirkk.com/2007/11/02/crap4j-alarming-eula/</guid>
	<link>http://techdistrict.kirkk.com/2007/11/02/crap4j-alarming-eula/</link>
	<description>&lt;p&gt;&lt;em&gt;Updated (11/02/07) : Please note the responses from Alberto and Bob attached to this post. They&amp;#8217;ve offered some assurance that Crap4J does not transmit any code to their servers, and that the licensing snafu was due to a simple oversight. They also resolve to correct the licensing agreements. Thank you, Alberto and Bob! : End Update &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I went to install the &lt;a href=&quot;http://www.crap4j.org&quot;&gt;Crap4J&lt;/a&gt; Eclipse plug-in. As part of this plug-in, there are four separate features, and I happened to actually read the license agreement for each of them. In a nutshell, for three of the features (Agitair JUnit Runner, Agitair JUnit4 Suport, and Public API for Generated Tests), the license agreement states that the software is experimental and primarily for academic, research, and open source use. But that&amp;#8217;s not the alarming part. It also says that it transmits your code over the open internet to be analyzed on non-secure Agitair computers shared by multiple users. Here&amp;#8217;s the exact text:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;THIS SOFTWARE IS INTENDED PRIMARILY FOR ACADEMIC, RESEARCH, AND OPEN SOURCE&lt;br /&gt;
USE.  WHILE COMMERCIAL USE IS ALLOWED, PLEASE BE AWARE THAT YOUR CODE&lt;br /&gt;
IS TRANSMITTED OVER THE OPEN INTERNET AND ANALYZED ON NON-SECURE&lt;br /&gt;
COMPUTERS SHARED BY MULTIPLE USERS.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I don&amp;#8217;t like that much, and it seems a bit sneaky to hide that rather important note in a license agreement that I doubt many folks read. There should be a more noticeable disclaimer somewhere. Also, I found no such notice in the Ant Task distribution (in fact, couldn&amp;#8217;t find a license agreement included at all). But that&amp;#8217;s not saying the Ant Task does or does not transmit your code.&lt;br /&gt;
I don&amp;#8217;t know the internal behavior of Crap4J. Maybe it doesn&amp;#8217;t send your code anywhere. But the license agreement indicates that Crap4J does, or at the very least, that they have the right to do so. Maybe, giving them the benefit of the doubt,  they didn&amp;#8217;t fully review the license agreement, and aren&amp;#8217;t aware of what it says. Either way, the fact that this important note is buried within a license agreement without any other public disclaimer is very alarming and deceiving.&lt;/p&gt;</description>
	<pubDate>Fri, 02 Nov 2007 03:19:09 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Big Software</title>
	<guid>http://techdistrict.kirkk.com/2007/10/31/big-software/</guid>
	<link>http://techdistrict.kirkk.com/2007/10/31/big-software/</link>
	<description>&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;I saw the &lt;a href=&quot;http://www.infoq.com/news/2007/10/Olso-announcement&quot;&gt;news item on InfoQ&lt;/a&gt; regarding MicroSoft Oslo. There was quite a bit marketing mumbo jumbo surrounding Oslo, SOA, BPM, composite applications and MDD, and not a lot of it resonated with me all that much. However, one quote did stand out.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;left&quot;&gt;&lt;em&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;We want to send the model to the server not the printer.&lt;/font&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;This got me thinking about Big Software in general, even if it isn&amp;#8217;t about SOA, BPM, and a lot of other standard industry buzzwords. Developing large  enterprise systems comes with a lot of baggage that smaller development efforts  don&amp;#8217;t have, and a larger codebase is part of it. There are a lot of techniques  that teams apply in attempts to architect, maintain and downright understand  large software systems. In fact, the problem understanding Big Software is one  of the compelling forces that led me to create JarAnalyzer. Since no one person  can understand all detailed aspects of a large system, give people high level  visual insight into the component relationships and let them drill down from  that point. Unfortunately, there is no &amp;#8220;drill down&amp;#8221; capability in JarAnalyzer -  you only get the .jar relationships and a few metrics. But combine it with tools  like JDepend, and UMLGraph and you can get a few different views. Either way,  there are quite a few different techniques that can be used  when it comes to  dealing with large codebases. But it seems like most approaches have serious holes.&lt;br /&gt;
&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;UML Modeling.&lt;/strong&gt; UML  Modeling is typically associated with Big Design Up-Front. While I don&amp;#8217;t agree  with detailed design up-front, establishing some idea of how you want to  approach design is a good idea. I don&amp;#8217;t like designing individual use cases, but  do find value in modeling application frameworks, for example. There are a few  advantages in doing this. The entire development team understands the general  direction. Nothing is ever set in stone, so if something changes, it also serves  as a vehicle for communication. Creating a design model also offers you the  opportunity to structure the model in a way that best fits your team and how  developers will want to interact with and navigate the model. Unfortunately, the  greatest problem with modeling is that keeping your model in sync with the  source code is impossible, and most reverse engineering solutions suck. So, any  modeling done needs to be at a sufficiently high enough level of abstraction  such that detailed change doesn&amp;#8217;t impact it, or the models must be short-lived,  serve their immediate purpose, and then get filed in the trash bin. Generally, I  like to do a bit of modeling early, followed by TDD to drive out the details of  my designs. &lt;/font&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;Post-Construction  Software Visualization.&lt;/strong&gt; Quite a few static structural analysis tools generate  some form of diagram. &lt;a href=&quot;http://www.kirkk.com/main/Main/JarAnalyzer&quot;&gt;JarAnalyzer&lt;/a&gt;, &lt;a href=&quot;http://clarkware.com/software/JDepend.html&quot;&gt;JDepend&lt;/a&gt;, and &lt;a href=&quot;http://www.spinellis.gr/sw/umlgraph/&quot;&gt;UMLGraph&lt;/a&gt; are  examples. Some exist for the .Net platform, too. The obvious advantage is that you get an up-to-date accurate snapshot of  your software system. That&amp;#8217;s valuable. Unfortunately, the diagrams aren&amp;#8217;t always  laid out to give you the view into the system that you&amp;#8217;d like. Tools like  GraphViz do a great job laying out the diagram, but a diagram is just a single  view into a system, and possibly not the view I&amp;#8217;m looking for. They aren&amp;#8217;t  complete models, and since the output of these tools are usually images, they  typically aren&amp;#8217;t navigable. &lt;/font&gt;&lt;/span&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;Static structure analysis is only half the battle&amp;#8230;maybe  less. Understanding class, package, and component relationships is important,  but with frameworks like Spring, it&amp;#8217;s virtually impossible to get a feel for  run-time structure and behavior. Two packages might have no structural  dependency between the two, but the placement of abstractions could result in a  run-time relationship. I know of no tool that does a good job analyzing the  run-time structure. &lt;/font&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;Metrics.&lt;/strong&gt; Many static analysis tools generate metrics and  other type of feedback that provide insight into code quality. Most of these  don&amp;#8217;t necessarily help you understand a system better, but they can help you  create a system that is more easily understandable. I like metrics to help guide  refactoring, because the design as it&amp;#8217;s manifest in code is not always the  design as it&amp;#8217;s envisioned in the mind of the developer. Metrics offer objective  advice on the quality of your application that should be used subjectively. A great  resource for analysis tools for Java/JEE development is &lt;a href=&quot;http://www.java-source.net&quot;&gt;java-source.net&lt;/a&gt;.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;DSM matrices.&lt;/strong&gt; I haven&amp;#8217;t done much work with Dependency (aka.  Design) Structure Matrices, but I intend to explore. I&amp;#8217;ve talked to a few  co-workers who have found them useful.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;MDD.&lt;/strong&gt; Model-Driven-Development has been thrown around the industry for a while. If anyone has actually had any great deal of success developing Big Software using MDD, I&amp;#8217;d love to hear about it. I&amp;#8217;m very skeptical. &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;If I had the perfect  solution, it would be real-time visualization of the source, be it static or  dynamic, with the ability to create different views of the system. I&amp;#8217;d be able  to start high-level, with either .jar or package relationships. Then drill down  into the .jar and packages to view details. But I&amp;#8217;d easily be able to filter out  information that I didn&amp;#8217;t want to see. For instance, I might want to see the  class diagram for a particular package, but in a different diagram I might want  to see the class diagram for only those classes that span packages while  suppressing classes that have relationships only to other classes in a package.  I&amp;#8217;d like to capture the behavior of a running system as a sequence diagram, and  I&amp;#8217;d like to double-click on any class or object and view the source. It&amp;#8217;d be  perfect if all this would integrate with my Spring configuration files, so I can  build that into a view of the system, too. Of course, I want my metrics. I&amp;#8217;d  like an API available so that I could write unit tests that validate my design.  And most important, if I have all of this coolness, I want the ability to filter  out the noise. Essentially, I&amp;#8217;d like to combine the navigability and view  aspects of modelling with the accuracy of post-construction visualization. I  need to make sure my models are accurate, but I also want different views into  the system depending on what I&amp;#8217;m looking for. And I&amp;#8217;d like this wonderful tool  available as an Eclipse plug-in, standalone IDE, and Ant task. I want all of  this, and I want it to perform well, too. Vendors might claim their tool does this for  me, but I know it doesn&amp;#8217;t.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;336171620-24102007&quot;&gt;&lt;font size=&quot;2&quot;&gt;What&amp;#8217;s your  wishlist?&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 31 Oct 2007 02:05:40 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Enterprise OSGi</title>
	<guid>http://techdistrict.kirkk.com/2007/10/17/enterprise-osgi/</guid>
	<link>http://techdistrict.kirkk.com/2007/10/17/enterprise-osgi/</link>
	<description>&lt;p class=&quot;normal&quot;&gt;For years, OSGi technology has flourished in the embedded  systems and networked devices market. Till now, it&amp;#8217;s remained a relatively  obscure technology for the enterprise developer. Now, in part thanks to Eclipse,  &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi &lt;/a&gt;is emerging as a viable and valuable technology in the enterprise.&lt;/p&gt;
&lt;p class=&quot;normal&quot;&gt;In 2003, the Eclipse team began looking for ways to make &lt;a href=&quot;http://www.eclipse.org&quot;&gt;Eclipse  &lt;/a&gt;a more dynamic Rich Client Platform and increase the platform&amp;#8217;s modularity.  Eventually, the team settled on the OSGi framework as the run-time component  model, codenamed the project &lt;a href=&quot;http://www.eclipse.org/equinox/&quot;&gt;Equinox&lt;/a&gt;, and in June of 2004 released Eclipse 3.0.  This newest version of Eclipse sported a runtime model based on OSGi. OSGi was  no longer a technology isolated to use in embedded software and networked  devices, but had now become the foundation upon which all Eclipse plug-ins would  be developed, and the platform upon which thousands of software developers would  use the Eclipse IDE to develop software. Eclipse adoption of OSGi marked a  significant milestone for the OSGi Alliance, as adoption by a major product and  brand such as Eclipse thrust it into the spotlight for many commercial software  companies. Today, several major vendors build on OSGi, and almost all  application servers used within the enterprise currently support, or plan to  support, OSGi. While OSGi has not yet made significant in-roads to the  enterprise, server-side support for OSGi is going to facilitate adoption of OSGi  in the enterprise. And this is where it gets interesting for the enterprise Java  software developer.&lt;/p&gt;
&lt;p class=&quot;normal&quot;&gt;OSGi is a dynamic module system for Java. There is quite a bit  of literature discussing OSGi at the &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi Alliance&lt;/a&gt;, specifically the &lt;a href=&quot;http://osgi.org/osgi_technology/index.asp?section=2&quot;&gt;OSGi  Technology page&lt;/a&gt;. Instead of rehashing what&amp;#8217;s already been said, I want to focus  on how OSGi is going to influence positive change for the enterprise developer  creating server-side software applications.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;standout&quot;&gt;Modular Development&lt;/span&gt;&lt;/strong&gt; - The OSGi  framework defines a unit of modularization called a bundle. A bundle is nothing  more, and nothing less, than a Java .jar file. A .jar file is a valid OSGi  bundle if it contains resources that provide functionality, and a Manifest file  containing metadata about the bundle. The resources can be Java classes, html,  images, Servlets, and even JSP. The metadata is defined using required and  optional key/values pairs. Since all developers are familiar with .jar files,  creating a valid OSGi bundle is relatively straightforward. OSGi changes the  deployment model for enterprise applications. Traditional thinking is centered  around web application development, and teams devote valuable resources to  identifying functionality contained within webapps, and inter-webapp  communication. With OSGi, you won&amp;#8217;t develop traditional web applications.  Instead, you&amp;#8217;ll develop bundles that are assembled into an application, so your  development philosophy turns from application-centric to component-centric.  While we&amp;#8217;ve been attempting to design modular software for a very long time,  OSGi enforces the design of modular software through these bundles and managed  dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;standout&quot;&gt;Managed Dependencies&lt;/span&gt;&lt;/strong&gt; - OSGi accepts  reality that the .jar file is the predominant method of reuse and deployment  with Java. OSGi treats a .jar as a first class component. The Manifest within an  OSGi bundle defines export packages that other bundles can use, as well as  import packages used by the bundle. Think of this as public and private access  to the packages within a .jar file. With OSGi, you can now truly establish a  component&amp;#8217;s published interface simply through how classes are allocated to  packages, and the packages made visible through export by a bundle. OSGi offers  local transparency for it&amp;#8217;s bundles, because you don&amp;#8217;t need to include .jar  files on the run-time classpath. Instead, exported packages within an OSGi  bundle can be used by other bundles running on the OSGi platform. Optionally,  some OSGi implementations may provide a Security layer that allows access to a  bundle if permission has been granted.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;standout&quot;&gt;Component Platform&lt;/span&gt;&lt;/strong&gt; - OSGi is a service  platform because it reduces coupling between bundles. Yet viewing OSGi as only a  service platform tends to lump it in with all other service (as in SOA)  solutions. OSGi is also a true component platform that hits a sweet spot not  presently accommodated for in enterprise Java development or SOA. OSGi is not a  distributed service technology. Instead, OSGi bundles are deployed and  communicate within a single JVM, making inter-bundle communication in-process  and lightweight. OSGi bundles are true software components. The OSGi platform  contains a framework specification, making it similar to any other specification  you&amp;#8217;ve worked with in Java, like the Servlet API, JDBC, etc. There will be  numerous implementations of the OSGi specification, but your code should only  ever refer to the OSGi package structure (org.osgi.*). Additionally, when you  compile, you&amp;#8217;ll want to compile against the specification, not the specific  implementation you choose to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;standout&quot;&gt;Versioned Bundles&lt;/span&gt;&lt;/strong&gt; - When exporting and  importing packages from other bundles, you can specify a version number. Because  bundles can be versioned, you can deploy multiple versions of the same bundle on  the OSGi platform without experiencing fatal errors, such as a  ClassCastException commonly experienced when the same class definition is  deployed multipled times within the same JVM.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;standout&quot;&gt;Dynamic (Re)Deployment&lt;/span&gt;&lt;/strong&gt; - OSGi allows  you to deploy bundles individually, without performing a restart. When  functionality within a bundle changes, you simply redeploy that bundle to the  appropriate OSGi platform, and clients of that bundle automagically discover it  through the packages it exports and it&amp;#8217;s version. No need to redeploy entire  applications. This offers tremendous flexibility if you separate implementation  from specification in your application bundles, by allowing you to completely  swap implementation without any interruption to other deployed bundles.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;standout&quot;&gt;Environmental Control&lt;/span&gt;&lt;/strong&gt; - Because OSGi  is a managed container environment, you have the ability to install, start,  stop, update, and uninstall individual bundles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;normal&quot;&gt;Let&amp;#8217;s take a moment, digest exactly what OSGi entails, and  examine what it means for the enterprise developer in the trenches. No longer  need we emphasize development and deployment of individual web applications and  portals. Instead, we develop enterprise software systems as a composition of  software components that can be assembled dynamically to form a complete system.  The challenge of inter-application communication is a non-issue, since individual  components can expose resources that serve content to the user, and consume  behavior exposed by other components. No longer need we redeploy an entire suite  of enterprise software systems due to a behavioral change in a single .jar file.  Instead, simply update the .jar on the OSGi platform.&lt;/p&gt;
&lt;p class=&quot;normal&quot;&gt;Extending the software system to support new processes is as  simple as deploying or redeploying only the necessary components, without any  interruption to critical processes. An SOA built on web services is also  assembled from the same software components by simply building a service  protocol layer on top of the appropriate components. It&amp;#8217;s possible to assemble a  rich client application from the same software components. Additionally, it&amp;#8217;s  possible to allow separate components within an OSGi container to utilize the  behavior of different versions of the same component.&lt;/p&gt;
&lt;p class=&quot;normal&quot;&gt;Because component dependencies are explicitly stated, the  component structure of the application is well understood. At the very least,  this minimzes the risk of change as the ramification of change can be more  accurately assessed. Since OSGi bundle collaboration is in-process, granularity  of components can be established that allow teams to maximize component reuse  without incurring performance degradation due to excessive inter-component  collaboration. Overall, OSGi has eliminated many architectural challenges with  enterprise software development, and has established more refined techniques for  deploying and managing enterprise software.&lt;/p&gt;
&lt;p class=&quot;normal&quot;&gt;When you add it all up, OSGi fills an important technology gap  between SOA and object-oriented design on the Java platform. For some time,  we&amp;#8217;ve been able to build flexible and extensible class structures in Java. With  technologies such as EJB (primarily Sessions Beans and Message Beans) and web  services, we&amp;#8217;ve had a service deployment model. But we&amp;#8217;ve lacked a robust  component model. Today, there are several server-side open source implementations of the  OSGi platform, including &lt;a href=&quot;http://www.eclipse.org/equinox/server/&quot;&gt;Server-Side Equinox&lt;/a&gt; and &lt;a href=&quot;http://felix.apache.org/site/index.html&quot;&gt;Apache Felix&lt;/a&gt;, as well as several  commercial implementations. The current development release of &lt;a href=&quot;http://springframework.org/osgi&quot;&gt;Spring-OSGi&lt;/a&gt;  supports building Spring applications that run in an OSGi environment. In  typical Spring fashion, Spring managed OSGi bundles eliminate dependencies to  OSGi. &lt;a href=&quot;http://wiki.jonas.objectweb.org/xwiki/bin/view/Main/WebHome&quot;&gt;The Java Open Application Server&lt;/a&gt; v. 5 (JOnAS) is designed with an OSGi based architecture. Even Sun is noticing as is evident through the &lt;a href=&quot;http://www.infoq.com/news/2007/08/osgi-jsr277-debate&quot;&gt;ongoing saga&lt;/a&gt; of &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=291&quot;&gt;JSR-291&lt;/a&gt; and  &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=277&quot;&gt;JSR-277&lt;/a&gt;. And interest in OSGi doesn&amp;#8217;t stop there, as a &lt;a href=&quot;http://www.google.com/search?source=ig&amp;amp;hl=en&amp;amp;q=osgi&amp;amp;btnG=Google+Search&quot;&gt;quick Google search&lt;/a&gt;  reveals.&lt;/p&gt;
&lt;p class=&quot;normal&quot;&gt;OSGi is a key technology filling an important void in enterprise  software development. While OSGi adoption within the enterprise may be a year or three away, as the platform continues to gain momentum it&amp;#8217;s going to  offer significant benefits to enterprise software development teams.&lt;/p&gt;</description>
	<pubDate>Wed, 17 Oct 2007 03:13:10 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Rotting Design</title>
	<guid>http://techdistrict.kirkk.com/2007/10/08/rotting-design/</guid>
	<link>http://techdistrict.kirkk.com/2007/10/08/rotting-design/</link>
	<description>&lt;p&gt; &lt;strong&gt;Design Rot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve all experienced that sinking feeling when maintaining a piece of crappy software. Has my change broken the system in some unintended way? What is the ramification of my change on other parts of the system? If you&amp;#8217;re lucky, and the system has a robust suite of unit tests, they can offer some support in proving your work. In practice, however, few systems have thorough automated test coverage. Mostly we&amp;#8217;re alone, left to verify our changes as best as possible. We might privately criticize the original developers for creating such garbage. It certainly lends a plausble excuse in explaining why the maintenance effort is so costly or time-consuming. Or it might serve as the basis upon which we recommend a re-write. But mostly, we should wonder how it happened.&lt;/p&gt;
&lt;p&gt;For sure, most software doesn&amp;#8217;t start out this way. Most software starts out clean, with a clear design strategy. But as the system grows over time, strange things begin to happen. Business rules change. Deadline pressures mount. Test coverage slips. Refactoring is a forgotten luxury. And the inherent flaws present in every initial design begin to surface. Reality has proven that few enterprise development teams have the time or resources to fix a broken design. More often, we are left to work within the constraints of the original design. As change continues, our compromises exacerbate the problem. The consequence of rotting design is seen throughout the enterprise on a daily basis. Most apparent is the affect on software maintenance. But rotting design leads to buggy software and performance degradation, as well. &lt;strong&gt;&lt;em&gt;Over time, at least a portion of every enterprise software system experiences the problem of rotting design&lt;/em&gt;&lt;/strong&gt;. A quote from Brook&amp;#8217;s sums it well:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;All repairs tend to destroy the structure, to increase the entropy and disorder of the system. Less and less effort is spent on fixing the original design flaws; more and more is spent on fixing flaws introduced by earlier fixes. As time passes, the system becomes less and less well-ordered. Sooner or later the fixing ceases to gain any ground. Each forward step is matched by a backward one. Although in principle usable forever, the system has worn out as a base for progress.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The most obvious question is, &amp;#8220;How do we prevent rotting design?&amp;#8221; &lt;strong&gt;&lt;em&gt;Unfortunately, rotting design is not preventable, only reducable&lt;/em&gt;&lt;/strong&gt;. As design is an essential complexity, it cannot be eliminated, only minimized. Of the past ten years, the design patterns movement has provided insight to the qualities of good design, helping minimize the essential complexity. Dissecting design patterns reveals many important design principles that contribute to more resilient software design. Favor Object composition over class inheritance, and program to an interface, not an implementation, are two examples. Of the 23 patterns in the GOF book, all adhere to these fundamental statements. Alone however, today&amp;#8217;s design patterns are not enough to help reduce rotting design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reducing Rot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most patterns emphasize class design, and present techniques that can be used in specific contexts to minimize dependencies between classes. Teasing apart the underlying goal of most respected patterns shows us that each aim to manage the dependencies between classes through abstract coupling. Conceptually, classes with the fewest dependencies are highly reusable, extensible, and testable. &lt;strong&gt;&lt;em&gt;The greatest influence in reducing design rot is minimizing unnecessary dependencies&lt;/em&gt;&lt;/strong&gt;. Yet enterprise development involves creating many more entities beyond only classes. Teams must define the package structure in which those classes live, and the component structure in which they are deployed. Increasing the survivability of your design involves managing dependencies between all software entities - classes, packages, and components.&lt;/p&gt;
&lt;p&gt;But if minimal dependencies were the only traits of great design, developers would lean towards creating very heavy, self-contained software entities with a rich API. While these entities might have minimal dependencies on external resources, extreme attempts to minimize dependencies results in excessive redundancy across entities with each providing its own built-in implementation of common behavior. Ironically, avoiding redundant implementations, thereby maximizing reuse, requires that we delegate to external entities, increasing dependencies. &lt;strong&gt;&lt;em&gt;Attempts to maximize reuse results in excessive dependencies and attempts to minimize dependencies results in excessive redundancy&lt;/em&gt;&lt;/strong&gt;. Neither is ideal, and a gentle balance must be sought when defining the behavior, or granularity, of all software entities - classes, packages, and components.&lt;/p&gt;
&lt;p&gt;Software design is a constant quandary. Any single element key to crafting great designs, if taken to its individual extreme, results in directly the opposite - a brittle design. The essential complexity surrounding design is different for every software development effort, for similar domains across organizations, and for different phases throughout the life of a software product. The ideal design for a software system is always the product of it&amp;#8217;s current set of behavioral specifications. As behavior changes, so too must the granularity of the software entities and the dependencies between them. &lt;strong&gt;&lt;em&gt;The most successful designs are not characterized by their initial brilliance, but instead through their ability to withstand the test of time&lt;/em&gt;&lt;/strong&gt;. As the complexity of software design is an essential complexity surrounding software development, our hopes lie with technologies and principles that help increase the ability of your design to survive over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future of Design&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m hopeful that all software developers have experienced the pleasure of a design that, through the course of time, has withstood the test of time. Unfortunately, many enterprise development teams have too few of these experiences. Likewise, few enterprise development teams devote adequate effort to package and component design, serving as a significant contributor to our inability to realize the promised benefits of object-oriented development. &lt;strong&gt;&lt;em&gt;It&amp;#8217;s unreasonable to believe that even the most flexible class structure can survive should the higher level software entities containing those classes not exhibit similarily flexible qualities&lt;/em&gt;&lt;/strong&gt;. The problems are rampant. Increased dependencies between packages and components inhibit reusability, hinder maintenance, prevent extensibility, restrict testability, and limit a developer&amp;#8217;s ability to understand the ramification of change.&lt;/p&gt;
&lt;p&gt;SOA and Web Services promise to remedy our failures with object-oriented development. &lt;strong&gt;&lt;em&gt;While Services may offer tangible business value, within each awaits a rotting design&lt;/em&gt;&lt;/strong&gt;. There exists a world between class design and web services that deserves more exploration, and as an industry, we are beginning to notice. Currently, the &lt;a href=&quot;http://jcp.org/en/home/index&quot;&gt;Java Community Process&lt;/a&gt; (JCP) is developing three separate JSRs that emphasize greater modularity for the Java platform. &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=277&quot;&gt;JSR-277&lt;/a&gt; is creating a static module system for Java, part of which aims to establish a mechanism for expressing and enforcing the dependency between .jar files. &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=291&quot;&gt;JSR-291&lt;/a&gt; references &lt;a href=&quot;http://www.osgi.org/&quot;&gt;OSGi&lt;/a&gt;, a proven component technology providing a dynamic module system for the Java platform. &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=294&quot;&gt;JSR-294&lt;/a&gt; focuses on VM and language support for modularity. For some time, &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven &lt;/a&gt;has supported flexible ways to select specific versions of a component, as well as support for managing transitive dependencies. &lt;a href=&quot;http://clarkware.com/software/JDepend.html&quot;&gt;JDepend &lt;/a&gt;and &lt;a href=&quot;http://techdistrict.kirkk.com/feed/www.kirkk.com/main/Main/JarAnalyzer&quot;&gt;JarAnalyzer &lt;/a&gt;are two utilities that provide feedback on package and component design, respectively. All aim to help manage the complexity, from design through deployment, of enterprise software development. With each, new practices, heuristics, and patterns will emerge that increase the ability of a design to grow and adapt.&lt;/p&gt;</description>
	<pubDate>Mon, 08 Oct 2007 18:20:29 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Java Components &amp; OSGi</title>
	<guid>http://techdistrict.kirkk.com/2007/10/03/java-components-osgi/</guid>
	<link>http://techdistrict.kirkk.com/2007/10/03/java-components-osgi/</link>
	<description>&lt;p&gt;Because of it&amp;#8217;s emerging significance and my increased interest, I&amp;#8217;ll be posting a number of entries related to &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi&lt;/a&gt;. I&amp;#8217;ll share some ideas on how OSGi stands to transform enterprise Java software development and application delivery, present some samples that illustrate these ideas, and offer a few opinions regarding the &lt;a href=&quot;http://www.jcp.org&quot;&gt;JCP &lt;/a&gt;and the various JSR&amp;#8217;s that intend to accomplish similar ideals. I&amp;#8217;m hopeful that my unbiased opinion will help developers more fully understand the value that OSGi brings to the enterprise. To help you quickly find all OSGi related entries on this site, I&amp;#8217;ve created a separate blog category under which I&amp;#8217;ll file these posts. I&amp;#8217;ve also &lt;a href=&quot;http://techdistrict.kirkk.com/osgi/&quot;&gt;added a separate page&lt;/a&gt; that links to a number of other useful OSGi specific articles, websites, and blogs. If you are aware of an on-line resource related to OSGi, or know of one not on the current list, &lt;a href=&quot;http://www.kirkk.com/main/Main/About&quot;&gt;let me know&lt;/a&gt; and I&amp;#8217;ll add it.&lt;/p&gt;
&lt;p&gt;For quite some time, I&amp;#8217;ve felt that the lack of a component technology has left a gaping hole on the Java platform. In fact, this is what led me to begin development on &lt;a href=&quot;http://www.kirkk.com/main/Main/JarAnalyzer&quot;&gt;JarAnalyzer &lt;/a&gt;back in 2001 in the hope that I could help developers understand the component modularity of their existing applications. It&amp;#8217;s also what led me to found &lt;a href=&quot;http://www.extensiblejava.com&quot;&gt;Extensible Java&lt;/a&gt; in the hope that I could offer some design guidelines surrounding component modularity when developing large enterprise software systems in Java. The idea of a component technology that brings greater modularity to the Java platform is very exciting. This is my first OSGi-related post, so let&amp;#8217;s start at the beginning. Why?&lt;/p&gt;
&lt;p&gt;The distiction between software architecture and design is subtle, and countless trees have been sacrificed attempting to differentiate between the two. &lt;a href=&quot;http://www.booch.com/architecture/blog.jsp?archive=2006-03.html&quot;&gt;Booch sums it well&lt;/a&gt;, pointing out that it&amp;#8217;s the cost of change separating the two.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;All architecture is design but not all design is architecture. Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Cost of change can be measured in many different ways, and is contextual. Financial cost, technological risk, and derived business value are examples of what might factor into that cost. However you slice it and dice it, the business value of design is to craft a software design that minimizes the cost of change by maximizing adaptability to change.&lt;/p&gt;
&lt;p&gt;The ability of software to adapt, however, is not constant. As unexpected shifts in technology and business occur, the original design may not accommodate current needs. Should this occur in an architecturally significant area of the system, the cost of applying the correct change may exceed the immediate business value. As this happens throughout the life of a software system, software design degrades to the point where most change is no longer cost effective, and the temptation to hack a compromised solution is great. As this begins, and continues to occur, the software is beginning to rot.&lt;/p&gt;
&lt;p&gt;Fowler discusses &lt;a href=&quot;http://martinfowler.com/bliki/DesignStaminaHypothesis.html&quot;&gt;Design Stamina Health&lt;/a&gt; in making the compelling case that software design is a worthwhile activity. I doubt many of us disagree with his conclusion, assuming that the resulting design realizes the intended goal - that it can evolve. While good software designs are able to evolve based on the known factors today, the unforeseen factors of tomorrow reap havoc on design. I doubt we can ever entirely defeat these forces, but many techniques have been discovered that allow us to craft more adaptable software designs. Object-oriented development, design patterns, &lt;a href=&quot;http://testearly.com/2007/09/26/code-qualitys-singular-metric&quot;&gt;software code quality metrics&lt;/a&gt;, &lt;a href=&quot;http://c2.com/cgi/wiki?OoDesignPrinciples&quot;&gt;design quality principles&lt;/a&gt;, emergent design techniques such as Test-Driven Development, and Service Oriented Architecture all represent a positive step. Yet for large enterprise software systems, there is still a key ingredient missing in delaying design rot. On the horizon looms a disruptive technology, codename OSGi, that stands to redefine how we think about designing enterprise software on the Java platform.&lt;/p&gt;</description>
	<pubDate>Wed, 03 Oct 2007 04:31:39 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Getting Blasted</title>
	<guid>http://techdistrict.kirkk.com/2007/09/27/getting-blasted/</guid>
	<link>http://techdistrict.kirkk.com/2007/09/27/getting-blasted/</link>
	<description>&lt;p&gt;&lt;span class=&quot;186390421-12092007&quot;&gt;&lt;font size=&quot;2&quot;&gt;I got blasted for  the following quote in a recent &lt;a href=&quot;http://www.eweek.com/article2/0,1759,2173162,00.asp&quot; target=&quot;_blank&quot;&gt;eWeek &lt;/a&gt;article:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;span class=&quot;186390421-12092007&quot;&gt;&lt;font size=&quot;2&quot;&gt;&amp;#8220;If you&amp;#8217;re in a  large environment that is bureaucratic, filled with politics and has a [software  development] process like the waterfall flavor of RUP [Rational Unified Process]  what do you do?&amp;#8221; Knoernschild asked. &amp;#8220;It&amp;#8217;s been my experience that the number  one thing you can do is continuous integration. That can spawn so many business  benefits.&amp;#8221;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span class=&quot;186390421-12092007&quot;&gt;&lt;font size=&quot;2&quot;&gt;The blaster  suggested that I have no idea what I&amp;#8217;m talking about because there is no  &amp;#8220;waterfall flavor of RUP&amp;#8221;. What I believe the blaster missed is the tongue in my  cheek when I made the comment.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;186390421-12092007&quot;&gt;&lt;font size=&quot;2&quot;&gt;As is  often the case, the quote didn&amp;#8217;t capture the context of the statement. Many  teams, when transitioning to an iterative process, commit a number of mistakes.  One of the more common mistakes is to establish iterations centered around the  traditional lifecycle phases. When I made the comment, I also pointed out that  the &amp;#8220;waterfall flavor of RUP&amp;#8221; typically consists of the first iteration being  the requirements iteration, followed by the design iteration, followed by the  construction iteration, followed by the testing iteration, etc.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 27 Sep 2007 03:41:11 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Class, Component, Service</title>
	<guid>http://techdistrict.kirkk.com/2007/09/12/class-component-service/</guid>
	<link>http://techdistrict.kirkk.com/2007/09/12/class-component-service/</link>
	<description>&lt;p&gt;A &lt;strong&gt;class&lt;/strong&gt; defines the variables and methods available to it&amp;#8217;s specific instances. A class serves as the blueprint for an object. An &lt;strong&gt;object&lt;/strong&gt; is an instance of a class with state. In Java, a class is a .class file&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;component&lt;/strong&gt; is a unit of deployment. A component contains classes. Components are invoked in-process (locally). Components are not instantiable.  Components are stateless. Component interactions are synchronous. In Java, a component is a .jar file.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;service&lt;/strong&gt; is a software system. Services are distributed, may execute in different processing environments, communicate over a network, and are invoked remotely. A service is not instantiable. Services are stateless. Service interactions are synchronous or asynchronous. A service contains components. In Java, a service is an .ear file with the appropriate deployment descriptor.&lt;/p&gt;
&lt;p&gt;Agree or Disagree? I&amp;#8217;m interested in your thoughts on this subject&amp;#8230;&lt;/p&gt;</description>
	<pubDate>Wed, 12 Sep 2007 04:23:22 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: New JarAnalyzer XSL</title>
	<guid>http://techdistrict.kirkk.com/2007/09/07/new-jaranalyzer-xsl/</guid>
	<link>http://techdistrict.kirkk.com/2007/09/07/new-jaranalyzer-xsl/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;JarAnalyzer has  always had the ability to create a dot-compliant output file that could be used  with GraphViz to generate a component diagram. In the past, this had always been  done using the &lt;code&gt;DOTSummary&lt;/code&gt; class. Unfortunately, this meant that if you wanted to  generate output files in both xml and dot, you had to run JarAnalyzer twice.  Now, thanks to a stylesheet that I graciously stole from JDepend and modified to work with JarAnalyzer, there&amp;#8217;s a new way to generate  a dot-compliant output file that is much nicer than what you&amp;#8217;ll get when using  &lt;code&gt;DOTSummary&lt;/code&gt;. Plus, you only have to run JarAnalyzer once, then apply two stylesheets to the xml file generated to get both the html report and component  diagram.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;&lt;/span&gt;&lt;/font&gt; &lt;a href=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2007/09/appdependencies-old.png&quot; title=&quot;Old Component Diagram&quot;&gt;&lt;img src=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2007/09/appdependencies-old.thumbnail.png&quot; alt=&quot;Old Component Diagram&quot; /&gt;&lt;/a&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;In additi&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;on to &lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;b&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;eing  a bit more efficient, it&amp;#8217;s also cleaner. The old component diagram is shown at left on top, while the new component diagram using the stylesheet is shown at bottom left. &lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;The stylesheet avoids the  confusion where &lt;code&gt;DOTSummary&lt;/code&gt; changed the name of the .jar file and stripped off  the .jar extension. As seen on the diagrams, a .jar file named &lt;code&gt;bill.jar&lt;/code&gt; now actually appears as &lt;code&gt;bill.jar&lt;/code&gt; on the component diagram, not &lt;code&gt;bill&lt;/code&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2007/09/appdependencies-new.png&quot; title=&quot;New Component Diagram&quot;&gt;&lt;img src=&quot;http://techdistrict.kirkk.com/wp-content/uploads/2007/09/appdependencies-new.thumbnail.png&quot; alt=&quot;New Component Diagram&quot; /&gt;&lt;/a&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;The new stylesheet  isn&amp;#8217;t part of the JarAnalyzer distribution&amp;#8230;yet, but you can &lt;a href=&quot;http://www.kirkk.com/main/zip/jaranalyzer2dot.xsl&quot;&gt;download the  stylesheet&lt;/a&gt;. To run JarAnalyzer as part of your Ant build script and get both the html a&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;770053813-06092007&quot;&gt;nd component diagram output, drop the stylesheet in the directory containing JarAnalyzer (the same directory with jaranalyzer.xsl), and modify your build script similar to the following (you  need GraphViz installed to run dot):&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;target name=&quot;dotanalyzerapp.new&quot; depends=&quot;bundle&quot;&amp;gt;
   &amp;lt;taskdef name=&quot;jaranalyzer&quot;
                  classname=&quot;com.kirkk.analyzer.textui.JarAnalyzerTask&quot;&amp;gt;
       &amp;lt;classpath&amp;gt;
           &amp;lt;pathelement path=&quot;${buildlib}/jaranalyzer-1.2.jar&quot;/&amp;gt;
           &amp;lt;pathelement path=&quot;${buildlib}/lib/bcel-5.2.jar&quot;/&amp;gt;
           &amp;lt;pathelement path=&quot;${buildlib}/lib/jakarta-regexp-1.3.jar&quot;/&amp;gt;
           &amp;lt;pathelement path=&quot;${buildlib}/lib&quot;/&amp;gt;
       &amp;lt;/classpath&amp;gt;

   &amp;lt;/taskdef&amp;gt;

   &amp;lt;jaranalyzer srcdir=&quot;${buildstats}&quot; destfile=&quot;${buildstats}/appdependencies.xml&quot;
                      summaryclass=&quot;com.kirkk.analyzer.textui.XMLUISummary&quot;/&amp;gt;

   &amp;lt;style in=&quot;${buildstats}/appdependencies.xml&quot;
                    out=&quot;${buildstats}/appdependencies.html&quot;
                    style=&quot;${buildlib}/jaranalyzer.xsl&quot;&amp;gt;
   &amp;lt;/style&amp;gt;

   &amp;lt;style in=&quot;${buildstats}/appdependencies.xml&quot;
                    out=&quot;${buildstats}/appdependencies.grph&quot;
                    style=&quot;${buildlib}/jaranalyzer2dot.xsl&quot;&amp;gt;
   &amp;lt;/style&amp;gt;

   &amp;lt;exec executable=&quot;dot&quot; &amp;gt;&amp;lt;arg line=&quot;-Tpng -Nshape=box -Nfontsize=30 -Nwidth=1.5
              -Nheight=1.25&amp;lt;br&amp;gt;&amp;lt;/arg&amp;gt; ./buildstats/appdependencies.grph
              -o ./buildstats/appdependencies.png&quot;&amp;gt;
   &amp;lt;/exec&amp;gt;

 &amp;lt;/target&amp;gt;&lt;/pre&gt;</description>
	<pubDate>Fri, 07 Sep 2007 12:55:10 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Palm Treo 700p</title>
	<guid>http://techdistrict.kirkk.com/2007/08/29/palm-treo-700p/</guid>
	<link>http://techdistrict.kirkk.com/2007/08/29/palm-treo-700p/</link>
	<description>&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;About a month ago, I  went out and purchased a Palm Treo 700p (yes, I purchased it even after the  release of the iPhone). Prior to the Treo, I had a regular ole&amp;#8217; LG (model  unknown) that I used as a phone, and a BlackBerry (model 7250) that I used for  my data needs (browsing and e-mail). I decided to use the Treo to serve both my  phone and data needs. So far, there&amp;#8217;s been good, bad, and  ugly.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;strong&gt;First, the  good.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;The phone is  decent, neither better nor worse than my LG through U.S. Cellular. Reception  with Verizon is about the same, and I still experience the same volume of  dropped calls and missed calls due to the phone failing to ring. The touchscreen  keypad works well, with fairly large numbers that help prevent mistyping the  numbers. The Treo is a bit large for a phone, and it&amp;#8217;s shape doesn&amp;#8217;t feel  entirely natural pressed against the side of my head. The detailed call log is  nice.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;The Blazer browser  accesses most of the sites I need when in a pinch. For a more pleasurable  browsing experience, I can always tether the phone to my Mac anywhere I get  reception. The lack of built-in WiFi isn&amp;#8217;t a huge concern because of the ability  to tether the 700p to my Mac. However, after seeing Safari on the iPhone, I was  a bit jealous.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Initially, I used  VersaMail as my default mail client, but quickly abandoned that experiement  because of a few minor annoyances related to the user interface and my inability  to configure VersaMail in a way that wouldn&amp;#8217;t download duplicate messages  without deleting them from the server. I installed a Java VM and went with the  GMail client instead. Since I send e-mail using GMail (web-based), my Mac, and  the Treo, the GMail client for my Treo is nice as I minimize the number of  Outboxes I have that require searching when I want to find a sent mail  item.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;I use iCal on my  Mac which syncs well with my Google Calendar. While it&amp;#8217;s pretty easy to sync  between iCal and the Palm&amp;#8217;s Calendar using iSync, since I use Google Calendar as  my system of record, I preferred to sync with Google Calendar directly. GooSync  allows me to do an over-the-air two-day sync with my Google Calendar. That&amp;#8217;s a  pretty nice feature, but I did have one instance where a future appointment  wouldn&amp;#8217;t sync correctly. I couldn&amp;#8217;t repeat it and it hasn&amp;#8217;t happened again, so  right now, I&amp;#8217;m treating it as an anamoly. It&amp;#8217;s nice knowing that I can enter an  appointment on my Treo or in Google Calendar and the two-way sync takes care of  the rest.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Messaging on the  Treo is much nicer than my old LG as the display shows the entire history of a  conversation.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Tethering my phone  to my Mac via a Bluetooth connections gives me web access anywhere I get cell  reception. This is similar to how the Verizon Wireless Card works. Connection  speed is suitable for most of my browsing needs (around 200k), but the  connection seems to get lost if I remain idlefor longer than 30 seconds to a  minute. While somewhat of a pain, it&amp;#8217;s quick enough to reconnect that it&amp;#8217;s  tolerable.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;I really like the  1.2 MegaPixel camera as the quality is obviously much better than the VGA camera  on my old phone. I&amp;#8217;m constantly using it to snap pictures of the kids. The  camcorder video is rather choppy, but capturing a precious moment in the absence  of my Sony camcorder is better than not.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Palm has a pretty  healthy development community and subsequently, there&amp;#8217;s a plethora of software  available for the Treo 700p. Google maps is a definite sweet spot that offers  turn by turn directions. BackupBuddyVFS offers a way to backup the entire  contents of the device to my SD card.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Mac integration is  fairly solid with the 700p. Using iSync, I can easily sync with Contacts and  iCal, though syncing for me is primarily for backup purposes over anything else.  I use GooSync to sync with Google Calendar and have seutp iCal to subscribe to  my Google Calendar, so there isn&amp;#8217;t any need to sync my Treo Calendar with  iCal.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;strong&gt;Now, the  bad.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;I find the keypad  more difficult to type on than my BlackBerry. I&amp;#8217;m sure a good part of this is  due to a protective plastic case that covers my keyboard, but the keys do seem a  bit closer to each other than on the BlackBerry. Text messaging on the Treo is  better than my LG phone due to the QWERTY  keyboard&amp;#8230;obviously.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;The ergonomics and  look and feel of the device and applications lack appeal. A good example of this  is the Contacts, which is just a black and white listing of all contacts in the  directory. The touchscreen feature works well if I use the stylus, but is  marginal if I try to use my finger. I don&amp;#8217;t really mind the stylus, but I&amp;#8217;m  always worried that I&amp;#8217;ll lose it. Not so much with my finger. I&amp;#8217;d think that a  few UI and usability tweaks would go a long ways toward improving the aesthetic  appeal of the device. As Neal stated during a conversation at the Green Bay  NoFluffJustStuff symposium&amp;#8230;&amp;#8221;it&amp;#8217;s so Phone 1.0&amp;#8243;. True.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Overall  reliability hasn&amp;#8217;t been terrible. Essentially, the phone works exactly as  advertised, but unfortunately, with a few tweaks, it could work so much better.  The boot loop and tethering issue are two examples.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Performance is choppy and  delayed at times. Attempting to access the web via Blazer or hanging up a call  are two instances where the phone tends to lock up for a moment, causing some  minor annoyances.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Interoperability  between applications isn&amp;#8217;t great. At one point, I tried to impress a friend by  accessing a webmail account and downloading a word document that had been sent.  While I&amp;#8217;d never tried it before, I figured since the phone came with Documents  to Go, it&amp;#8217;d be easy to download a Word document and open it. Unfortunately, I  couldn&amp;#8217;t figure out how to save the .doc file, and when I clicked on the link,  the Treo 700p opened it up showing nothing but a bunch of binary garbage. Why  wouldn&amp;#8217;t it just send it to Documents to Go? Don&amp;#8217;t know. My friend was not  impressed.&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Many folks  complain about the feeble storage capacity on the Treo 700p, with only 128MB.  Since I use my iPod for music instead of pTunes (and I don&amp;#8217;t listen to music  other than the radio all too often), storage isn&amp;#8217;t a huge issue for me. I  purchased a 2 GB SD card, and I suspect that&amp;#8217;ll be plenty for me well into the  future. I could be wrong, especially if I begin to load my Treo with custom  applications. Of course, I can&amp;#8217;t imagine increasing the storage capacity of the  Treo would be a significant undertaking for Palm, and the number of users who  desire more storage should serve as a compelling enough reason to do  so.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;strong&gt;And the  ugly.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Ah yes&amp;#8230;the  dreaded boot loop. For no apparent reason, the phone gets caught in an endless  boot loop where the screen shows the &amp;#8220;Access Powered&amp;#8221; logo following by a  startup screen followed by the &amp;#8220;Access Powered&amp;#8221; logo followed by a startup  screen followed by the &amp;#8220;Access Powered&amp;#8221; logo followed by&amp;#8230;ok, you get the  picture. The only way to correct this nasty little bug is by performaing a hard  reset, which in turn results in total data loss and restores the machine to it&amp;#8217;s  original state. The first time this happened, I freaked because I hadn&amp;#8217;t done a  hotsync recently. While a warm reset allowed me to backup most of my data before  performing a hard reset, I immediately purchased BackBuddyVFS to hopefully avoid  future loss of data concerns. It hasn&amp;#8217;t happened again yet, but when it does,  I&amp;#8217;m hoping BackupBuddy makes recovery easy. Regardless, this is a serious issue,  and not one that users of a well-built device should be worrying about.  Fortunately, it&amp;#8217;s only happened once over the past month of  usage.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span class=&quot;228181017-06082007&quot;&gt;Overall, save for  the few ergonomic and UI quirks, minor instability issues, and the dreaded boot  loop, I&amp;#8217;ve enjoyed the phone. Camcorder, tethering, and Mac integration were  important features for me. My BlackBerry/LG setup had none of these (possibly  newer BlackBerry models have some), Obviously, the iPhone fits the bill with  great Mac integration. The iPhone appears to be an amazing device, and as it  evolves, I&amp;#8217;m sure my interest will increase. To this point, as a replacement for  my LG and BlackBerry, the Treo 700p is working nicely.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 29 Aug 2007 15:02:25 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: Agile 2007 Recap</title>
	<guid>http://techdistrict.kirkk.com/2007/08/23/agile-2007-recap/</guid>
	<link>http://techdistrict.kirkk.com/2007/08/23/agile-2007-recap/</link>
	<description>&lt;p&gt;A bit later than I had hoped, but I wanted to take a moment to reflect on Agile 2007 in Washington, D.C. last week.&lt;/p&gt;
&lt;p&gt;I arrived at Agile 2007 on Wednesday, midway through the conference. After a few conversations with attendees , I&amp;#8217;m certain I&amp;#8217;ve captured the essence of the conference. Immediately upon arrival, I jumped right into the second half of a panel discussion focused on Agile Portfolio Management. Then last night, I was invited to an Agile Roundtable discussion hosted by the fine folks at Stelligent, where a significant portion of the conversation centered around agile adoption and transition. You can obtain an overview of the discussion in &lt;a href=&quot;http://www.eweek.com/article2/0,1759,2173162,00.asp&quot;&gt;this eWeek article&lt;/a&gt;. Thursday, I attended two different sessions. The first discussed The Enterprise and Scrum, and the second focused on Agile in the Waterfall Enterprise.&lt;/p&gt;
&lt;p&gt;Therein lies a major theme of Agile 2007 - agile transformation and agile adoption within the enterprise. It seems that the majority of speakers and attendees I&amp;#8217;ve spoken with who have agile experience are Scrum masters, agile coaches, or agile mentors looking for better ways to bring agile to the enterprise. For instance, conversations that emphasize vendor integration and COTS software packages typically turned toward contract and vendor relationship management. But as a developer, my area of interest lies more with strategies related to testing an application that integrates with a COTS package, and the infrastructure required to support frequent deployment of a COTS package. Not that we need another session on testing&amp;#8230; But seriously, we cannot forget the developer within the agile enterprise. Some ideas for great developer sessions that come to mind include choosing an agile technology stack, principles for increased architectural agility, and tools for an agile infrastructure. Maybe next year.&lt;/p&gt;
&lt;p&gt;Of course, with that said, Agile 2007 appears to have been a smashing success. It was sold out well in advance, and the enthusiasm of the crowd was tremendous. The conference felt small and personal, which allowed for a high degree of interaction between the speakers, vendors, and attendees. Hallway discussions were frequent and intense. But after spending some time speaking to the folks in the trenches, I share their opinion&amp;#8230;more content discussing agile development techniques would have made the conference even greater.  After all, the developer produces the one [and only] artifact that truly matters..the source code (pssst&amp;#8230;don&amp;#8217;t forget that).&lt;/p&gt;
&lt;p&gt;Now, onto &lt;a href=&quot;http://www.sdexpo.com/2007/sdbp/&quot;&gt;SD Best Practices&lt;/a&gt; in Boston.&lt;/p&gt;</description>
	<pubDate>Thu, 23 Aug 2007 03:31:02 +0000</pubDate>
</item>
<item>
	<title>@kirkk.com blog: TeamSoft</title>
	<guid>http://techdistrict.kirkk.com/2007/08/14/teamsoft/</guid>
	<link>http://techdistrict.kirkk.com/2007/08/14/teamsoft/</link>
	<description>&lt;p&gt;After being gone for about a year and a half, I&amp;#8217;m back at &lt;a href=&quot;http://www.teamsoftinc.com&quot;&gt;TeamSoft&lt;/a&gt;, a high-end IT consulting firm. I know it sounds cliche to make the statement, but TeamSoft prides itself on the quality of it&amp;#8217;s people. On average, TeamSoft professionals boast 13 years of industry experience. We also have a world-class training program, with some excellent instructors. We&amp;#8217;ve been a Sun training partner since 2001, and are always looking to expand and grow our curriculum. As a TeamSoft employee, you know you&amp;#8217;ll always remain close to cutting edge technology, as well as have the opportunity to work with other technologists who are passionate about technology. We&amp;#8217;ve also expanded our services beyond software development, meaning that you&amp;#8217;re exposed to a team of very diverse technologists. Yet while it&amp;#8217;s a wonderful technology environment, we also remain very family-focused. The majority of our employees have children, and with little to no travel involved, you&amp;#8217;ll enjoy the opportunity to spend time with your family. And &lt;a href=&quot;http://www.visitmadison.com/&quot;&gt;Madison, WI&lt;/a&gt; is a great place to live.&lt;/p&gt;
&lt;p&gt;My role at TeamSoft is similar to what it&amp;#8217;s always been, with one caveat. We&amp;#8217;ve grown tremendously over the past couple of years, and it&amp;#8217;s important to us that we maintain the small company feel that our employees have grown to appreciate, while continuing to give employees the opportunity to work on great technology projects. Part of my additional responsibilities include leveraging the strengths that made TeamSoft a great small 