<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Opinions on IT and various issues</title>
	<atom:link href="http://microintellia.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://microintellia.com/blog</link>
	<description></description>
	<pubDate>Tue, 31 Jan 2012 20:46:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Online media 3.0</title>
		<link>http://microintellia.com/blog/2012/01/30/online-media-30/</link>
		<comments>http://microintellia.com/blog/2012/01/30/online-media-30/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 21:20:20 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=610</guid>
		<description><![CDATA[I went the other day to check ou The Onion, a satirical online newspaper that I haven&#8217;t read in a while. After leafing thru a few stories I was surprised to be prompted with thiw message:
You have arrived at your 30-day allowance of 5 free premium pages from America&#8217;s Finest News Source. If you enjoy [...]]]></description>
			<content:encoded><![CDATA[<p>I went the other day to check ou <a href="http://www.theonion.com" target="_blank">The Onion</a>, a satirical online newspaper that I haven&#8217;t read in a while. After leafing thru a few stories I was surprised to be prompted with thiw message:</p>
<p><span><em>You have arrived at your 30-day allowance of 5 free premium pages from America&#8217;s Finest News Source. If you enjoy our probing and analytical journalism and want full access, we ask that you support our hardworking reporters by purchasing a subscription for as low as $2.95/ month or $29.95/ year.</em></span></p>
<p>I was surprised that The Onion would ask you for paid membership after reaching a certain number of articles per month despite the fact that The Economist, New Times, Financial Times and other online newspapers have been using it for a while. A while ago, during the time that paid membership was written off to be replaced with advertising revenues, I <a href="http://http://microintellia.com/blog/2009/06/30/not-all-information-wants-to-be-free/" target="_blank">alluded</a> to the fact that the disappearance of prices was a temporary phenomenon which simply indicated an imbalance between the supply and demand of news.</p>
<p>The current price signals are indicating a rebalancing of supply and demand, a lot faster that I thought it is possible. The newspapers which managed to go thru this process will emerge with much greater strength. With the competition gone they will be able to operate at a scale which before was hard to imagine in order to become the first truly global newspapers.</p>
<p>P.S. The title is a tongue-in-cheek reference to Web 2.0 and whatever it was supposed to mean.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2012/01/30/online-media-30/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The big two</title>
		<link>http://microintellia.com/blog/2011/12/14/the-big-two/</link>
		<comments>http://microintellia.com/blog/2011/12/14/the-big-two/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 21:18:48 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=608</guid>
		<description><![CDATA[I got a feeling that out of the current companies which shape the way people use the internet (Apple, Google, Facebook and Amazon) Google and Amazon have the highest odds to continue do so in the future. Apple seems too concentrated on making devices and Facebook seems trapped into social media, for better or for [...]]]></description>
			<content:encoded><![CDATA[<p>I got a feeling that out of the current companies which shape the way people use the internet (Apple, Google, Facebook and Amazon) Google and Amazon have the highest odds to continue do so in the future. Apple seems too concentrated on making devices and Facebook seems trapped into social media, for better or for worse. Google and Amazon lack a specific purpose, purpose which ultimately acts as a constraint, and as such have a much higher degree of freedom to adapt to the future.</p>
<p>This is not to say that Apple or Facebook are not profitable enterprises, or that their products are fads approaching their expiry date, only that they are bound by the very field they choose to dominate. Just a feeling&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2011/12/14/the-big-two/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Datasift</title>
		<link>http://microintellia.com/blog/2011/11/29/datasift/</link>
		<comments>http://microintellia.com/blog/2011/11/29/datasift/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 21:52:25 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=601</guid>
		<description><![CDATA[I just read this article on highscalability.com and I have to say that I really like the idea of delegating the mining of your data to a another party specialized in handling huge data volumes which can in turn make it available to smaller players.
All the best to the DataSift team, they are building a terrific [...]]]></description>
			<content:encoded><![CDATA[<p>I just read <a href="http://highscalability.com/blog/2011/11/29/datasift-architecture-realtime-datamining-at-120000-tweets-p.html" target="_blank">this</a> article on <a href="http://highscalability.com" target="_blank">highscalability.com</a> and I have to say that I really like the idea of delegating the mining of your data to a another party specialized in handling huge data volumes which can in turn make it available to smaller players.</p>
<p>All the best to the <a href="http://www.datasift.com" target="_blank">DataSift</a> team, they are building a terrific product!!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2011/11/29/datasift/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Adieu Jack Layton</title>
		<link>http://microintellia.com/blog/2011/08/22/adieu-jack-layton/</link>
		<comments>http://microintellia.com/blog/2011/08/22/adieu-jack-layton/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 18:44:26 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=598</guid>
		<description><![CDATA[Une journée triste&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Une journée triste&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2011/08/22/adieu-jack-layton/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Conway&#8217;s Law</title>
		<link>http://microintellia.com/blog/2010/11/29/conways-law/</link>
		<comments>http://microintellia.com/blog/2010/11/29/conways-law/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 12:39:36 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=587</guid>
		<description><![CDATA[I read today a very interesting post on Dan Prichett&#8217;s blog on the way the IT architecture of a large organization is affected by the structure of the organization. For a while I have grown convinced that most of the decisions regarding IT are determined by the underlying organization, but I have not seen it [...]]]></description>
			<content:encoded><![CDATA[<p>I read today a very interesting <a href="http://www.addsimplicity.com/adding_simplicity_an_engi/2010/11/conways-law.html" target="_blank">post</a> on Dan Prichett&#8217;s blog on the way the IT architecture of a large organization is affected by the structure of the organization. For a while I have grown convinced that most of the decisions regarding IT are determined by the underlying organization, but I have not seen it stated so clearly. It is a pretty important statement because it identifies clearly what influences IT architecture the most.</p>
<p>However, I don&#8217; think that the solution proposed by Dan Prichett to correcting the IT inefficiencies can be applied easily to any organization. I see the IT architecture driving the structure of the organization, rather than the reverse, happening mostly in IT-centric companies (<a href="#">*</a>). I don&#8217; see an insurance company or a distribution chain changing the way they do business solely for the purpose of enhancing the efficiency of IT. For a typical company IT is a sunk-cost rather than a strategic asset (<a href="#">*</a><a href="#">*</a>), restructuring a company in order to minimize this particular set of costs, possibly at the expense of other concerns, does not make much sense.<br />
Adapting the IT infrastructure to the organization, and not the reverse, will be the norm for the foreseeable future. In most cases the best that IT can do is to try to reduce costs by automation of various tasks across the organization rather than try to define the organization.</p>
<p><a href="#">Later Edit:</a> Another reason why aligning the organization with the architecture (rather than the opposite) does not apply all the time is that refactoring the architecture will imply re-structuring the organization in order to align it with the new architecture. The already high costs or re-architecting the IT infrastructure may become prohibitive.</p>
<p><a href="#">*</a> I would call an IT-centric company a company that proposes services built around IT or that derives a  competitive advantage from its IT infrastructure. Examples of such companies are eBay, Amazon, Google, online shops, online media companies, etc&#8230; In these type of companies we may derive the organization from the architecture of IT systems because in doing so we enhance the competitive advantage of that company.</p>
<p><a href="#">*</a><a href="#">*</a> For IT-centric companies this does not apply, in their case IT is a strategic asset.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/11/29/conways-law/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Software architecture in 2010</title>
		<link>http://microintellia.com/blog/2010/10/24/software-architecture-in-2010/</link>
		<comments>http://microintellia.com/blog/2010/10/24/software-architecture-in-2010/#comments</comments>
		<pubDate>Sun, 24 Oct 2010 12:54:57 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=581</guid>
		<description><![CDATA[I just finished reading this article by Jean-Jacques Dubray and I am left with the impression that the author blows out of proportions some IT developments.
The article showcases how the Massachussets Department of Transportation decided to open up a bus schedule data feed and found out that within a short period of time a number [...]]]></description>
			<content:encoded><![CDATA[<p>I just finished reading <a href="http://www.infoq.com/news/2010/10/2010-software-architecture" target="_blank">this</a> article by Jean-Jacques Dubray and I am left with the impression that the author blows out of proportions some IT developments.</p>
<p>The article showcases how the Massachussets Department of Transportation decided to open up a bus schedule data feed and found out that within a short period of time a number of client applications started using it. What is really interesting is that these applications provided basically the same functionality across a large number of platforms (iPhone apps, web-site, SMS and IVR systems). Basically MBTA delegated the development of client applications across multiple platforms to parties best suited for doing so.<br />
A pretty neat division of labor emerged: the management of the data feed is carried out by MBTA while the client apps are developed by people at large.</p>
<p>Interesting as it may seem this development is neither new (mash-up have existed for quite a while) nor the beginning of a revolution in IT. This development is just the creation of an eco-system of applications built around MBTA&#8217;s data feed. I don&#8217;t share MBTA&#8217;s enthusiasm over it because delegating the development of client applications to benevolent third parties undermines the reliability of the bus schedules delivery. While this approach did allow them to cover a large number of client platforms without a significant investment it has also created a number of applications which seem to be nothing more that a hobby and which may be taken down without any notice. The eco-system of client apps will evolve over a certain period of time before settling down, during this period the delivery of bus schedules will be as fickle as the applications in charge of it. I am not sure that this is what MBTA had in mind when it opened its data feed to outside parties&#8230;</p>
<p>All in all, an interesting experiment in the relationships between various applications, but not a tipping point for the IT industry.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/10/24/software-architecture-in-2010/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Domain event driven architecture</title>
		<link>http://microintellia.com/blog/2010/09/19/domain-event-driven-architecture/</link>
		<comments>http://microintellia.com/blog/2010/09/19/domain-event-driven-architecture/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 12:10:49 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=566</guid>
		<description><![CDATA[This presentation on domain event driven architecture by Stefan Norberg is a must-see presentation on loosely-coupled distributed systems. The solution of implementing cross-cutting concerns over a large number of heteregenous systems by having these systems issue domain events is one of the most elegant I have seen.
A point that I found very interesting is that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.infoq.com/presentations/Domain-Event-Driven-Architecture" target="_blank">This presentation</a> on domain event driven architecture by Stefan Norberg is a must-see presentation on loosely-coupled distributed systems. The solution of implementing cross-cutting concerns over a large number of heteregenous systems by having these systems issue domain events is one of the most elegant I have seen.</p>
<p>A point that I found very interesting is that systems must communicate via events and not via commands. For a system (master system A) to issue a command on another system (executing system B) it needs to know the context in which the command should be issued on system B. Requiring system A to have knowledge about the inner workings of a remote system in order to be able to carry out its tasks is typically how hard-coupling between systems starts.<br />
The solution outlined by Stefan Norberg is to split the business logic for a specific domain into gathering data required for executing a certain task, transforming it into events and issuing events (perfomed by multiple systems), channeling the events to the system implementing the domain (typically performed by an ESB) and the implementation of the domain (performed by the system which receives the events from the ESB and uses them either for creating domain-specific commands or for creating the context in which domain-specific commands are executed). This partition of tasks scales very nicely as the number of systems and domains grow.</p>
<p>Another point that I found interesting was that this architecture requires the delivery of events in the order they were created. Some events are used for creating the context in which the events which are transformed into commands are running and therefore the events that create the context need to be processed before the events which are transformed into commands.<br />
Let&#8217;s give an example. Suppose that the systems involved are a user management system, a bet processing system and a system managing user loyalty. Let&#8217;s say that we have this use case: user creates an account and then bets 5000$ on a horse race. For the sake of argument let&#8217;s assume that this use case involves the generation and dissemination of 2 events: UserCreatedEvent and UserPlacedBet event. Now let&#8217;s suppose that the system managing user loyalty receives the 2 events and is ready to process the UserPlacedBet event by checking the size of the bet and carrying out the appropriate command. Let&#8217;s say that for this command to the executed the user must exist in this system&#8217;s database. It follows that the UserCreatedEvent should have been processed before the UserPlacedBet event in order to create the context (in this case the context consists of relevant user data) in which the UserPlacedEvent could be turned into a command and executed.</p>
<p>A presentation which covers the use of domain events from a large number of angles (enterprise architecture, management, physical implementation) and which should be watched by anyone interested in large scale distributed systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/09/19/domain-event-driven-architecture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>European dilemmas</title>
		<link>http://microintellia.com/blog/2010/08/04/european-dilemmas/</link>
		<comments>http://microintellia.com/blog/2010/08/04/european-dilemmas/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 16:37:56 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=553</guid>
		<description><![CDATA[&#8220;Growth now depended more on the operation of markets, something that sits uneasily with the institutional inheritance. Innovation-based growth  is risky, uncomfortably so for security-oriented European societies. It responds to financial incentives, which is difficult to reconcile with the value Europeans assign to earnings equality. It requires continous reallocation of labor resources, which is at [...]]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;Growth now depended more on the operation of markets, something that sits uneasily with the institutional inheritance. Innovation-based growth  is risky, uncomfortably so for security-oriented European societies. It responds to financial incentives, which is difficult to reconcile with the value Europeans assign to earnings equality. It requires continous reallocation of labor resources, which is at odds with the importance they attach to job security&#8221;.</em><br />
Barry Eichengreen - The European Economy since 1945: Coordinated capitalism and beyond.</p>
<p>A pretty good picture of the difficult terrain that Europe has to navigate.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/08/04/european-dilemmas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Domain driven development and agile methods</title>
		<link>http://microintellia.com/blog/2010/07/31/domain-driven-development-and-agile-methods/</link>
		<comments>http://microintellia.com/blog/2010/07/31/domain-driven-development-and-agile-methods/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 16:11:46 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=526</guid>
		<description><![CDATA[Watching Eric Evans explaining how to incorporate agile methods in domain driven design gives you an understanding of some of the differences and commonalities between domain driven development and agile methods.
Agile methods grew out of the fact that up-front design which involved months of analysis was getting out of synch with the world which required [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.domaindrivendesign.org/node/198" target="_blank">Watching</a> Eric Evans explaining how to incorporate agile methods in domain driven design gives you an understanding of some of the differences and commonalities between domain driven development and agile methods.</p>
<p>Agile methods grew out of the fact that up-front design which involved months of analysis was getting out of synch with the world which required faster development cycles and the need to adapt to a world changing at high speed (<a href="#">*</a>). However, the responsiveness of agile methods and their focus on the next iteration limited development the scope at which development is carried out and eliminated the design phase out of the development process. The result were applications for which development slowed, if not even stopped, once the application reached a certain complexity.</p>
<p>Eric argues that in order to fix this problem we need to bring domain driven design back into the picture, but different from the top-down, process-heavy manner in which it was conducted before. The main reason modelling an application iteratively is that the development of an application is a learning process, a process of discovering and annotating a particular domain.</p>
<p>Some agile techniques such as the ability of reacting swiftly to changes and to be able to perform significant changes late in the game are presented, but they seem to me to be liabilities rather than assets. Performing a significant change late in the game is a very expensive operation since it is essentially a re-organization of the concepts encapsulated in the model followed by the confusion generated by the dissemination of the new model; such things should be avoided at all costs. Rapid changes in the model are also bad since they can create confusion.</p>
<p>One agile practice which I think benefits domain driven design is the break-down of the design process in iterations during which new domain concepts are inserted into the model. It is very important that these iterations also make sure that the model stays in synch with the domain in order to avoid late, massive and expensive domain re-factorings. In order to do this Eric outlines a series of diagnosis measures used for detecting when the model is straying away from the model.<br />
While these measures are necessary what is missing in this process is a way for the domain expert to validate the model. The knowledge transfers have no feed-back loop from the domain experts. The developer seems the sole owner of the model, ideally the domain expert could become more engaged in the definition of the model rather than a passive disseminator of knowledge.</p>
<p>Modelling brand new domains or domains in a state of change will probably always be error-prone because the development of an application in a such a domain is a discovery process for all the parties involved (from users to business analysts to developers) whose end-result is defining the domain. In such an environment probably the only way to define and disseminate domain knowledge is to set-up sessions with domain experts. However, knowledge transfers in mature domains should be handled differently in order to leverage the existing knowledge. It is a good idea to get into the domain by first reading up on it and then engaging in knowledge-transfers with domain experts.</p>
<p>Eric Evans covers a lot of ground in his talk from the methodology of transferring domain knowledge to diagnosing misalignments between the model and the domain, solutions to correcting such misalignments and strategies for coordinating teams working on the same project. However, I wish he would have talked a bit about the structure and skill-sets of the teams involved in domain-driven development, of the ways to disseminate domain knowledge into a team and of how to engage the domain experts in reviewing and providing feed back on the domain being developed.<br />
All in all a very good presentation which I encourage people to watch.</p>
<p><a href="#">*</a> The rejection of the analysis phase by agilists could partially be explained by the fact that the agile movement started at a point where appeared brand new domains (such as e-commerce, e-marketing, content management) which were in a continous state of transformation and for which there was no prior knowledge. Analysis in this case was viewed, to a certain extent correctly, as a process which requires significant investements (in order to overcome the lack of knowledge) without a clear return (the results could be obsolete in a few months due to unforeseen changes).<br />
At the same time the revolution in communications created the opportunity to add on stakeholders previously considered un-related to the domain. Encapsulating requirements in an application from unfoereseen stakeholders meant that the domains became more prone to change and harder to predict.<br />
These factors contributed to the misconception that analysis hinders rather than helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/07/31/domain-driven-development-and-agile-methods/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Managing complexity with regression tests</title>
		<link>http://microintellia.com/blog/2010/05/24/managing-complexity-with-regression-tests/</link>
		<comments>http://microintellia.com/blog/2010/05/24/managing-complexity-with-regression-tests/#comments</comments>
		<pubDate>Mon, 24 May 2010 10:03:21 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=516</guid>
		<description><![CDATA[In this post I will go briefly over some important issues regarding regression testing and they can be used for managing complexity that I have come across in my experience.
A batch of regression tests covering an appropriate part of an application is a very good strategy to deal with growing complexity. Furthermore, the more complex the [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I will go briefly over some important issues regarding regression testing and they can be used for managing complexity that I have come across in my experience.</p>
<p>A batch of regression tests covering an appropriate part of an application is a very good strategy to deal with growing complexity. Furthermore, the more complex the application the higher the need for regression tests because as systems become more complex the components that make them up tend to become unwieldy (<a href="#">*</a>). In a heterogeneous team with a high variation in skill sets the regression tests are probably best written and carried out by the most experienced members of the team (it goes without saying that the implementation of some functional aspect and the test covering it should be done by 2 separate persons). If the tests are written by the most experienced team members this renders them more expensive, as a result care should be taken regarding the scope of these tests. I generally consider that regression tests should cover higher-value use-cases at a higher scope and that this scope has implications for the testing infrastructure.</p>
<p>The tests themselves should be isolated from testing infrastructure concerns and should focus mostly on the domain that is being covered. A pretty good discussion of these items can be found <a href="http://www.infoq.com/articles/layered-test-automatation" target="_blank">here</a>. However, the tests should also be run in an environment as close to the production environment as possible, having seen an instance where tests covering an application deployed on a legacy database were passing without even inserting a single record in the DB only to have the application have problems later in PROD because of legacy datastructures.</p>
<p>Manual regression tests are expensive and this high cost has some bad side effects apart from having a higher price-tag: manual regression tests tend to be executed late in the release process. Also, by the fact that they take longer (being manual) they tend to cut deeper into the safety buffer dedicated to fixing bugs found during the release process. In order to solve this problem the regression tests should be in a format which allows them to be carried out early in the development process in order to detect problems early, ideally as close as possible to the development. This would mandate that the regression tests have a high degree of automation and a certain level of embedment into the development process.</p>
<p>Ideally, automated regression tests should be written in a format that ensures that the tests can be manipulated with ease by both developers (in order to be able to run them at an early stage in the development process) and by domain experts/business analysts (in order to prove their validity). A solution which may satisfy these 2 different audiences could be regression tests written in the programming language of the application by experienced team members and which are read-able by domain experts (<a href="#">**</a>). For complex domains the testing infrastructure may need to be adapted in order to satisfy the second point as well.</p>
<p><a href="#">*</a> Components become out of synch with the required functionality as the complexity that they need to cover grows. Most of the time this misalignment is due the fact that the development pace is too fast and the information for correctly re-designing components for new functionality is unavailable. As components become unwieldy the need to refactoring appears and with it the need for regression tests which are a key component in the refactoring process.</p>
<p><a href="#">**</a> In practice, however, it is pretty costly to create a test environment that satisfies these 2 different audiences. This is why automated regression tests are typically written in the language used for development with senior team members acting as domain experts for writing tests of validating tests written by team members.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/05/24/managing-complexity-with-regression-tests/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DDD and IT management</title>
		<link>http://microintellia.com/blog/2010/04/23/ddd-and-it-management/</link>
		<comments>http://microintellia.com/blog/2010/04/23/ddd-and-it-management/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 12:31:29 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=488</guid>
		<description><![CDATA[This Infoq presentation on DDD reminded me of some opinions that I wrote a while ago about DDD and about how it can be effectively applied in a typical development environment.
From my experience there are a few obstacles to using DDD in a typical development environment and one of them is the vagueness which accompanies [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson" target="_blank">This</a> Infoq presentation on DDD reminded me of some opinions that I wrote a while ago about DDD and about how it can be effectively applied in a typical development environment.</p>
<p>From my experience there are a few obstacles to using DDD in a typical development environment and one of them is the vagueness which accompanies the definition of different artifacts (entities, value objects, etc&#8230;), vagueness which sometimes may generate conflicts (<a href="#">*</a>). The same vagueness works against the size of the development team and the distance between developers (<a href="#">*</a><a href="#">*</a>). DDD is probably best applied in settings which minimize both the potential conflicts and additional overhead of creating and distributing new concepts: small teams of experienced developers in close geographical proximity.<br />
DDD projects tend to exhibit a high degree of closeness between the code and the domain which is a pretty good thing. Code which binds to the domain closely tends to &#8220;document&#8221; the domain and drive down the time for making knowledge transfers.</p>
<p>Given that DDD is best applied at the high-end spectrum of the IT workforce it follows that it can act as a big differentiator in the productivity of development teams as it further increases the productivity of experienced developers away from the productivity of less experienced developers. However, the gains in productivity may be counter-balanced by the reduced size of the available developer pool and the higher costs and dependencies associated with it.</p>
<p>I would conclude with the fact that the current way of promoting DDD probably works against it. Typically DDD is portrayed as an art-form or craft available to the lucky few which can appreciate and exploit its finesse. This is a pretty good way of driving the typical IT project manager away, IT managers really disliking to rely on artisans rather than on professionals.<br />
For DDD to be applied at a larger scale it needs to be accepted by the business and for this it needs a more &#8220;professional&#8221; image. Rather than focusing on the &#8220;beauty&#8221; of various DDD patterns the  DDD community should probably focus a lot more on how to better formulate and deliver DDD best practices to a large audience. This, or it risks to remain at the fringes of software development.</p>
<p><a href="#">*</a> These conflicts are usually generated when developers cannot agree on a particular design. Given that DDD pushes design right into the core of the software development process these conflicts are bound to appear more often. In order to minimize these conflicts a certain level of experience in software modeling, of communication skills and, to a certain degree, of negotiation skills is needed. All this, in return, requires experienced developers. It may also require to have a domain expert handy (which is typical of DDD projects where the domain expert is a key person in the development process) in order to proof-read the design.</p>
<p><a href="#">**</a> Size and geographical proximity of teams are determined by the costs of effective communication (costs which usually increase with size and distance). To these communication costs we need to add the costs of debating vague concepts, of defining them and disseminating the knowledge required for manipulating them. These additional communication costs come at the expense of the usual communication costs and require them to be reduced.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/04/23/ddd-and-it-management/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Replaying requests in flows</title>
		<link>http://microintellia.com/blog/2010/03/29/replaying-requests-in-flows/</link>
		<comments>http://microintellia.com/blog/2010/03/29/replaying-requests-in-flows/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 13:31:42 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=478</guid>
		<description><![CDATA[
If you followed various presentations on Event Driven Architecture for a while you must be familiar with one advantage that many people talk about without going into detail: the ability to recover from crashes simply by re-playing events that were sent to your system. Most presentations give the impression that a flow-based system based on [...]]]></description>
			<content:encoded><![CDATA[<div class="snap_preview">
<p>If you followed various presentations on Event Driven Architecture for a while you must be familiar with one advantage that many people talk about without going into detail: the ability to recover from crashes simply by re-playing events that were sent to your system. Most presentations give the impression that a flow-based system based on passing messages is born with this ability, but the reality is that it must be designed in order to implement such a functionality.</p>
<p>When designing such a system you first have to ask yourself if you need this ability and I would say that the answer in quite a few cases is yes. The most basic recovery from crashes for a flow-based system consists of the message broker booting up, determining what messages have to be sent and re-sending the messages to the message consumers. Chances are that re-sending the exact messages that caused the crash will cause another crash and in order to avoid this you should be able to wipe out the message store, determine what events need to be re-played and replay them in an orderly fashion till your system goes back to its normal state.</p>
<p>Next, you should determine how to design such a system. One way to design it would be to code the stages as idempotent operations, that is, operations which when carried out multiple times give the same results. However, sometimes the stages of the model of the system are not easily captured in idempotent operations and sometimes it is downright impossible (<a href="#">*</a>).<br />
Another way to design it would be to break the flow into stages and the stages into 2 categories: idempotent stages and non-idempotent stages (<a href="#">*</a><a href="#">*</a>). Next, record the requests that come in and record each stage that a request has completed successfully. For non-idempotent stages also record the state of the request after their completion. Replaying requests in such a system consists of determining what requests are in non-idempotent stages and replaying them from these stages. For example, let’s say that you have a system that accepts orders, performs matchings on them (matches buys to sells), creates fills out of these matches and sends the fills out to an outside application. This system has 4 stages: order receival, order matching, fill creating and fill forwarding. Let&#8217;s say that order receival is a non-idempotent operation, order matching is an idempotent operation, fill creation is a non-idempotent operation and fill forwarding is another non-idempotent operation. In order to design such a system for re-play you will need to track a request across all the stages, determine what requests are in non-idempotent stages and in the case you need to replay the requests to replay them from the non-idempotent stages.</p>
<p>Replaying requests could also help you releasing a new version of the system in which the classes of objects which are sent from one stage to another change. Typically when such a release is carried out any message in transit cannot be processed anymore because of class versioning exceptions, adding the option of replaying the requests after updating the flow with the latest release would help solve this problem.</p>
<p><a href="#">*</a> One example of an operation which may not be able to be made idempotent is sending messages to an external party. For this operation to be idempotent it would be necessary for the external party to be idempotent (that is, it would mean that the same message sent multiple times to the external party would have the same effect). This assumption sometimes turns out to be invalid.</p>
<p><a href="#">*</a><a href="#">*</a> One example of a idempotent stage is a stage that performs some transformation/computation on the messages it receives and that forwards the messages to another stage. One example of a non-idempotent stage is a stage that persists data to a datastore or sends messages out to a non-idempotent external application.</div>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2010/03/29/replaying-requests-in-flows/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Replication of data and replication of functionality</title>
		<link>http://microintellia.com/blog/2009/12/17/replication-of-data-and-replication-of-functionality/</link>
		<comments>http://microintellia.com/blog/2009/12/17/replication-of-data-and-replication-of-functionality/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 17:10:58 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=476</guid>
		<description><![CDATA[From my experience I see that replication of data usually helps deal with performance problems, but that sometimes this replication involves replication of functionality, sometimes you end-up replicating some data on a different system (let&#8217;s call this the client system) and then you find yourself needing to code on the client system some piece of [...]]]></description>
			<content:encoded><![CDATA[<p>From my experience I see that replication of data usually helps deal with performance problems, but that sometimes this replication involves replication of functionality, sometimes you end-up replicating some data on a different system (let&#8217;s call this the client system) and then you find yourself needing to code on the client system some piece of business logic which resides on the system from where data comes originally from (let&#8217;s call this system the master system).</p>
<p>More often than not this is a pretty scenario, because every modification to the business logic done on the master system has to be re-coded on the client system. Sometimes you find that you need to coordinate the releases of these 2 separate systems in order make the whole picture functionally consistent. One way to avoid re-coding the business logic on the client system is to expose the business logic on the master system thru some remoting mechanism (EJBs, Hessian, etc&#8230;) and then have the client system pass the data that it replicated locally to the master system in a synchronous call. While this solves the fact having the same business logic reside in 2 places it makes the client system dependent on the master system (<a href="#">*</a>).</p>
<p>One solution to the above conundrum that is to replicate the data, along with the results of carrying out that piece of business logic on that data, to the client system. With this arrangement the client system does not need to have the master system up and running and it also does not need to re-code the same business logic inside. If you manage to use this (this approach doesn&#8217;t work in all cases) you will find yourself exporting business logic asynchronously by exporting both data and the results of carrying out that business logic on the data.</p>
<p>If I don&#8217;t write another post till January I wish you a Happy New Year!!!!!</p>
<p><a href="#">*</a> There is a physical dependency (the client systems needs the master system up and running for it to service calls) and possibly a library depedency which may couple the release cycles of these 2 systems (if the client system communicates with the master system thru objects rather than thry wire protocols you will need to synchronize the release cycles of these 2 systems in order to make sure that the client system doesn&#8217;t run in PROD with obsolete libraries).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/12/17/replication-of-data-and-replication-of-functionality/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Non-blocking flows</title>
		<link>http://microintellia.com/blog/2009/10/27/non-blocking-flows/</link>
		<comments>http://microintellia.com/blog/2009/10/27/non-blocking-flows/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 13:13:25 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=467</guid>
		<description><![CDATA[Recently I was working on a business flow to which we had to add a new requirement: grouping a particular type of transactions under a file. The file had to be unique per day, it had to be created on the fly when the transaction batch starts getting processed and the transactions had to be [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I was working on a business flow to which we had to add a new requirement: grouping a particular type of transactions under a file. The file had to be unique per day, it had to be created on the fly when the transaction batch starts getting processed and the transactions had to be assigned to it at the end of processing. The first solution that one could think of is to change the flow to check if the file exists (and if no then we would create it) and after this check we would assign the transactions to that trade file.</p>
<p>However, doing only this would pose a concurrency problem, namely that two or more transactions batches arrive at the same time when no trade file has been created yet. If each transaction batch would check if the trade file exists concurrently and try to create it, again concurrently, we could end up with duplicate trade files. One way to avoid duplicate trade files is to detect if a trade file needs to get created, allow one of the transaction batches to create the file while blocking the other transaction batches till the trade file gets created. We looked at the costs of blocking and as the costs looked pretty small (we would be blocking only once time per day when the file gets created) we decided to go ahead with blocking.</p>
<p>However, this approach clearly doesn&#8217;t scale, and we implemented it because it the conditions for blocking happen very rarely (as I was saying once per day) and it would not be feasible in the case of a higher amount of contention. We looked at some non-blocking alternatives and it looks like a good one would be to allow the transactions to check if trade file exists and if not then to create the trade file on the fly (without blocking) and at the end of transaction processing send further a message saying that there is a risk that some data is inconsistent (namely that there is the risk that some files have duplicates and transactions are assigned to duplicate files) and establish a procedure for repairing the transactions (if necessary). This would allow for non-blocking flows and higher thru-put, but it would come at the expense of a period of time in which data is inconsistent (in our case there is the risk that some transactions will be assigned to duplicate trade files till the duplicate trade files get fixed).</p>
<p>If inconsistent data is OK for the business and the rest of the application (it could be that these repair procedures as well as inconsistent data affect other parts of the application) and if blocking flows are creating significant performance problems then allowing for data to be inconsistent for a certain period of time while providing a mechanism for detection and repair of inconsistencies would probably solve the problem.</p>
<p>Another solution to this problem would be to detect messages which may cause blocking and create a new stage in the flow which deals with such messages.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/10/27/non-blocking-flows/feed/</wfw:commentRss>
		</item>
		<item>
		<title>When knowledge is a liability and not an asset</title>
		<link>http://microintellia.com/blog/2009/09/26/when-knowledge-is-a-liability-and-not-an-asset/</link>
		<comments>http://microintellia.com/blog/2009/09/26/when-knowledge-is-a-liability-and-not-an-asset/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 11:34:36 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=465</guid>
		<description><![CDATA[Typically knowledge is considered to be an asset, some going as far as saying that knowledge is power. Well, when you design interactions between systems is better to avoid systems know too much about each other. Having deep knowledge about a system with which you are integrating is both a moral hazard (it gives you [...]]]></description>
			<content:encoded><![CDATA[<p>Typically knowledge is considered to be an asset, some going as far as saying that knowledge is power. Well, when you design interactions between systems is better to avoid systems know too much about each other. Having deep knowledge about a system with which you are integrating is both a moral hazard (it gives you the opportunity to hack your way out of problems) and creates high transaction/interaction costs (typically the costs of transferring this deep knowledge to someone else).<br />
The same reasoning goes for interaction between modules in a single system, please check out this <a href="http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf" target="_blank">article</a></p>
<p><a>P.S.</a> I was shocked to see the date on that article: 1971. The fact that we are still struggling with these problems shows a pretty big problem with computer science. Most people equate computer science with exotic algorithms, it would be about time to add to this equation software modelling. It is pathetic when useful concepts for writing software developed 30 years ago are still unknown to the typical developer.<br />
Software development has a pretty big educational problem (most developers educate themselves on their own and learn on the job), it would not be a bad idea to address it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/09/26/when-knowledge-is-a-liability-and-not-an-asset/feed/</wfw:commentRss>
		</item>
		<item>
		<title>VMWare acquires SpringSource</title>
		<link>http://microintellia.com/blog/2009/08/13/vmware-acquires-springsource/</link>
		<comments>http://microintellia.com/blog/2009/08/13/vmware-acquires-springsource/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 19:52:31 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=453</guid>
		<description><![CDATA[Decidedly, this is the acquisition season. After Oracle buying BEA it is now the time for VMWare to acquire SpringSource. I wonder what VMWare gets from this acquisition and different from a partnership with SpringSource and the only thing that I can think of is the exclusivity of selling certain types of higher-value virtual machines.
To [...]]]></description>
			<content:encoded><![CDATA[<p>Decidedly, this is the acquisition season. After Oracle buying BEA it is now the time for VMWare to acquire <a href="http://blog.springsource.com/2009/08/10/springsource-chapter-two/" target="_blank">SpringSource</a>. I wonder what VMWare gets from this acquisition and different from a partnership with SpringSource and the only thing that I can think of is the exclusivity of selling certain types of higher-value virtual machines.<br />
To make this more clear: VMWare probably has a cloud offering, similar to <a href="http://aws.amazon.com/ec2/" target="_blank">Amazon Elastic Compute Cloud</a> offering. EC2 has started by selling bare-bones images and moved onto selling higher-value images, also known as <a href="http://www.google.com/search?hl=en&amp;q=amazon+machine+image&amp;aq=0&amp;oq=amazon+machine+ima&amp;aqi=g5" target="_blank">Amazon Machine Images</a> (the idea is that you could sell/make available your software - application server, database, content management server, etc&#8230; - as an Amazon image and charge per usage for the use of the original Amazon image + the use of your application). It is possible that VMWare will move onto selling higher-value virtual machines thru its cloud offering as well. Now that VMWare has acquired SpringSource it is very likely that they will start selling enterprise virtual machines equiped with all the packages present in SpringSource&#8217;s portfolio (which also includes some higher-value packages such as Spring Batch, Spring Integration, etc&#8230;). As SpringSource is now under VMWare I would not be very surprised if VMWare will get the exclusivity of providing enterprise, Spring-enabled, higher-value virtual machines (apparently this is not the case, check below). Not sure if it is feasible, but VMWare could even adapt Spring&#8217;s higher-value packages into specialized virtual machines (for example , a virtual machine running Spring Batch fine-tuned for batching needs).</p>
<p>If this happens it could happen that VMWare will become the premier hosting service for cloud-deployed enterprise Java applications and for specialized, Java-powered, cloud-deployed enterprise services. If the cloud is the future of application hosting (frankly, I would not bet the farm on it) then VMWare will be the hub where Java applications will be hosted (the difference between hosting a Spring application with VMWare and with a different cloud provider would be the difference between a virtual machine specialized for running Spring applications and an all-purpose virtual machine. This difference in the efficiency of hosting a Spring application would drive more users to VMWare&#8217;s clouds).</p>
<p>Still, 420 million dollars is a pretty big sum of money, especially in the current economic climate, and we will have to see if VMWare and SpringSource will find the synergies which will make them pairing together more than the sum of their parts.</p>
<p>Congratulations to Rod Johnson, Adrian Colyer, Juergen Hoeller and the rest of the Spring team and all the best to VMWare and SpringSource!!</p>
<p><a href="#">Later edit:</a> It looks like you can buy <a href="http://aws.typepad.com/aws/2009/08/springsource-cloud-foundry-enterprise-java-in-the-cloud.html" target="_blank">Spring-images on Amazon&#8217;s Cloud</a> thru a company called Cloud Foundry which was acquired by SpringSource. I am still trying to figure out why VMWare bought Spring Source rather than entering a licensing agreement with them. I guess we have to wait and see.</p>
<p><a href="#">Later edit:</a> According to Adrian Colyer <a href="http://blog.springsource.com/2009/08/13/virtualization-enterprise-java/" target="_blank">this</a> is the future of how Java applications will be deployed. Still, I don&#8217;t buy into the cloud hype, I think that for the near future cloud adoption will be determined mostly by prices for different pieces of hardware. Maybe at one point there will be a difference in the efficiency of managing applications deployed in a cloud versus the ones deployed outside which would compensate for the differences in price of hosting an instance locally or on the cloud, but I don&#8217;t think we are near this point.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/08/13/vmware-acquires-springsource/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Copyright as a fading concept</title>
		<link>http://microintellia.com/blog/2009/08/09/copyright-as-a-fading-concept/</link>
		<comments>http://microintellia.com/blog/2009/08/09/copyright-as-a-fading-concept/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 02:11:30 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=451</guid>
		<description><![CDATA[I have been reading lately A History of Economics: The Past as the Present by John Kenneth Galbraith and one of its main ideas, namely that economic concepts are the product of the times and societies they are born rather than the other way around, made me look at the concept of copyright from a different perspective.
The [...]]]></description>
			<content:encoded><![CDATA[<p>I have been reading lately <a href="http://www.amazon.com/History-Economics-Past-Present-Penguin/dp/0140153950/ref=sr_1_7?ie=UTF8&amp;qid=1249056007&amp;sr=8-7" target="_blank">A History of Economics: The Past as the Present</a> by John Kenneth Galbraith and one of its main ideas, namely that economic concepts are the product of the times and societies they are born rather than the other way around, made me look at the concept of copyright from a different perspective.</p>
<p>The copyright concept is tied to the ability to make copies: when this ability did not exist (such as prior to the phonograph) or was severely impaired (such as during the vinyl era) the concept of copyright did not exist because there was no need for it. Copyright appeared when music recording moved to a medium which allowed for music to be copied easily enough for music buyers to make their own copies (roughly around the introduction of the compact cassette), hence the introduction of the right to copy. In the current environment characterized by very low copy costs and very inefficient means of enforcing rights to owning a copy you could say that the concept of copyright is living its last moments.</p>
<p>Copyright may appear to future historians as a concept which lasted for a period of time during which the ability to copy content was both developed enough to worry content creators and distributors about people getting content without paying for it and at the same time it was under-developed enough to allow the content creators and distributors to develop mechanisms for controlling content copies. Once the ability to copy and share content became  utiquitous the right to a copy of content ceased to exist as the means of enforcing this right started to weaken.</p>
<p>The question that is posed quite frequently is what will happen to musicians since they will not be able to profit from copyright due anymore? I would say that you could compare their fate to the fate of musicians before the concept of copyright started to exist; which means looking at music before the introduction of the compact cassette ( whose low copying costs allowed for easier manufacture of copies, which in turn allowed for greater diversity in music): musicians would either attain the status of Enrico Caruso and make their living by selling music copies or would rely on gigs building a more or less devoted following. The main difference between a musician relying on gigs in 1910 and 2010 would be that the musician living in the 2010&#8217;s would act at a global scale (in terms of distributing and marketing his music, of setting up a tour, of building a fanbase, etc&#8230;) while the musician living in the 1910&#8217;s would probably have acted at a local scale.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/08/09/copyright-as-a-fading-concept/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Old and new media</title>
		<link>http://microintellia.com/blog/2009/07/29/old-and-new-media-2/</link>
		<comments>http://microintellia.com/blog/2009/07/29/old-and-new-media-2/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 14:42:11 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=440</guid>
		<description><![CDATA[For the past 2 weeks I have been staying at home without a computer and without cable TV. I took this opportunity to try to see how my grand-parents would get their news and read newspapers all thru-out this period. When I went back to work and back to a computer I saw that I [...]]]></description>
			<content:encoded><![CDATA[<p>For the past 2 weeks I have been staying at home without a computer and without cable TV. I took this opportunity to try to see how my grand-parents would get their news and read newspapers all thru-out this period. When I went back to work and back to a computer I saw that I have not missed much, the newspapers covered all the major events of this small period: ethnic unrest in China, a continous drop in equity markets and the subsequent re-bound, etc&#8230; The number of news that got to me thru this channel was a lot smaller than the usual number of news that I get, but I found that the coverage was way better and the subjects were treated in depth.</p>
<p>I think that the main difference between the old media and the new media is that the old media is delivered thru a vastly more narrow channel than the new media, and that the width of this delivery channel pretty much dictates the format and the news that reach you.</p>
<p>Your typical daily is a newspaper with a limited number of pages. The number of pages is both large enough so that it allows the daily to cover more sections, but at the same time small enough to keep the number of sections in check. A typical daily ends up having Local, National, International, Business and Sports sections.<br />
The limited number of pages means that the stories are competing with each other in order to get printed. The result is that a daily covers only the issues which are the most important to its readership. Some print dailies try to compensate for the limited amount of articles that they make available by the quality of these articles (this partly supports the case of print media moving into the luxury goods category because of the scarcity of items its format can deliver when compared with new media).<br />
The limited number of pages also means that there is competition between the journalists wanting to  get published, and this further enhances the quality of the news paper, typically print media which has a large supply  of journalists (New York Times, Washington Post, Los Angeles Times, etc&#8230;) tends to print articles of very good quality as only the best journalists get published.</p>
<p>New media changes all this: the very wide channel along which content gets pushed to readers increases the diversity of the content and while it dimishes its quality. The only constraint that I see on content consumption in new media is not the scarcity of supplied content, but rather the opportunity cost which comes with consuming a particular piece of content: when you are consuming some content you are forgoing consuming some other content.<br />
I think that opportunity cost will define the way content gets consumed in the new media and that the organizations operating in the new media will have to dedicate a bigger amount of resources to marketing themselves because the competition between new media organizations will be far fiercer as the typical boundaries between content sources disappear (<a href="#">*</a>).</p>
<p><a href="#">*</a> One example of a boundary between content sources which disappears and generates competition is spatial distribution of news papers: New York Times and Los Angeles Times which were not competing with one another previously (each being distributed in different cities they were competing only with local newspapers)  are now competing with each other when they are both distributed via the web.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/07/29/old-and-new-media-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Key-value stores and relational databases</title>
		<link>http://microintellia.com/blog/2009/07/02/key-value-stores-and-relational-databases/</link>
		<comments>http://microintellia.com/blog/2009/07/02/key-value-stores-and-relational-databases/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 16:47:37 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=429</guid>
		<description><![CDATA[Relational databases are going thru a rough patch right now, some pundits going as far as writing them off. Their main problem is the fact that they are constrained to run within the same physical box (*) and scaling out is pretty hard. Once the datasets reach a certain size you will probably need to [...]]]></description>
			<content:encoded><![CDATA[<p>Relational databases are going thru a rough patch right now, some pundits going as far as writing them off. Their main problem is the fact that they are constrained to run within the same physical box (<a href="#">*</a>) and scaling out is pretty hard. Once the datasets reach a certain size you will probably need to look beyond the typical relational database at other ways to store your data.</p>
<p>One type of alternative datastore that is getting a lot of attention is the distributed key-value store which maps values to keys and then assign keys onto multiple storage nods according to a hash function (<a href="#">**</a>). In such a setting you get an object thru a key, you work with it and then you save it back in the datastore. The fact that this configuration scales out easily (<a href="#">***</a>) makes this datastore very appealing, and if you are working with large datasets you will probably have no choice but to use something like it.</p>
<p>The transition from relational databases to key-value stores will probably include taking relations out of your application, re-modelling your application in order to group data together and streaming data to a reporting database. Relational databases gave the user both data storage as well as relations between entities which came as both a blessing and a curse (while relations made reporting easier they also gave un-checked access to data which allowed all sorts of corners to be cut). Well, key-value stores will take relations out: data access is more local, you typically have access only to what is immediate to a particular entity and you cannot perform queries spanning your entire data model. This type of data access could turn out to be actually a good thing, because these very close relationships will force an application to have a cleaner design since you will not be able to rely on monster SQL statements for compensating for design deficiencies.</p>
<p>In an application which needs to handle massive amounts of data relations between data will be delegated to activities which require them (reporting is a pretty good example) and data will be streamed from the key-value stores to the relational databases where these activities take place.<br />
All in all, a pretty good division of tasks: applications with a (hopefully) cleaner model relying on key-value stores streaming data to relational databases for reporting.</p>
<p>All the above doesn&#8217;t mean that relational databases will disappear, the vast majority of applications do not require to process the massive amounts of data which render your typical database unpractical. Relational databases will be around for quite a while.</p>
<p><a href="#">*</a> Obviously, there are database clusters (such as Oracle RACs), but they are pretty costly.</p>
<p><a href="#">**</a> Examples of key-value stores are Google&#8217;s Big Table, Amazon&#8217;s Dynamo and IBM&#8217;s eXtreme scale.</p>
<p><a href="#">***</a> Actually, there are constraints attached to it. In order to get the best performance you need to model your application so that data access occurs within the same node in order to avoid a distributed transaction spanning across multiple nodes. Please read <a href="http://www.devwebsphere.com/devwebsphere/2008/01/constrained-tre.html" target="_blank">this article</a> by Billy Newport from IBM for a better understanding.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/07/02/key-value-stores-and-relational-databases/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Not all information wants to be free</title>
		<link>http://microintellia.com/blog/2009/06/30/not-all-information-wants-to-be-free/</link>
		<comments>http://microintellia.com/blog/2009/06/30/not-all-information-wants-to-be-free/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 21:10:58 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=423</guid>
		<description><![CDATA[I was reading Malcom Gladwell review of Free by Chris Anderson and I was left with the impression that both of them got pretty wrong the issue of information distribution in the current era of low prices for computing power.
I think that Malcom Gladwell makes a mistake when he compares the information required for creating [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading Malcom Gladwell <a href="http://www.newyorker.com/arts/critics/books/2009/07/06/090706crbo_books_gladwell?currentPage=all">review</a> of <a href="http://www.amazon.com/Free-Future-Radical-Chris-Anderson/dp/1401322905/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1246389853&amp;sr=8-1">Free</a> by Chris Anderson and I was left with the impression that both of them got pretty wrong the issue of information distribution in the current era of low prices for computing power.<br />
I think that Malcom Gladwell makes a mistake when he compares the information required for creating a bio-tech medecine (Myozyme) with the information found in a newspaper: one big difference between them being the penalties associated with copyright infrigement: huge in the case of Myozyme and small (and disappearing) in the case of the newspaper. Another difference between the information necessary for creating a medecine and the information stored in a newspaper is the difference between the costs of producing it and the related difference in supply: high costs in the case of a bio-tech company and low in the case of newspaper.</p>
<p>I think that Chris Anderson also makes a mistake when believing that the main costs which define how information is consumed are the costs of distributing information, distributional costs are just one part of the story, one other important cost would be the cost generating the content. Given that in the current period the distributional costs are very low, it would follow that the costs of generating the content would be the bulk of the costs of consuming information (i.e. the cost of consuming information would be identical or very close to the costs of creating the content). Basically what happens right now is that the supply for content is dwarfing the demand for it, we are simply swamped in content. Well, this mismatch between supply and demand drives down the revenues of content sources. In addition to this,  one side-effect of low distribution costs is that various content sources are put in pure and un-distorted competition and it is this competition that is driving even lower the revenues of various content providers.<br />
It appears that the content sources that are not experiencing reduced revenues are the ones for which the content supply is very small when compared to demand (and which creates the scarcity which could allow a content source to charge for usage) and which are not experiencing heavy competition (some financial newspapers being a very good example). If anything these content sources have found in the web a new channel thru which to distributed their small supply of content. I would say that content sources which exhibit both a small supply (small enough to create scarcity), a reasonable demand and not a lot of competition will be the content sources which will be economically viable in the coming years (<a href="#">*</a>).</p>
<p>The near future will be very challenging for the traditional newspapers, because the tremendous amount of excess capacity in this space will have to be reduced thru various means (<a href="#">**</a>). Once reduced, the remaining capacity will probably be small enough to match the demand for the content it produces, and at that point various revenue models will appear. And charging for usage will be part of those revenue models, regardless of what various luminaries think about it.</p>
<p>To sum this post up I would say that the newspapers are in a pretty currently bad corner: the new low distribution costs have put them in fierce competition which resulted in massive excess capacity (<a href="#">***</a>). The excess capacity will be dealt with one way or another and at the end of this process the remaining newspapers will come back to health.</p>
<p><a href="!">Later edit:</a> If you have read enough material on the changes currently affecting newspapers it is very likely that you have come across the concept of &#8220;economics of abundance&#8221;, a term used in science-fiction before the Web2.0 &#8220;revolution&#8221;. In the context of current changes in media &#8220;economics of abundance&#8221; is just another synonim of over-capacity.</p>
<p><a href="#">*</a> Incidentally, niche content sources fit this description pretty well.</p>
<p><a href="#">**</a> The excess capacity could be reduced by differentiation. One example would be New York Times rising the price for its street paper, which some argue that it pushes NYT into the category of luxury goods, differentiating it from the other news papers. Specializing in a new field is another way to direct excess capacity towards more productive uses.</p>
<p><a href="#">***</a> The increased competition between newspapers comes from the fact that while previously the competition was mostly local between local newspapers because content distribution was mostly local in the current period the distribution is global, therefore more newspapers, from any conceivable place, are now competing for the same pairs of eyeballs. Right now the same news item can reach you thru a very large number of channels, while previously it could reach you only thru a few.<br />
I don&#8217;t include the dozens of millions or so of blogs into the excess capacity mentioned above because blogs are not in the same league as newspapers, the differences in quality between a typical blog and a newspaper separate these 2 types of content.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/06/30/not-all-information-wants-to-be-free/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Message translation in GMail</title>
		<link>http://microintellia.com/blog/2009/06/02/message-translation-in-gmail/</link>
		<comments>http://microintellia.com/blog/2009/06/02/message-translation-in-gmail/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 21:20:20 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=409</guid>
		<description><![CDATA[You probably have read about how GMail added a new feature that lets you read messages written in a different language, language that you may not understand, by having them translated into your language. This is a pretty interesting feature that will not get much adoption outside Google labs, the main reason for this being [...]]]></description>
			<content:encoded><![CDATA[<p>You probably <a href="http://www.techcrunch.com/2009/05/19/google-adds-message-translation-to-gmail/" target="_blank">have read</a> about how GMail added a new feature that lets you read messages written in a different language, language that you may not understand, by having them translated into your language. This is a pretty interesting feature that will not get much adoption outside Google labs, the main reason for this being not the quality of the translation (not great) but rather the fact most people need to initiate some sort of contact in order to start exchanging emails.</p>
<p>All this aside, it is a pretty interesting proposition from Google and leaves you wondering about how would a group of persons that communicate with one another by using the translator package just added to GMail outside GMail, let&#8217;s say in a face-to-face environment (let&#8217;s say a group of experts from various places , all speaking a different language attending the same conference). Would they be emailing each other while seated at the same table, given that they do not speak a common language (<a href="#">*</a>)?<br />
A pretty weird feeling is setting in: you may end up having relationships with people only thru this virtual medium which negates all other forms of communication. The language barrier will be replaced by an expressiveness barrier: many things will not be able to be expressed thru this medium and will be left-out.</p>
<p><a href="#">*</a> BTW, the message used in the TechCrunch example is a very good example of a message that would never get translated because it would never be written in a different language: if you want to invite a hiking buddy out for a walk you would probably want to be able to communicate with him/her in a commonlanguage, not thru the GMail translator&#8230; I wonder what a walk thru a park is like when you need to drag along GMail (preferably deployed on your iPhone) in order to talk to someone. Surreal&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/06/02/message-translation-in-gmail/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Laptops vs mobile phones</title>
		<link>http://microintellia.com/blog/2009/05/27/laptops-vs-mobile-phones/</link>
		<comments>http://microintellia.com/blog/2009/05/27/laptops-vs-mobile-phones/#comments</comments>
		<pubDate>Wed, 27 May 2009 19:11:37 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=401</guid>
		<description><![CDATA[I was reading this article on the Experimentia blog and I have to agree with its conclusion: internet applications are turning computing devices from platforms where applications are run into interfaces into various applications deployed remotely. As applications are moved off to the internet it follows that they are accessible to a larger audience as the cost of [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a href="http://www.experientia.com/blog/the-olpc-versus-the-mobile-phone-a-false-dichotomy/" target="_blank">this</a> article on the Experimentia blog and I have to agree with its conclusion: internet applications are turning computing devices from platforms where applications are run into interfaces into various applications deployed remotely. As applications are moved off to the internet it follows that they are accessible to a larger audience as the cost of running those applications shifts from hosting the applications locally (as with desktop applications) to connecting to the applications.</p>
<p>There is one big difference between ordinary desktops and mobile phones, though, the ergonomics. As the feature set of an application increases so increase the demand for a larger interface in order to interact with that richer feature set (which could be deployed remotely, BTW). This would mean that third world consumers will first interact with an application thru a cheap mobile phone, and access a reduced feature set, and as they grow richer they could afford a tool which would allow them to access the same application thru a different, more expensive and graphically more expressive interface (the same application accessed thru a netbook).</p>
<p>The difference in income would drive the difference in access to the very same application. This could allow for identifying customers with higher incomes by the way they access the same free resources&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/05/27/laptops-vs-mobile-phones/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DSLs and APIs</title>
		<link>http://microintellia.com/blog/2009/05/27/dsls-and-apis/</link>
		<comments>http://microintellia.com/blog/2009/05/27/dsls-and-apis/#comments</comments>
		<pubDate>Wed, 27 May 2009 14:23:21 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=367</guid>
		<description><![CDATA[In a previous post I was saying that some technological issues are simply proxies for organizational issues and that whether one techonology will thrive or fail within an organization is not determined exclusively on the technology itself but it could be influenced by the organization itself. I ended the post saying:
For example, you may find [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous <a href="/blog/2008/11/03/task-allocation-and-designing-interactions/" target="_blank">post</a> I was saying that some technological issues are simply proxies for organizational issues and that whether one techonology will thrive or fail within an organization is not determined exclusively on the technology itself but it could be influenced by the organization itself. I ended the post saying:<br />
<em>For example, you may find out that DSLs will not work in particular setting not because DSLs are bad, but because the organization within which these DSLs are implemented and used simply doesn’t warrant their success.</em></p>
<p><em></em>I will get into an example where using DSLs is probably not a good fit because of organizational issues rather than inner strengths and weaknesses. Let&#8217;s say that you have some distributed teams working on the same application and that these distributed teams are led by a team of architects which need to create an environment in which these distributed teams work together. I find it pretty hard to see how this environment could be constructed using DSLs, particularly iteratively-developed DSLs, because changes in the DSL would have to be propagated across multiple teams in dispersed locations which would need to be re-trained for every iteration. Compare this approach with creating an API that would be released every so often and for which re-training costs are very small.</p>
<p>I have the impression that the main cost of DSLs is the distance between the place where the DSL is produced and the place where the DSL is consumed and that DSLs tend to be either specific to the location where they are produced or widely known and used within a community (in the second case the distance between the DSL producer and the DSL consumer is compensated by &#8220;mind-share&#8221;). I would say that the main difference between a DSL and an API is that DSLs are more tightly bound to the domain (by definition) and that part of the costs of using a DSL is the cost of transferring the knowledge about that domain between various stake-holders. This would mean that domain experts can adapt to a DSL targetting their domain faster than a typical developer that is new to the domain and that domain experts would be more productive. The difference in productivity between various members of the work-force means that the work-force composition should partly drive the decision to choose a DSL or APIs on a particular project. Regarding the distance between DSL production and DSL consumption <a href="http://www.voxeu.org/index.php?q=node/3276" target="_blank">this paper</a> discussing how distance affects knowledge transfers is probably a good read.</p>
<p>Other issues wih DSLs such as developer lock-in (a developer working with a DSL can become out of synch with the rest of the IT landscape), the lack of language design skills on the IT job market, the problem of capturing domain knowledge correctly in large or rapidly changing domains are not explored in this post.</p>
<p>I end this post hurriedly&#8230;</p>
<p><a href="#">Later Edit:</a> I was watching <a href="http://www.infoq.com/interviews/simonyi-on-intentional" target="_blank">this</a> interview with Charles Simonyi and I would say I remained with these impressions:<br />
If the DSL comes from an already existing language, such as domain experts notations, then there are chances that the DSL will be a good language (this addresses the issue of lack of language design skills on the IT job market). The problem of creating a new language is done away with by re-using a currently used language (the domain experts notations) and creating a new way to implement this existing language.<br />
Regarding domains which are changing rapidly Charles Simonyi says that by separating the notation from the actual domain schema it becomes pretty easy to change the notation (the DSL) without affecting the underlying domain schema. Creating a DSL becomes an iterative process.<br />
End-user programming is to remain a pipe-dream because of the difference in skills between what is needed for programming and the difference in skills needed for working within the domain. DSLs seem to engage the domain expert more into the process of software creation rather than turn domain experts into programmers. Domain experts contributions to software creation thru DSLs may be simply to communicate the domain better to a programmer. Language work benches would create a new division of tasks according to skills.</p>
<p><a href="#">LLE:</a> I watched this <a href="http://www.infoq.com/presentations/intentional-software" target="_blank">presentation</a> by Intentional Software on domain work-benches and I remained with these impressions:<br />
In an environment where domain workbenches are used it looks like the programmer will be involved in creating projections to an operational environment. The developer will focus on the systems while the  domain experts will focus on the business logic. This division of tasks addresses the issues arising from developers&#8217; lack of enthusiasm about the domain.<br />
It looks like domain work-benches should be used in large and rapidly changing domains where the transfer of knowledge from domain experts to developers is very costly due to the size of the domain and the speed at which it moves (this answers one of my questions above).</p>
<p>I think that the argument that I was making above that DSLs will be location-specific still applies even with a domain workbench in the picture because knowledge transfers with high costs will not appear in the creation of the DSL itself (the DSL being just one notation for an underlying domain schema, one notation among many, it can be created and used locally) but rather in the creation of the domain schema itself (which may end up being a collaborative effort carried out among people in various locations).</p>
<p>As I was saying above I have the impression that in the near future domain workbenches and DSLs will be used where the costs of knowledge transfers from domain experts to developers is large. If the costs of creating languages start to drop and these domain work-benches become ubiquitous then it is possible that a complete separation between domain logic (stored in domain code and expressed thru various notations) and its implementation in a system (which appears to be essentially a projection of the domain code into an operational environment) will appear. It would be interesting to work with Intentional Software&#8217;s domain workbench too.</p>
<p>We will have to wait and see&#8230;</p>
<p><a href="#">L3E</a>: <a href="http://msdn.microsoft.com/en-us/oslo/dd727740.aspx" target="_blank">This</a> is another presentation on the Domain Workbench.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/05/27/dsls-and-apis/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Volatility</title>
		<link>http://microintellia.com/blog/2009/05/01/volatility/</link>
		<comments>http://microintellia.com/blog/2009/05/01/volatility/#comments</comments>
		<pubDate>Fri, 01 May 2009 16:35:37 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=389</guid>
		<description><![CDATA[This post on the BW blog echoes some feelings that I had when the web2.0 &#8220;revolution&#8221; took off and everybody with an internet connection put a blog. I was wondering how long it will last because it was seemed similar to a trend in fashion, a trend that you don&#8217;t expect to outlast the season [...]]]></description>
			<content:encoded><![CDATA[<p>This <a href="http://www.businessweek.com/the_thread/blogspotting/archives/2009/04/forresters_owya.html" target="_blank">post</a> on the BW blog echoes some feelings that I had when the web2.0 &#8220;revolution&#8221; took off and everybody with an internet connection put a blog. I was wondering how long it will last because it was seemed similar to a trend in fashion, a trend that you don&#8217;t expect to outlast the season in which it was launched.</p>
<p>One pretty good example of such an application is <a href="http://technorati.com/" target="_blank">Technorati</a>, an application feeding off the blog frenzy that characterized the mid 2000&#8217;s. For a few years it was the go-to site for everything blog-related, today it is a has-been as interest in blogs was replaced by interest in social networks and Twitter.<br />
I see one small problem with applications which follow and try to satisfy consumer trends: the fact that they require large investments in infrastructure (demanded by the large loads they have to satisfy) as well as the fact that they need to re-coup this investment in a relative short period of time before they become fads. </p>
<p>I am wondering how volatility in user tastes will affect the funding and the revenue models for applications which are trying to satisfy consumer trends, because the gap between the investments necessary for putting up such applications and returns on these investments grows larger as the volatility increases. VCs will not be able to hedge away risks by investing in multiple applications at the same time (effectively spreading risk across different applications in the same class of applications), because all these applications could suffer large swings in their userbase. VCs will probably have to hedge away the risks of investing in these applications by investing in areas outside social-networks (green technologies, etc&#8230;).</p>
<p>User volatility is a pretty new phenomenon for which there is no history from which to infer much. It will be interesting to see how this will un-fold: will this type of application simply disappear because it is economically irrational to invest in them or will the costs of running such an application become so low that the investment required for it can be amortized in a short period of time? Or something else&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/05/01/volatility/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A defining moment for Java</title>
		<link>http://microintellia.com/blog/2009/04/21/a-defining-moment-for-java/</link>
		<comments>http://microintellia.com/blog/2009/04/21/a-defining-moment-for-java/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:07:34 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=387</guid>
		<description><![CDATA[I still cannot fully absorb the news that Oracle is buying Sun. First, I don&#8217;t understand the rationale for it (since when Oracle wanted to become a hardware vendor???). Second, because I see the development environment I grew used to (an environment which gives the developer a lot of freedom in choosing how to work, what [...]]]></description>
			<content:encoded><![CDATA[<p>I still cannot fully absorb the news that <a href="http://www.oracle.com/us/corporate/press/018363" target="_blank">Oracle is buying Sun.</a> First, I don&#8217;t understand the rationale for it (since when Oracle wanted to become a hardware vendor???). Second, because I see the development environment I grew used to (an environment which gives the developer a lot of freedom in choosing how to work, what components to use, how to integrate them, etc&#8230;) threatened with change. </p>
<p>Reading the press release I came across this worrisome snippet: <em>“Sun is a pioneer in enterprise computing, and this combination recognizes the innovation and customer success the company has achieved. Our largest customers have been asking us to step up to a broader role to <strong>r</strong><strong>educe complexity, risk and cost by delivering a highly optimized stack based on standards</strong>,” said Oracle President Charles Phillips</em>.<br />
I had the opportunity to deal with a <strong>highly optimized stack</strong> from Oracle - JDev integrated with Oracle DB - and I know that I don&#8217;t want to deal with anything similar to it again, from what I remember developing on JDev means basically being taken hostage to a set of capabilities.</p>
<p>I think that this deal is best defined as the acquisition of the largest open source company in the world, Sun managing these OS assets: MySQL, Java, Open-Solaris, Open-Office,  Open-Sparc. Oracle should treat these projects and the communities built around them with care and not antagonize them because quite a few competitors would love to be put in a position to efficiently fork Sun&#8217;s OS assets in order to acquire a new community and a new customer base.</p>
<p>Another point I would like to make is that Oracle is buying Sun when Sun&#8217;s grip over the Java community is waning away. As outlined in a <a href="http://blog.springsource.com/2007/12/24/is-it-a-tomcat-or-the-elephant-in-the-room/" target="_blank">post</a> by Rod Johnson development in Java is moving away from EJB containers to specialized solutions which means that the EJB assets bought by Oracle are diminishing their worth.</p>
<p>I think that this transaction will define Java for the near future. Sun did an outstanding job of building a community around Java, a community which delivered an impressive stack of libraries, an open community which could work together in order to avoid duplication, a community which turned R&amp;D projects into viable commercial projects. It would be a shame if this changes in the future.</p>
<p><a href="#">Later Edit:</a> mySQL just got forked, I thought I may add a &#8220;Fork Watch&#8221; for the Sun OS products which Oracle has just acquired. It would be interesting to watch how this will unfold&#8230;</p>
<ul>
<li><a href="http://www.infoq.com/news/2009/05/mysql-open-database-alliance" target="_blank">First</a> fork of mySQL by the Open Database Alliance.</li>
</ul>
<div>I am also adding a &#8220;Java Watch&#8221; for events pertaining to Java after Sun&#8217;s acquisition by Oracle: </p>
<ul>
<li><a href="http://www.infoq.com/news/2009/06/g1-paid" target="_blank">Oracle to charge</a> for using the new generation Garbage Collection. This apparently is just a <a href="http://www.infoq.com/news/2009/06/g1-free-or" target="_blank">misunderstanding</a>.</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/04/21/a-defining-moment-for-java/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Assigning responsabilities</title>
		<link>http://microintellia.com/blog/2009/03/31/assigning-responsabilities/</link>
		<comments>http://microintellia.com/blog/2009/03/31/assigning-responsabilities/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 20:01:01 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=384</guid>
		<description><![CDATA[I think that this presentation by Rebecca Wirfs Brock on driving the design from responsabilities pretty much hits the nail on the head: responsabilities drive design and good design is a good separation of responsabilities. From what I have seen most of the errors in software development arise either from grey-zones in which multiple responsabilities are [...]]]></description>
			<content:encoded><![CDATA[<p>I think that <a href="http://www.infoq.com/presentations/What-Drives-Design-Rebecca-Wirfs-Brock" target="_self">this</a> presentation by Rebecca Wirfs Brock on driving the design from responsabilities pretty much hits the nail on the head: responsabilities drive design and good design is a good separation of responsabilities. From what I have seen most of the errors in software development arise either from grey-zones in which multiple responsabilities are implemented and overlap or from responsabilities which spread across multiple components. Both are examples of incorrect mapping of responsabilities to components.</p>
<p>All in all, a very good presentation.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/03/31/assigning-responsabilities/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RIA and web-apps</title>
		<link>http://microintellia.com/blog/2009/03/25/ria-and-web-apps/</link>
		<comments>http://microintellia.com/blog/2009/03/25/ria-and-web-apps/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 15:01:32 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=373</guid>
		<description><![CDATA[I was watching this interview with Tim Bray in which Tim downplayed Rich Internet Applications in favor of ordinary web-apps and I find myself agreeing with Tim, I think that web-applications have the means to become the applications with the largest marketshare and this is due to the low costs of composing applications on the [...]]]></description>
			<content:encoded><![CDATA[<p>I was watching <a href="http://www.infoq.com/interviews/tim-bray-future-of-web" target="_blank">this interview</a> with Tim Bray in which Tim downplayed Rich Internet Applications in favor of ordinary web-apps and I find myself agreeing with Tim, I think that web-applications have the means to become the applications with the largest marketshare and this is due to the low costs of composing applications on the web vs the (current) high cost of composing application in RIAs.</p>
<p>Let me explain: with the introduction of ubiquitous connectivity partnerships between various organisations became feasible to the point where applications are becoming applications composed of components, components which are not all originating from the same organization. Organizations are finding it wasy to exchange data and functionality (think about the widgets on Facebook: Facebook could import Digg-like functionality and data straight from Digg). The result is that web applications are becoming places where organizations meet, agree on the interactions between them and then implement these interactions. Once a web-app manages to get a certain number of users it has the opportunity to become a portal by swapping data with other web-apps and integrating with these web-apps.</p>
<p>Now, since the place where applications are getting composed is typically the place where applications are deployed, it follows that the place where applications are deployed defines the costs of application composition. If the applications are deployed remotely then the task of composing these applications is shifted onto the teams which are managing this remote application. If the application is deployed locally (on the desktop for example) the task of application composition is shifted onto the user that manages it on its desktop. If the costs of application compositions are low then the task of application composition can be shifted onto the user, if they are high then the same task will be shifted onto the teams that are managing the application remotely.<br />
I would say that application composition costs are application discovery, integration between applications and integration between applications and the host environment and currently these costs are higher for RIAs than for typical web-apps.</p>
<p>Given that the costs of application compositions on the desktop are currently high, predominantly because of lack of standards, it follows that most of the application that get composed will be deployed remotely. Flash/Java FX/Silverlight will probably run stand alone applications which have a low degree of interaction with other applications. Facebook will probably be the place where a lot of the application composition will occur.</p>
<p>The near future is on the web and on web-applications. RIAs will probably satisfy some niche, but will not become the dominant architectural style in the near future, unless the makers of the RIA runtimes (Flash/Java FX/Silverlight) will find a way to address the costs of application composition. Some sort of a container which allows components originating from multiple sources to integrate among each other easily could lower these costs, taking the appeal of RIAs beyond its immediate differentiators (greater interaction with the user, low response times, etc&#8230;). Honestly, I am skeptical that the costs of composing application in RIA environments will become low enough to the point where RIAs will become more like portals where interactions between multiple organizations are carried out and less like applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/03/25/ria-and-web-apps/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Open source domains</title>
		<link>http://microintellia.com/blog/2009/02/28/open-source-domains/</link>
		<comments>http://microintellia.com/blog/2009/02/28/open-source-domains/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 04:19:56 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=370</guid>
		<description><![CDATA[Open source started with the desire to create applications whose code could not be closed away from the general public and for a few decades followed this course. Operating systems, databases, application servers, frameworks, applications were written, had an OS license pasted on it and then released into the public. The only one exception to [...]]]></description>
			<content:encoded><![CDATA[<p>Open source started with the desire to create applications whose code could not be closed away from the general public and for a few decades followed this course. Operating systems, databases, application servers, frameworks, applications were written, had an OS license pasted on it and then released into the public. The only one exception to break away from this pattern is Spring Source, the company behind the Spring portfolio of products.</p>
<p>Spring source is an a-typical open-source company in the sense that they broke away from creating open source software and moving into creating open source domains. Initially they became known for their IoC container and a few libraries which solved various code issues (their JDBC libraries being one such example). Next, they added various features to the Spring container (proxy-based AOP, etc&#8230;) and added some more frameworks to their portfolio, such as Spring MVC, following the typical road of an OS company that senses industry-wide needs and addresses them by creating frameworks implementing those needs.<br />
Lately, however, Spring Source has been diversifying into business domains: right now its product portfolio encompasses Spring Security (actually an old framework known as Acegi Security), Spring Batch, Spring Integration, etc&#8230; It is a pretty interesting development and, as far as I know, it is singular in the OS space: we have an OS company that senses domains that are needed across the IT industry, pools together domain experts and goes on to deliver a framework that covers the main concepts of the domain and is sufficiently flexible to allow for covering corner-cases easily.</p>
<p>One interesting point about OS domains is that the company that provides a framework which implements such a domain pretty much needs to acquire a significant marketshare and be guaranteed not to lose that marketshare and actually move to a monopolistic position as long as it delivers a good implementation of the domain. The reason for that is a domain is pretty much a form of knowledge and implementing a domain is essentially translating this knowledge into a particular programming language. If the knowledge has been translated into a programming language successfully (i.e. when the domain has been implemented robustly) there is no need for a competing implementation, because this competing implementation would simply re-translate what was previously translated, which is pointless (the end result is the same - a new translation of the same concepts).<br />
Another interesting point is that the company servicing the OS domain will probably derive revenues from domain knowledge rather than from the framework/application implementing that domain, the support for the framework implementing a domain is actually a proxy for domain knowledge (people buying support for the framework will buy it for understanding the domain better and for using the framework better within the domain). </p>
<p>If I were to say what qualities are necessary for a domain to become an OS domain I woud point out that such a domain needs to be quite static, it has to be mature enough and it needs to be in great demand, it has to cut across the whole IT industry.<br />
If I were to point a domain which is ripe for becoming an OS domain I would say that partitioning an application to run across a large number of nodes will probably become a good candidate for an OS domain as the number of applications which need to scale out massively will increase.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/02/28/open-source-domains/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Too much change?</title>
		<link>http://microintellia.com/blog/2009/01/05/too-much-change/</link>
		<comments>http://microintellia.com/blog/2009/01/05/too-much-change/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 16:27:54 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=356</guid>
		<description><![CDATA[I maintain a different &#8220;blog&#8221; (*) hosted with Wordpress, a &#8220;blog&#8221; that I use for storing various information and that I visit rarely. In fact, I visit it so rarely that almost every time that I log on I see that a new version of Wordpress has been released and has been forced onto my [...]]]></description>
			<content:encoded><![CDATA[<p>I maintain a different &#8220;blog&#8221; (<a href="#">*</a>) hosted with Wordpress, a &#8220;blog&#8221; that I use for storing various information and that I visit rarely. In fact, I visit it so rarely that almost every time that I log on I see that a new version of Wordpress has been released and has been forced onto my blog. <br />
Which is very confusing because every new Wordpress version has so little in common with the preceding one that it takes me a while to get used to it. This leaves me wondering what has happened during each Wordpress release to require so many changes&#8230; </p>
<p>From what I see Wordpress has a bit of a problem maintaining some coherence between its releases, when I first saw WP 2.7 I first thought that it is a completely new product with a completely new functionality and user base. Time to focus on continuity when designing user experiences at WP&#8230;</p>
<p><a href="#">*</a> I don&#8217;t realy use this blog as a blog, but mostly for storing some information that I find interesting. It contains links to my del.icio.us account, etc&#8230; I keep it with Wordpress in blog format because it is the most convenient.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2009/01/05/too-much-change/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Old and new media</title>
		<link>http://microintellia.com/blog/2008/12/31/old-and-new-media/</link>
		<comments>http://microintellia.com/blog/2008/12/31/old-and-new-media/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 17:48:07 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=352</guid>
		<description><![CDATA[Lately I have found myself doing something that I have not done for a pretty long time: reading newspapers and I mean real newspapers, made of paper (*). The main reason for this is that I find reading news from a laptop is pretty inconvenient when you have kids (**) and that nothing beats reading [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have found myself doing something that I have not done for a pretty long time: reading newspapers and I mean real newspapers, made of paper (<a href="#">*</a>). The main reason for this is that I find reading news from a laptop is pretty inconvenient when you have kids (<a href="#">**</a>) and that nothing beats reading a newspaper next to cup of coffee.</p>
<p>At the same time I have found myself growing dissatisfied with the RSS feeds that I use for getting news and articles online and I think that the main reason for this dissatisfaction is the specialization of the content sources behind these RSS feeds. I am subscribed to a variety of content: from articles on software architecture, to financial news, to articles on design, economic development, economics in general, etc&#8230; These content sources are targetting a domain and are producing content according to that domain&#8217;s needs. One side effect is that by consuming the content provided by these sources you are getting a certain degree of specialization in the domain covered by them (which is very beneficial if you want to acquire a certain amount of specialization in a particular domain). One other side effect is that the specialization of these content sources prevents different content from getting to you and you are becoming hostage to some predefined content.</p>
<p>I find that by getting articles only thru my RSS feeds I am getting isolated from other parts of the world. In part for addressing this I have started reading newspapers again, because newspapers provide that general view on the world due to their format: the content of a newspaper had to be delivered as a whole rather than to be split into multiple slices which could be delivered to the reader independently. This format pretty much meant that if you needed to address new interests for your readership you needed to add new sections to it and as a result to expose your readership to new fields. The old newspaper is a home to multiple fields (for example your typical NYT covers everything from world news, to metropolitan news, to arts, business while also providing some comentary) with a news reader that is exposed to a variety of fields and an editorial team that understands the typical news reader and can provide the appropriate content for it.</p>
<p>This, however, changes a lot in the new media: the newspaper in the new media is getting decomposed into finer and finer slices which are being marketed to the newsreader thru various channels. At the same time the task of choosing what to read is being shifted from the editorial team to the reader which results in the abandoning of large, uniform reader bases and the creation of specialized niches.</p>
<p>If I were to set some resolutions for 2009 I would take a look at the fields into which I want to get some degree of specialization, keep the appropriate RSS feeds and remove the rest. While continuing to read newspapers, of course.</p>
<p>Happy New Year to everyone!!!!</p>
<p><a href="#">*</a> I recycle pretty much all that can be recycled in a home.</p>
<p><a href="#">**</a> I get too absorbed when reading news or articles on a computer so that when my kids want to play I cannot let go of the laptop easily, this is the main reason for which I pretty much stopped using a computer at home. When I am reading a paper I just put it down and go to play and I pick up the paper later.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/12/31/old-and-new-media/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Code reuse limits</title>
		<link>http://microintellia.com/blog/2008/12/09/code-reuse-limits/</link>
		<comments>http://microintellia.com/blog/2008/12/09/code-reuse-limits/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 15:47:01 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=324</guid>
		<description><![CDATA[Code reuse is one software development goal consistently sought for. Its main benefits are that the code which gets reused becomes an investment on which you can build later. However, code reuse has its limits when the codebase is shared by a large number of participants, limits due to communication costs and to diverging interests.
Code [...]]]></description>
			<content:encoded><![CDATA[<p>Code reuse is one software development goal consistently sought for. Its main benefits are that the code which gets reused becomes an investment on which you can build later. However, code reuse has its limits when the codebase is shared by a large number of participants, limits due to communication costs and to diverging interests.</p>
<p>Code reuse granularity goes against the number of the participants because implementing code reuse means deciding on what is common (and prone to be re-used) and what is specific as well as on the mechanisms used for implementing the relationships between what is common and what is specific (via sub-classing, various design patterns, etc&#8230;). This process of decision starts to blur once the number of participants increases and the corresponding communication costs start to rise. Too many people arguing about what is common to all of them will have quite a few problems figuring out what they are agreeing on.</p>
<p>The interests of pool of participants also are also more prone to diverge as their number increases, further reducing what is common to these participants. The end result is that once the number of participants increases both the commonalities between them shrink (as their specific interests diverge) and finding and implementing these commonalities becomes more expensive (because of the higher communication costs which occur between a larger number of participants). In these situations the code which gets reused starts to boil down to the main architecture classes within which the participants to the projects are coding their specific classes.</p>
<p>Keeping the number of participants low (agile techniques suggest keeping the number of participants below 7) is a way to deal with a codebase and a way to encourage code reuse efficiently.<br />
However, sometimes you may end-up with a high number of participants. In this case code reuse should be brought down to re-using the main architecture classes in order to avoid confusion born out of mis-communication.<br />
Another technique to deal with a large number of participants is to partition the code-base in order to minimize the number of people which are sharing code, the less people are sharing code the less the communication costs and the more things they will have in common.<br />
Big, unpartitioned codebases come with big problems from what I have seen so far.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/12/09/code-reuse-limits/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A company that understands the web</title>
		<link>http://microintellia.com/blog/2008/12/08/a-company-that-understands-the-web/</link>
		<comments>http://microintellia.com/blog/2008/12/08/a-company-that-understands-the-web/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 14:58:31 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=321</guid>
		<description><![CDATA[I am following with a great deal of interest Amazon&#8217;s offerings to the point where I think that they are the company that understands the web the most, more than any Web2.0 company including Google. Amazon brought to the world the cloud, the MTurk, fulfillment and now they are bringing public data sets. 
Really funny that [...]]]></description>
			<content:encoded><![CDATA[<p>I am following with a great deal of interest Amazon&#8217;s offerings to the point where I think that they are the company that understands the web the most, more than any Web2.0 company including Google. Amazon brought to the world the cloud, the MTurk, <a href="http://www.amazonservices.com/content/fulfillment-by-amazon.htm" target="_blank">fulfillment</a> and now they are bringing <a href="http://aws.typepad.com/aws/2008/12/paging-researchers-analysts-and-developers.html" target="_blank">public data sets</a>. </p>
<p>Really funny that an online bookstore defines the web and not the Yahoo-Microsoft-Google group. I think that Amazon is ahead of the pack because being an online retailer its competitive advantage doesn&#8217;t lie with hoarding data or its super-efficient data-centers and as a result it can make them available to the outside world without damaging its competitive advantage. One interesting difference between Amazon and the YMG pack is the rate of success of each group&#8217;s offerings: Amazon Cloud has been a tremendous success, the MTurk seems pretty busy while Google has been releasing one service without customers after another (anyone remembers Google Health?), Microsoft is <a href="http://search.live.com/cashback" target="_blank">paying people</a> to use live.com and Yahoo is struggling to figure out what it needs to do next.</p>
<p>This retailer gets the online world and will probably define important parts of its future. The fact that its revenues are indirectly derived from the web will probably make it avoid various conflicts of interests (hoarding users&#8217; data rather than giving users control over it being one such conflict) with which the YMG group is struggling.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/12/08/a-company-that-understands-the-web/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goodbye Managing Globalization</title>
		<link>http://microintellia.com/blog/2008/12/03/goodbye-managing-globalization/</link>
		<comments>http://microintellia.com/blog/2008/12/03/goodbye-managing-globalization/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 14:19:44 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=319</guid>
		<description><![CDATA[A very fine blog on issues related to globalization is posting its last entries. I am sorry to see it go and I wish all the best to Daniel Altman, the host of this incredible source of information about our increasingly inter-connected world.
]]></description>
			<content:encoded><![CDATA[<p>A very fine blog on issues related to globalization is posting its <a href="http://blogs.iht.com/tribtalk/business/globalization/?p=861" target="_blank">last entries</a>. I am sorry to see it go and I wish all the best to Daniel Altman, the host of this incredible source of information about our increasingly inter-connected world.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/12/03/goodbye-managing-globalization/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Various takes on SOA</title>
		<link>http://microintellia.com/blog/2008/12/01/various-takes-on-soa/</link>
		<comments>http://microintellia.com/blog/2008/12/01/various-takes-on-soa/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 13:23:17 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=309</guid>
		<description><![CDATA[I have avoided reading and writing about SOA lately because SOA has attained buzzword status and the high number of articles written about it makes it pretty difficult to follow. I also see so much repetition of the same terms and concepts that pretty much every article I have read in the last 4 months [...]]]></description>
			<content:encoded><![CDATA[<p>I have avoided reading and writing about SOA lately because SOA has attained buzzword status and the high number of articles written about it makes it pretty difficult to follow. I also see so much repetition of the same terms and concepts that pretty much every article I have read in the last 4 months feels stale once I go over the first 2 lines.</p>
<p>Against this background I have read 2 interesting articles on SOA: one <a href="http://martinfowler.com/bliki/ServiceCustodian.html" target="_blank">article</a> by Martin Fowler about using open-source techniques in order to implement collaboration between a consumer service and a supplier service and one <a href="http://www.mwdadvisors.com/blog/2008/11/on-soa-governance-for-soa-read-cpoa.html" target="_blank">article</a> about abandoning the mindset which focuses on IT and rather on focusing on the relationships between various services thru contracts and policies (contracts and policies are organizational issues and not technology issues).</p>
<p>I found Martin Fowler&#8217;s article refreshing, even though I have to say that I disagree with it. From what I understand from the article. I think that having developers commit code to a service that you need to connect to has high interaction costs (basically the developers need to understand the partner service, need to be coordinated with the rest of developers, etc&#8230;), interaction costs which drive down the number of services with which you can partner effectively. Martin Fowler takes the issue of partnering with a service even further by having developers from the service consumer become full rights committers to the codebase of the partner service. When your developers are committers to a different service you have to wonder on what service are these developers working. The service consumers and the service providers are becoming very tightly coupled, not thru the interfaces they use for communicating (REST, WS-*, wire protocols, etc&#8230;) but thru the developers that these 2 services are sharing. I would say that Martin Fowler open-source like approach to service interactions does not scale to a larger number of services. I could go a bit into the differences between open-source projects and your typical enterprise application (I think that the most important one is that on an open source project features are chosen by boiling down competing features to the lowest common denominator chosen by the OS project participants while your typical enterprise application chooses its features in order to boost its revenues), differences which will pretty much tell why OS-like projects are very rare in the enterprise computing world but I don&#8217;t really have the time.</p>
<p>I have to say that when comparing the above OS approach to SOA to the typical vendor approach to  SOA you see big differences: a typical vendor assumes that services are out there in a registry and that a business analyst can create new processes and new value by drag-and-dropping various services into an IDE storing references to firm-wide services. This vision does not have much in common with the real world for two important reasons: 1) there are interactions costs associated with consuming each service, interaction costs which are not expressed in a service IDE and 2) in order to manipulate services at a firm-wide scope you need to master knowledge at the same scope. Possessing knowledge at this scope is nearly impossible, I personally have seen rather the reverse: business analysts getting so specialized that their scope becomes more and more focused. As far as I see it in order to achieve the SOA-nirvana championed by your typical IT vendor you need significant disruptions in your work-force.<br />
And this brings me to the MWD article which echoes some thoughts that I <a href="http://microintellia.com/blog/2007/02/24/soa-its-more-about-service-management" target="_blank">wrote</a> a while back when I was saying that interactions between IT services will be driven by the interations between the BUs implementing these services. SOA is not about empowering some business analyst to draw some funny diagrams on a board and re-engineer information flows at the firm level, but rather about how you create relationships and interactions, how you create incentives for adhering to rule and penalties for straying away from them, how you delegate managing an interaction to the parties involved in it, how you identify and consolidate common tasks into shared services and how you allocate tasks which are particular to a small set of parties, how you deal with who loses in these shifts, etc&#8230;</p>
<p>As you can see, all these concerns don&#8217;t have much to do with IT, being first and foremost management concerns. The only thing that IT can do is help these management issue get resolved, but not resolve them. IT brings some capabilities which can be used: service registries (which consolidate the view of and access to IT assets), ESBs (which allow for controlling data flows), policy standards (which allow the automation of defining and enforcing policies), etc&#8230; These capabilities should not be mistaken for their usage or their ends.<br />
Ultimately, all the IT issues on SOA will be pushed to the back and management will take over. Ideally this field will become so specialized and its audience so narrow that we will get rid of another tiresome buzzword&#8230;</p>
<p><a href="#">Later Edit:</a> As you can guess this post has been written in about half a dozen different sessions, each sessions adding a few more lines to what was written before. I don&#8217;t have much time to write anymore (and I guess it shows), but I felt compelled to comment on those 2 articles because I thought they stand out from the rest of articles written on SOA.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/12/01/various-takes-on-soa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Task allocation and designing interactions</title>
		<link>http://microintellia.com/blog/2008/11/03/task-allocation-and-designing-interactions/</link>
		<comments>http://microintellia.com/blog/2008/11/03/task-allocation-and-designing-interactions/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 14:24:47 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=303</guid>
		<description><![CDATA[As I was saying in my previous post a lot of technological issues (such as the debate of REST vs. WS-*) are actually organizational issues and that at the bottom of them you will find that the process of communication has been broken down into tasks (namely the task of  the payload-to-processor mapping) and those tasks [...]]]></description>
			<content:encoded><![CDATA[<p>As I was saying in my previous <a href="/blog/2008/10/16/rest-and-ws-part-5/" target="_blank">post</a> a lot of technological issues (such as the debate of REST vs. WS-*) are actually organizational issues and that at the bottom of them you will find that the process of communication has been broken down into tasks (namely the task of  the payload-to-processor mapping) and those tasks have been allocated (they have been externalized or internalized) according to the transaction costs of each particular environment.</p>
<p>I would follow this by saying that a lot of time will be saved if the interactions between various parties will be broken down into tasks and that the tasks will be allocated according to the nature of the organization(s) within which these interactions will be carried out. This applies not only message passing but to any other environment in which various entities engage in collaboration. <br />
For example, you may find out that DSLs will not work in particular setting not because DSLs are bad, but because the organization within which these DSLs are implemented and used simply doesn&#8217;t warrant their success.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/11/03/task-allocation-and-designing-interactions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REST and WS - part 5</title>
		<link>http://microintellia.com/blog/2008/10/16/rest-and-ws-part-5/</link>
		<comments>http://microintellia.com/blog/2008/10/16/rest-and-ws-part-5/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 19:31:14 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=298</guid>
		<description><![CDATA[One of the best presentations that I have seen lately is Mark Little talking about REST and WS at QCon London 2008, or rather about the differences between the uniform interfaces and the specific interface. Mark Little gets right at the bottom of the differences between REST and WS, and these differences are not all [...]]]></description>
			<content:encoded><![CDATA[<p>One of the best presentations that I have seen lately is <a href="http://www.infoq.com/presentations/mark-little-soa-rest" target="_blank">Mark Little</a> talking about REST and WS at QCon London 2008, or rather about the differences between the uniform interfaces and the specific interface. Mark Little gets right at the bottom of the differences between REST and WS, and these differences are not all differences between architectural styles, but rather differences in organizations.</p>
<p>One of the best interpretations of the differences in REST vs WS that I have seen is the one that Mark makes in this presentation and that I will try to reproduce below is the division of tasks of mapping a message sent to an entity (could be a service, could be an URL) and the component/processor within that entity that will process it: when you send a message to a specific interface you will be specifying the method and the component that will process that message, so the message-to-processor mapping is done by the client. Whereas when you send a message to a specific interface you need to attach some meta-data to that message which will be used by the entity implementing the specific interface for mapping that message to its appropriate processor, therefore the message-to-processor mapping is done by the entity.</p>
<p>The message-to-processor mapping is externalized in the case of specific interfaces while the uniform interface internalizes it. These different mappings come with different transaction costs: in the case of the external mapping the costs are synchronizing the client with changes in the specific interface while in the case of the internal mapping the costs are adapting the uniform interface&#8217;s mapper to changes in the meta-data (a new type of messages should be mapped to a new processor).<br />
Now, if we apply economics to the task of message-to-processor mapping we would start to get some interesting results. According to <a href="http://en.wikipedia.org/wiki/Coase_theorem" target="_blank">Coase&#8217;s theorem</a> you can externalize an activity if the transaction costs for that carrying that activity are low enough and if the transaction costs are high then that activity is better internalized. It would follow that when the transaction costs of this mapping are low you can externalize it via a specific interface, otherwise you would be better off to internalize it via an uniform interface. <br />
The transaction costs of the specific interface are the synchronization of distributed clients and this could be resolved either thru versioning, or by not modifying the specific interface or by standards. If you can keep these costs down it follows that you can delegate the message-to-processor mapping efficiently to the client else you are better off with a uniform interface. Keeping these costs down also implies that the number of methods that get exposed is kept down in order to avoid the number of changes (more methods, more opportunities for changing them). Generally speaking interaction via specific interfaces is best limited to a few coarse-grained components, between a few participants and with components which do not change very often.<br />
The above synchronization costs run counter to scale in number of clients: as the number of clients starts to grow you are starting to have problems synchronizing all of them and eventually the transaction costs of using the specific interface will become so high, it will not make sense to use it. One corollary of this is that the uniform interface is far better at the scale of the internet and this is probably the main reason why it is used at this scale.<br />
The above will provide a pretty good guide to an architect trying to figure out whether to use a specific interface or an uniform one because their use is not driven by technology, but rather by the organization(s) within which they are employed.</p>
<p>Another interesting point in his presentation was the effort for creating a REST-ful standard for carrying out distributed transactions and the need for agreement between multiple parties. As I was saying in a <a href="http://microintellia.com/blog/2007/06/01/rest-and-ws-part-3/" target="_blank">previous post</a> about REST and WS the differences between these 2 camps are more of organizational nature than anything else. Mark touched upon the fact that even if the need for carrying out distributed transactions via REST exists there is still no standard for doing so, that the REST community seems pretty much happy with implementing low-level infrastructure and not with higher-level, and higher-value, components. I find this a pity and I have the impression that this need will be fulfilled only it raises to a level at which major corporations will find profitable for getting involved. The REST community appears simply way too fragmented to be able to carry out this effort on its own&#8230;</p>
<p>Anyway, go ahead and watch the <a href="http://www.infoq.com/presentations/mark-little-soa-rest" target="_blank">presentation</a>, it is the most thoughtful presentation on distributed computing that I have seen in a while.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/10/16/rest-and-ws-part-5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ESB transformations</title>
		<link>http://microintellia.com/blog/2008/10/10/esb-transformations/</link>
		<comments>http://microintellia.com/blog/2008/10/10/esb-transformations/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 15:47:39 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=287</guid>
		<description><![CDATA[ESBs is an essential enterprise computing capability which allows for mediating connections between various parties. Typical EBS usage consists of message producers sending messages to an ESB which transforms them and then forwards them to message consumers.
It is at the transformation stage that the thorniest issues arise with ESBs. As outlined in this presentation from [...]]]></description>
			<content:encoded><![CDATA[<p>ESBs is an essential enterprise computing capability which allows for mediating connections between various parties. Typical EBS usage consists of message producers sending messages to an ESB which transforms them and then forwards them to message consumers.</p>
<p>It is at the transformation stage that the thorniest issues arise with ESBs. As outlined in this presentation from <a href="http://www.infoq.com/news/2008/06/soa-without-esb" target="_blank">Thoughworks</a> there is a tendency to push business logic inside the ESB resulting in a very tight coupling between applications and the ESB (part of the business logic will be stored in applications, part of it in the ESB and the business logic in the ESB will need to be kept in sync with the business logic in the applications). Not a nice scenario and unfortunately the solution provided in the presentation (apparently you only need to use Guerilla SOA) doesn&#8217;t say much. The business logic which gets shoved into the ESB in the above example are the relationships between the various parties which are sending each other messages and the mess that comes out of it as these relationships change over time.</p>
<p>One example of ESB usage is a customer-facing web application which takes purchase orders from customers and sends messages to an inventory and shipping system, to the accounts receivables system and to the customer loyalty system. There are a few ways that this messages can be sent: 1) the web-application sends only one message to the ESB which then creates 3 more messages, one for the inventory system, one for the accounting system and one for the customer loyalty system (in which case the relationships between the web-app and the 3 systems are managed within the ESB); 2) the web-application creates 3 messages which are all sent independently to the 3 systems (in which case the relationship between the web-application and these 3 systems is managed by the web-app typically thru dedicated senders which are transforming the message according to the other party&#8217;s specs) or 3) the web-app publishes the message on the ESB which forwards it as-is to the receiving systems which are receiving the message as it has been created by the web-app and transform it according to their rules (in which case the receiving systems are managing the relationships with the web-application typically thru dedicated receiving points which are transforming the incoming messages).<br />
So far I have only seen 2 or 3 used and it was used successfully. I have not seen 1 being used successfully, but rather I have seen ESBs simply delegated to the role of a dumb-pipe while the processing is done on the end-points. I think that the main reason for which the ESB cannot grow beyond the role of a dumb-pipe is that the transformations typically involve data, imagine that in the above scenario the IDs of the products on the web-application are different from the ones in the inventory system (a very common case BTW). In order to service this transformation you would need an up-to-date mapping between all relationships that it is managing. Sooner or later that ESB will turn into a giant vacuum cleaner that will need to suck every byte of data available in order to service the relationships stored in it.<br />
Lesson #1: Managing relationships typically involves managing data.</p>
<p>Let&#8217;s go more into the gory details and think about how we would deal with stale data: let&#8217;s say that the datastore holding the mappings of product IDs from the webapp to the inventory systems is missing a product ID (another very common case). In the case where the relationships are maintained at the connection end-points (message producers or consumers) the operation team managing those end-points would have access to the exception (missing product ID mapping in this case) as well as to its solutions (create this mapping in your mapping store). How will the ESB deal with stale data? Well, the ESB will have to find the entity which can resolve this exception, package the exception and send it to that entity. Sooner or later the ESB gets becomes a spaghetti bowl.<br />
Lesson #2: ESB has bad exception management capabilities. </p>
<p>Pushing the transformation towards the end-points effectively couples the end-points because these endpoints must share the format (<a href="#">*</a>) of the messages they exchange and, just as importantly, they need to share data. Sharing data is usually done by one party having a procedure to export its data and the other parties using this procedure for creating local replicas of that data and synch-ing them according to a calendar. In addition to that the parties replicating the data have procedure for overriding the data they receive and adding to it. As far as I have seen it works pretty well and when it doesn\t work it is more of a management issue on the side issuing the data.</p>
<p>To sum this up, I would keep any data enriching out of the ESB and use the ESB trasformations only for format transformations and version transformations (<a href="#">**</a>). One more benefit to keeping the ESB down to routing and format transformations would be that its role is well-contained and it doesn&#8217;t turn into a wild-card (does this particular problem gets handled by the ESB, how, why, when, etc&#8230;) making your IT assets more manageable. This results in a neater division of concerns in your overall enterprise architecture.</p>
<p><a href="#">*</a> It is advised that the format of these messages is not using APIs but rather text-based protocols such as XML, pipe-delimited, etc&#8230; API couplings is one of the most horrendous things that I have seen, synch-ing libraries on multiple endpoints at the same time is an incredibly time-consuming activity.</p>
<p><a href="#">**</a> Version-based transformation are transformations of the same message between 2 different versions of it: let&#8217;s say that one message producer decides to publish a new version of the messages that it has been produced so far, the ESB should be made aware of this and deliver the new version to the consumers that are registered to receive it as well as create a new message with the old version out of the original message and send this new message (formatted according to the old version) to the clients which are still registered to receive the old version. Part of this versioning effort is the transformation from the current version to an older version and this transformation would be best done by the message producer which will load a transformer into the ESB for this transformation. The ESB will then be re-configured to apply this transformation to the original message with the new version and the resulting message to be routed on its old route. This way the versioning effort will be pushed inside the ESB and messages will be delivered transparently to the intended receipients and recipients will not have to be upgraded when their counterparties upgrade their message format effectively de-coupling their release cycles.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/10/10/esb-transformations/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OOP inheritance</title>
		<link>http://microintellia.com/blog/2008/09/23/oop-inheritance/</link>
		<comments>http://microintellia.com/blog/2008/09/23/oop-inheritance/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 19:34:14 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=252</guid>
		<description><![CDATA[Typically OOP inheritance is used for sharing various common methods and a typical example would be something like this:
You have interface Vehicle which has sub-classes Bicycle and MotorVehicle. MotorVehicle in turn has the sub-classes Car and Truck, each with its specifics. Car, Truck and Bicycle are all sub-classes of Vehicle and as such are all inheriting the same common behavior, such [...]]]></description>
			<content:encoded><![CDATA[<p>Typically OOP inheritance is used for sharing various common methods and a typical example would be something like this:<br />
You have interface <strong>Vehicle</strong> which has sub-classes <strong>Bicycle</strong> and <strong>MotorVehicle</strong>. <strong>MotorVehicle</strong> in turn has the sub-classes <strong>Car</strong> and <strong>Truck</strong>, each with its specifics. <strong>Car</strong>, <strong>Truck</strong> and <strong>Bicycle</strong> are all sub-classes of <strong>Vehicle</strong> and as such are all inheriting the same common behavior, such as some object which specifies the speed limits within which each <strong>Vehicle</strong> should operate (for example a <strong>Car</strong> should be able to handle higher speeds than a <strong>Truck</strong> or a <strong>Bicycle</strong>).<br />
Fair enough, and this way to use OOP inheritance has its reasons for use.</p>
<p>However, one other reason for using inheritance that I see is for creating substitutes in order to partition code bases. In this case you are using sub-classes not because you need some shared behavior to be encapsulated in a super-class, but because you have distributed teams working on the same codebase and you need to minimize collisions between them in the codebase (a collision would be 2 or more persons working on the same file and is usually resolved by a merge in CVS). Solving conflicts thru CVS merge is a pretty error-prone process and doesn`t scale out well, so at one point it is necessary to partition development so that different teams can work on the same project without elbowing each other.<br />
Sub-classing in this case would solve this problem by letting a developer substitute its team&#8217;s type for another team&#8217;s type.</p>
<p>One example is using helper classes which service a POJO and which are used by more than one team:<br />
Let&#8217;s say that we have a <strong>TaxProcessor</strong> class that uses a <strong>TaxCalculator</strong> for calculating the taxes to be applied to a trade. Let&#8217;s say that you have 2 teams, one working on taxing bond trades and one working on taxing equity trades and that they are all using the same <strong>TaxCalculator</strong> class on the <strong>TaxProcessor</strong>. <strong>TaxCalculator</strong> has the method <em>taxTrade </em>which delegates to <em>taxBondTrade</em> and <em>taxEquityTrade</em>. As time goes on a lot of fixes are put into <em>taxTrade</em> in order to deal with various corner-cases to the point where 1) <strong>TaxCalculator </strong>becomes hard to maintain and 2) more than one developer is working on the same method at the same time. A solution would be to sub-class <strong>TaxCalculator</strong> into <strong>BondTaxCalculator</strong> and <strong>EquityTaxCalculator</strong>, have each implement the method <em>taxTrade</em> according to its specifics and then have <strong>TaxProcessor</strong> use the appropriate class according to the trade type.</p>
<p>As you can see from above good software models imply good separation of concerns. Good separation of concerns translates in good separation between development teams working in parallel on the same project. Good separation between development teams results in low transaction costs or interaction costs between teams and into a more efficient way to delegate work and in a development environment which scales better.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/09/23/oop-inheritance/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Link-less search</title>
		<link>http://microintellia.com/blog/2008/09/19/link-less-search/</link>
		<comments>http://microintellia.com/blog/2008/09/19/link-less-search/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 16:57:26 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=249</guid>
		<description><![CDATA[I was reading this post on BW&#8217;s Blogspotting and I think that link-less is not going to work because the content producers will be pushed out of the equation like it is explained below:
But what Raghavan is describing sounds very much like an effort to push relevant Web pages down, or even out of the [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a href="http://www.businessweek.com/the_thread/blogspotting/archives/2008/03/yahoos_raghavan.html?campaign_id=rss_blog_blogspotting" target="_blank">this post</a> on BW&#8217;s Blogspotting and I think that link-less is not going to work because the content producers will be pushed out of the equation like it is explained below:<br />
<em>But what Raghavan is describing sounds very much like an effort to push relevant Web pages down, or even out of the equation. “We’re not giving you pages, we’re giving you information synthesized from other pages,” he says.<br />
In this scheme, Web pages cease to be destinations. They simply fork over information, gratis. </em> </p>
<p>Yeah, like I would ever want to fork-over my content to Yahoo so that they can put an ad next to it. There is a sense of ownership to the content that you are creating (not necessarily monetizable) that would enrage many content producers if Yahoo would neglect it.</p>
<p><em>If search engines master this transition, how will the Search Engine Optimization crowd tweak their Web pages?</em></p>
<p>If search engines get around to this SEO will transform itself into a business that would protect your content from being pulled out of your site and plastered on Yahoo&#8217;s link-less search.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/09/19/link-less-search/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Speculating on Chrome</title>
		<link>http://microintellia.com/blog/2008/09/02/speculating-on-chrome/</link>
		<comments>http://microintellia.com/blog/2008/09/02/speculating-on-chrome/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 18:21:21 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=235</guid>
		<description><![CDATA[Chrome, the browser developed by Google is about to be released. I get a pretty weird feeling from this, because Google was known to support Firefox, because it comes on such a short-notice and because I don&#8217;t see any benefits to Google, at least not immediately.
Firefox is a pretty decent browser, or more likely, a [...]]]></description>
			<content:encoded><![CDATA[<p>Chrome, the browser developed by Google is about to be released. I get a pretty weird feeling from this, because Google was known to support Firefox, because it comes on such a short-notice and because I don&#8217;t see any benefits to Google, at least not immediately.</p>
<p>Firefox is a pretty decent browser, or more likely, a pretty decent browsing platform onto which you can install various plugins which will make you browsing experience better. Not too bad, even though I have a lot of <a href="/blog/2008/07/31/if-you-want-to-make-ie-look-really-really-good/" target="_blank">problems</a> with their address bar.</p>
<p>I think that what sets Google&#8217;s brower apart from the Firefox and IE, the browsers currently with the biggest market share, is the vast mass of data that Google has upon browser users and the way they will leverage this data to gain market share and the number of web-applications that it has in its portfolio. This browser will probably be integrated with Google&#8217;s other offerings such as GMail, Google Apps, etc&#8230; I think this sets them so far apart that the browser to come out of Google may not look like a browser anymore, but rather as an integration tool between your email (GMail), your RSS reader (Google Reader), your office documents (Google Documents), instant messaging (Google talk), etc&#8230; Who knows, maybe it will integrate even with Google Android ;-).</p>
<p>As I have said before, Google has put together a large amount of data that helps it describe the typical user that browses the web, and I think that this data will be leveraged in order to get ahead of Firefox because it Google may develop better ergonomics with of this data. Google will probably battle against Firefox for market share and this battle will be a battle between application designers (Firefox) and statistics on usage (Google). It will be interesting to see how it unfolds.</p>
<p><a href="#">Later edit:</a> I have been using <a href="www.google.com/chrome/" target="_blank">Chrome</a> for an hour or so and it feels more like a desktop than a browser. It manages to hide away, yet make available when needed, a lot of browser-specific functionalities. It feels like Firefox when run in full-screen mode, it gives you more space and manages to stay in the back-ground. A web-application should take advantage of all this space. The web is the new desktop&#8230;</p>
<p>My assumptions about Chrome&#8217;s design were largely wrong, from what I see Chrome is pretty much concerned with getting the browser out of the browsing experience by using a minimalist design rather than with implementing some funky ergonomics.<br />
I think that its biggest hit is the extra space given to its user and I get the impression that  this extra space will make more of a difference for people <strong>WORKING</strong> thru the browser rather than simply consuming some passivly thru it, because this extra space makes you more productive. I don&#8217;t even see Chrome, yet with a few keystrokes I get any browser-specific functionality I need. I get the feeling that web-applications will need to be re-designed to work in Chrome and take advantage of Chrome&#8217;s extra space, for example Wordpress works atrociously in Chrome. </p>
<p>Oh yeah, and the address bar is way better than Firefox&#8217;s. A few more tests and Firefox is history.</p>
<p><a href="#">Later Edit:</a> Firefox is history as far as I am concerned, I will be using Chrome.</p>
<p><a href="#">Last thoughts on Chrome:</a> Chrome is taking the browser out of web- browsing, it is almost invisible, when I am browsing I don&#8217;t see it at all, it has no edges and no menus, you only get the page that you are working on and its menus (this is why I said that web-applications may need to be re-designed in order to take advantage of the extra space that Chrome gives you, I am a bit confused when I am using Wordpress because where I now see Wordpress&#8217;s menus I was used to see Firefox&#8217;s menus). When I am toggling between pages I feel like I am toggling between 2 different applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/09/02/speculating-on-chrome/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Technical debt</title>
		<link>http://microintellia.com/blog/2008/08/28/technical-debt/</link>
		<comments>http://microintellia.com/blog/2008/08/28/technical-debt/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 13:13:15 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=232</guid>
		<description><![CDATA[You are probably familiar with Martin Fowler&#8217;s Technical Debt, a metaphor around the idea that doing things the quick-and-dirty way creates bad code, bad code which can be viewed as a debt which needs to be paid later in installments (the principal is the re-factoring of the bad code and the installments are the extra [...]]]></description>
			<content:encoded><![CDATA[<p>You are probably familiar with Martin Fowler&#8217;s <a href="http://www.martinfowler.com/bliki/TechnicalDebt.html" target="_blank">Technical Debt</a>, a metaphor around the idea that doing things the quick-and-dirty way creates bad code, bad code which can be viewed as a debt which needs to be paid later in installments (the principal is the re-factoring of the bad code and the installments are the extra effort that this bad code forces on development). The concept was originally <a href="http://www.c2.com/cgi/wiki?ComplexityAsDebt" target="_blank">set-up</a> by Ward Cunninghan.</p>
<p>Technical Debt is pretty much different from ordinary, everyday debt primarily because there is no creditor and no maturity date. Also, unlike regular debt, it is very hard to quantify. Technical Debt seems a bastardized version of regular debt in the sense that some development costs are identified as the principal (the re-factoring of the bad code) and some as the interest (the hacks used for dealing with this bad code) and it is built by taking some concepts out of the ordinary debt concept as the author sees appropriate in order to underline some development costs.<br />
At the same time Tech Debt is defined exclusively from the point of view of the borrower who has to worry about paying the principal and the interest leaving out other actors (even though once you take the creditor out of the picture you have to wonder why you have to pay this debt at all ;-)). But, like Martin Fowler said at the beginning of his article, this is a metaphor, which leaves a lot of room for stretching various concepts. Fair enough.</p>
<p>However, Technical Debt seems to have been taken up and spawned quite a few siblings as you can see in <a href="http://www.infoq.com/news/2008/08/tech-debt-wkshp" target="_blank">this</a> infoq article: liquid assets, moral hazard, fertile assets (???) etc&#8230;, which are either unfortunate enough to bear little or no resemblance to the original economic concepts they try to refer to or unfortunate enough to not refer to anything (<em>fertile assets</em> stands out as a prime example).<br />
Let&#8217;s pick for example &#8220;Liquid Asset&#8221; which is defined this way: <em>Perhaps the term &#8220;technical debt&#8221; focuses us on the wrong things; maybe focusing on the converse, on the investment side of things might be more effective.</em><br />
First of all, a real-world definition: a <a href="http://en.wikipedia.org/wiki/Liquid_asset" target="_blank">liquid asset</a> is an asset for which transaction costs are lower and for which there exists a market in which this asset can be sold and bought for a reasonable fee. Try to look into the above definition (or in this <a href="http://chrismcmahonsblog.blogspot.com/2008/06/technical-investment.html" target="_blank">link</a> which is provided next to it in the infoq example) and if you can spot the asset that is referred to, as well as the market in which this asset is sold and bought and the fees for these transactions please let me know.<br />
Second, switching terms in order to motivate people displays how shallow these concepts are to begin with: if Technical Debt would be a concept that relates to somethings tangible in the real world, if it would manage to encapsulate a real problem or some real costs then Tech Debt should should not be swept under the rug for fear of under-mining the developers&#8217; morale, but rather dealt with up-front because in doing so you would solve a real problem. The fact that Tech Debt is used the way this way points to the fact that it is so vaguely defined that few people can extract some somthing valuable out of it and that it can be stretched in any direction you want to.</p>
<p>What I see when I am reading the infoq article mentioned above are the first steps in the attempt to &#8220;marry&#8221; 2 fields which are pretty different one from another: economics and writing code and the excesses which appear when interest start to pick up in some vague concept (excesses similar to the introduction of the SOA concept). There is a desire to bring IT development under control and one way to look at it is to define costs and benefits associated with various actions and then apply economics to these costs and benefits in order to write code more efficiently. I don&#8217;t know where this will lead because we are at the beginning of exploring this.</p>
<p>As far as I am concerned I have developed an interest in economics a while ago and I read on it as much as I can. I also tried to &#8220;marry&#8221; the domains of writing code with and of economics, I even have an Econo-computing category, but I find it pretty hard. So far the only economic concept I found that can be applied pretty well to software development are <a href="http://en.wikipedia.org/wiki/Transaction_cost" target="_blank">transaction costs</a> because they actually encapsulate pretty well some very real costs which arise when various entities are interacting one with another.</p>
<p>I will be following this Econo-computing field with a lot of interest and, who knows, maybe the concepts in this field will actually start to relate to something tangigle in the real world and will improve developer productivity.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/08/28/technical-debt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Relaxing ACID properties as you scale out</title>
		<link>http://microintellia.com/blog/2008/08/12/relaxing-acid-properties/</link>
		<comments>http://microintellia.com/blog/2008/08/12/relaxing-acid-properties/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 18:38:01 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=218</guid>
		<description><![CDATA[A while ago I looked at the transition currently occuring in enterprise computing from ACID transactions to compensation by message passing. I concluded by saying that relaxing ACID properties and achieving state alignment via message passing is essentially shifting the costs from the costs of ACID transactions (such as database rows locking) to complexity costs [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I <a href="/blog/2008/02/01/asynchronous-processing-and-oop">looked</a> at the transition currently occuring in enterprise computing from ACID transactions to compensation by message passing. I concluded by saying that relaxing ACID properties and achieving state alignment via message passing is essentially shifting the costs from the costs of ACID transactions (such as database rows locking) to complexity costs (such as managing the growing number of messages between systems which are compensating for these relaxed transactions). Another side effect is the introduction of latency in this state alignment process: thru ACID transactions state alignment is achieved at the time the operation takes place while thru message passing it occurs some time later.</p>
<p>I was watching <a href="http://www.infoq.com/interviews/gregor-hohpe-conversations" target="_blank">this interview</a> on infoq and I found that Gregor Hohpe pretty much voiced the same opinions, that as you scale out it is impossible to achieve state alignment at the time the operation and that you need to compensate for it by passing messages.These complexity costs are essentially the costs of managing business logic as it spawns across multiple systems, applications, departments, etc&#8230; State alignment in these cases consists primarily of having various business analysts agree on how these systems should interact (should this trade go to this depot for that security for that client) and then implementing the interaction between these systems. One thing that is not very obvious is that the cost of interaction between systems is pretty close to the cost of interaction between the departments running these systems and that as you scale out you need to be able to accomodate or change various departments you are encountering (<a href="#">*</a>).</p>
<p>It is interesting to watch the interview from this point of view because you get to see the costly hacks that various organizations got to make in order to get their systems to talk to one another (the horrific &#8220;magic account&#8221; used in one bank makes one hair stand up). Gregor goes as far as saying that these ways to deal with these problems are pretty common, so common actually that at one point he gets defensive about the sloppiness which comes thru these examples. The fact that these problems are wide-spread is a pretty bad excuse, ideally these systems would be architected so that we do not need to add one layer of hacks on top of another in order to get something of value out of them.</p>
<p>At the end of this interview I ended up with the impression that we are on the first iteration of relaxing the ACID properties and that I got a pretty good glimpse into the costs associated with this relaxation. Sometime in the future patterns for relaxing these properties will appear and problems common in all these compensations will be solved. I think that these patterns will be more oriented towards business-logic and management rather than towards technology. Efficient interactions revolve around small <a href="http://en.wikipedia.org/wiki/Transaction_cost" target="_blank">transaction costs</a> and minimizing transaction costs will be part of the solution of managing this growing complexity.</p>
<p><a href="#">*</a> Interestingly enough an SOA strategy will probably take these costs down if it manages to impose procedures so that various departments interact one with another more efficiently. However, I am pretty skeptical that we will see a lot of progress soon on this front.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/08/12/relaxing-acid-properties/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An unsual single point of failure</title>
		<link>http://microintellia.com/blog/2008/08/06/an-unsual-single-point-of-failure/</link>
		<comments>http://microintellia.com/blog/2008/08/06/an-unsual-single-point-of-failure/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 17:01:05 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=211</guid>
		<description><![CDATA[Today when I went to check my RSS feeds on bloglines I was presented with the following:

Quickly I realized that I was cut-off from any source of information that I use because I access sites mostly thru their RSS feeds and my RSS feed reader was down. It was out of the question to go [...]]]></description>
			<content:encoded><![CDATA[<p>Today when I went to check my RSS feeds on bloglines I was presented with the following:<br />
<a href="/blog/wp-content/uploads/2008/07/bloglines-down.jpg"><img class="alignnone" src="/blog/wp-content/uploads/2008/07/bloglines-down.jpg" alt="" width="920" height="346" /></a></p>
<p>Quickly I realized that I was cut-off from any source of information that I use because I access sites mostly thru their RSS feeds and my RSS feed reader was down. It was out of the question to go to those sites and read the news from their homepage (<a href="#">*)</a> because those sites (BW, FT, Forbes,, Le Monde, infoq, etc&#8230;) have tons of content and I would not be able to navigate it in order to find what I like (this was what my RSS feeds were doing).<br />
It was a pretty weird feeling to see how underlined how dependent I am on my feed reader and that my feed reader has become a single point of failure in my contact with various content providers. Take bloglines out and I am pretty much out of contact with pretty much anything I am following. And I don&#8217;t think that I can do much about it (<a href="#">**</a>).<br />
I can only hope that they come back up quickly&#8230;</p>
<p><a href="#">*</a> BTW, for a pretty interesting analysis oh how RSS changes browsing patterns please check out <a href="http://blog.guykawasaki.com/2008/02/avenue-a-razorf.html">this post</a> on Guy Kawasaki&#8217;s blog. The concept that &#8220;any page is a homepage&#8221; due to the various channels which are sending users to that page will change a few things in the content publishing business.</p>
<p><a href="#">**</a> Actually I could turn to my Google reader account to read the feeds from there, but this would mean that I need to update the OPML of my Google account, determine what stories are new and which ones I have read, etc&#8230; I could get past this single point of failure, but there are costs associated with it. Strangely enough, using Google reader as a replacement for Bloglines is similar to some work-arounds used for avoiding single points of failures in enterprise systems (synchronizing redundant machines).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/08/06/an-unsual-single-point-of-failure/feed/</wfw:commentRss>
		</item>
		<item>
		<title>EDA, clustered caches and triggers</title>
		<link>http://microintellia.com/blog/2008/08/01/eda-clustered-caches-and-triggers/</link>
		<comments>http://microintellia.com/blog/2008/08/01/eda-clustered-caches-and-triggers/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 23:12:15 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=204</guid>
		<description><![CDATA[A while ago I went to a presentation where the speaker was talking about the migration of an application from a typical MDB-based work-flow application to an EDA-based application. One of the drivers of this migration was the fact that their application`s data has grown so large that the database storing it was having performance [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I went to a presentation where the speaker was talking about the migration of an application from a typical MDB-based work-flow application to an EDA-based application. One of the drivers of this migration was the fact that their application`s data has grown so large that the database storing it was having performance problems. One of the solutions which were studied was to move the data tier into a clustered, transactional cache which would update the database asynchronously, essentially moving the database to a simple store of data on which you could run reports.</p>
<p>Not a bad idea, the data would reside in this clustered cache and it would be made available to the application. One other thing that was considered was turning the whole architecture on its head and turn from the work-flow application into an EDA application. This is how it was supposed to come: the clustered cache came along with the capability of adding events to data as data was handled (inserts, updates, deletes, etc&#8230;). This would mean that while you previously had to have an MDB that was listening for a stock-quote request you could now code a stock quote object which you would throw in this clustered cache and which could listen for events. The clustered cache would have both flushed the stock quote objects to a database and would have call events on it. The stock quote object would in turn update other objects (let`s say positions for that stock) and while these positions would get updated they would fire more events in turn. A part of the business logic would be stored in these events and in the message passing that occurs between them, in a sort of event-driven-architecture.</p>
<p>The more I think about this, the more I get the impression that these events are nothing more than triggers in a database (the clustered cache taking on the role of the database). And coding your business logic in triggers is not a <a href="http://rwijk.blogspot.com/2007/09/database-triggers-are-evil.html">good</a> thing if you listen to <a href="http://www.google.ca/search?hl=fr&amp;q=tom+kyte+%22triggers+are+evil%22&amp;btnG=Recherche+Google&amp;meta=">people with experience in database programming</a>. Relationships between various entities and the interactions between them should probably be modeled at a higher level than at object level, when you are coding business logic in triggers you are essentially limited to that object&#8217;s scope.</p>
<p>Now, the idea of putting the business logic into these triggers comes from a pretty hard problem: the fact that for most artchitectures out there the data store is physically away from the code that is implementing the business logic, the database which holds the data and which needs to be consulted by the business-logic tier for data. Bridging this physical distance and the performance problems that come with it was solved in various ways: pushing the business logic into the database in the form of stored procedure, addind various caching mechanisms so that data is pushed towards the middle-tier, etc&#8230; In the example above part of the reasons for pushing the business logic into these events was you would effectively push the business logic into the new data-tier (the clustered cache in this case which would trigger these events). I would say that this is a pretty interesting approach with some benefits, but attention should be paid to minimizing the number of events (triggers) which get implemented.<br />
A decade of PL-SQL development would recommend this&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/08/01/eda-clustered-caches-and-triggers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>If you want to make IE look really, really good&#8230;</title>
		<link>http://microintellia.com/blog/2008/07/31/if-you-want-to-make-ie-look-really-really-good/</link>
		<comments>http://microintellia.com/blog/2008/07/31/if-you-want-to-make-ie-look-really-really-good/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 13:09:09 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=199</guid>
		<description><![CDATA[&#8230; then all you have to do is download and install Firefox 3 (download link is not provided on purpose, I do not want to feel guilty for directing people towards it).
I was pretty happy with Firefox 2 and I started using Firefox 3 only after a friend recommended it. I had some doubts, mainly [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; then all you have to do is download and install Firefox 3 (download link is not provided on purpose, I do not want to feel guilty for directing people towards it).</p>
<p>I was pretty happy with Firefox 2 and I started using Firefox 3 only after a friend recommended it. I had some doubts, mainly when I was seeing the <a href="/blog/wp-content/uploads/2008/07/firefox-address-bar.jpg" target="_blank">horrific address bar</a> that Firefox 3 decided fit to implement. I have installed it, and after 3 days I wanted back to Firefox 2. My only beef (but a big one) with Firefox 3 is the address bar and the way it searches thru your browsing history and displays possible addresses you are trying to type. It is a great exercise in obfuscation, the new address bar manages to both hide away what you are typing (the font of the address bar is smaller than the font of the browsing history search results) and obfuscate the results of the browsing history search (bold-ing the hits of the word you type in the address bar causes further confusion as you are reading the results of the browsing history).</p>
<p>To make things even more confusing FF3 changed the way it searches the browsing history. Previously it was matching the address that you are typing against former URLs, now it tries to match the address that you are typing against URL, page titles, URL snippets, etc&#8230; in a pathetic attempt at mining your browsing history. In FF2 I used to be able to find my address with a few key-strokes, now my eye keeps scanning this list that FF3 dumps on the unsuspecting user:<img class="alignnone" title="FF3 Address Bar" src="/blog/wp-content/uploads/2008/07/firefox-address-bar.jpg" alt="" width="918" height="709" /></p>
<p>I thought pretty seriously to go back to Firefox 2, but Firefox 2 will be discontinued in December. So I am stuck with this browser, let&#8217;s call it this way for lack of a better name. Frankly, I am waiting to run IE7 on my computer, it cannot be dumber than FF3.</p>
<p>Firefox 3 is to Firefox 2 what Vista is to XP. Period.</p>
<p><a href="#">Later Edit</a> Maybe I got too carried away, but what they have done to the address bar and to the address completion algorithm it is horrific. I really liked the way FF2 was displaying the addresses, it was clean, uncluttered and to the point. None like FF3&#8217;s address bar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/07/31/if-you-want-to-make-ie-look-really-really-good/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Future education</title>
		<link>http://microintellia.com/blog/2008/07/23/future-education/</link>
		<comments>http://microintellia.com/blog/2008/07/23/future-education/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 19:19:38 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=189</guid>
		<description><![CDATA[If you read literature on economic development you are probably familiar with the declining American high school graduation rate and its effects on inequality due to the differences in income between the educated and non-educated members of society. A person which has not graduated from high-school will have quite a lot of problems securing an [...]]]></description>
			<content:encoded><![CDATA[<p>If you read literature on economic development you are probably familiar with the <a href="http://www.voxeu.org/index.php?q=node/930" target="_blank">declining American high school graduation rate</a> and its effects on <a href="http://www.voxeu.org/index.php?q=node/1459" target="_blank">inequality</a> due to the differences in income between the educated and non-educated members of society. A person which has not graduated from high-school will have quite a lot of problems securing an income in an economy where the low-skilled, labor-intensive jobs have been moved to China.</p>
<p>One reason that I see for this problem is the current misalignment between early education providers (such as high schools) and labor market. High school&#8217;s main goal is creating &#8220;better&#8221; human beings, its mandate is more social than economic. However with the tilting of the labor market towards jobs which require education it appears that education providers should also find a way to respond to economic concerns about the students entering an educational establishment.</p>
<p>I would say that we need shift the way we think about education towards economic concerns and insert some incentives into the educational process that reflect these economic concerns.</p>
<p>I don&#8217;t have time to finish this post, I will probably re-visit it later.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/07/23/future-education/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Grid design patterns - de-normalized data</title>
		<link>http://microintellia.com/blog/2008/06/10/grid-design-patterns/</link>
		<comments>http://microintellia.com/blog/2008/06/10/grid-design-patterns/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 12:20:55 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/06/10/grid-design-patterns/</guid>
		<description><![CDATA[I am watching with a great deal of interest developments in the grid and large scale computing environment because I always found distributed computing interesting.
One very interesting thing that I come across pretty often is the fact that in large scale computing data tends to get de-normalized, basically it grows so large that you cannot [...]]]></description>
			<content:encoded><![CDATA[<p>I am watching with a great deal of interest developments in the grid and large scale computing environment because I always found distributed computing interesting.</p>
<p>One very interesting thing that I come across pretty often is the fact that in large scale computing data tends to get de-normalized, basically it grows so large that you cannot fit the entities and the relationships between entities in the same database (<a href="http://www.infoq.com/news/2008/05/principles-to-big-table" target="_blank">this</a> infoQ article is pretty good).<br />
Let me give an example: suppose that you have table of users and a table or messages between users having these columns:<br />
<strong>users</strong>: userID int, firstName String, lastName String, email String<br />
<strong>user_messages</strong>: fromUserID int, toUserID int, messageTest String.<br />
In the initial design a message from user A to user B would have only one record in <strong>user_messages</strong> and each user will be able to get the messages it has sent and the messages it has received from this table.<br />
Now let&#8217;s say that the number of users sky-rockets to the point where you need to partition your database horizontally into a series of identical replicas. The problem that you will face now is where to store the data that is shared between these replicas, namely the table <strong>user_messages</strong>. You cannot store it either in the replica hosting user A&#8217;s data, neither in the replica hosting user B&#8217;s data and neither in its own instance because it will grow too large and because you will need to carry out a join over 2 physically remote databases. The solution is to drop <strong>user_messages</strong> for <strong>received_user_messages (from_user_name, from_user_email, message_text)</strong> and <strong>sent_user_messages</strong> <strong>(to_user_name, to_user_email, message_text) </strong>which will store the messages that a user has sent and the ones that it had received. Each database replica will have its own instance of these 2 tables each mapped to the user table. As you can see we are not storing the userID in the message tables, but rather the user information which was previously retrieved via joins.<br />
Sending a message from user A to user B in this environment typically involves updating 2 tables in 2 separate database instances which usually is treated as a distributed transaction. However, you cannot carry out this distributed transaction because it is very costly so sometimes you resort to updating one table and sending a message to update the second table asynchronously (the overhead for delivering a JMS message is way less than the overhead for locking rows in the second database). In the case of updating the second table asynchronously you are still enforcing the relationships between the user table and the user message tables, but at a later point in time.<br />
De-normalized data comes with synchronization costs: when you are updating the user information on the <strong>users</strong> table you will need to propagate the changes to <strong>received_user_messages</strong> and <strong>sent_user_messages </strong>so that the data stored in these tables will be up-to-date. This could be done via asynchronous processing as well, sending a message about data being changed on an ESB and having the concerned parties listening for and processing it. Synchronization costs should be watched very carefully because they could spawn a very high number of messages. Ideally we would synchronize data which is updated rarely (such as user information) in order to keep the number of synchronization messages down. Carrying out synchronization procedures in batches could be a way to deal with a large number of synchronization messages with the side effect that it may increase the latency with which the synchronization takes place.</p>
<p>Large scale computing typically seems to resolve around asynchronous processing (because in transactions message passing is cheaper than database access) and de-normalized data across with the overhead implied by it. The relationships previously enforced by normalizing data are usually enforced by passing JMS messages which carry out the data changes asynchronously. This design is driven primarily by the large volume of data which cannot be serviced by only one database and by the costs of carrying out a distributed transaction spanning 2 databases.<br />
This is one design that I see emerging for large scale computing: de-normalized data along with asynchronous processes which are enforcing the relationships between entities via message passing.</p>
<p>It remains to be seen if this type of grid architecture will prevail in the future. Working against it is the emergence of multi-core processors which would allow for scaling up cheaply as envisaged by Brian Goetz in <a href="http://www.ibm.com/developerworks/java/library/j-jtp11137.html?ca=drs-" target="_blank">this article</a>. If chips with hundreds of multi-cores and with large amounts of memory become reality scaling out could end-up costing more than scaling up and all the above could become history pretty fast. Scaling out will continue to make sense in some environments with humongous amounts of data (think Amazon, Google, eBay, etc&#8230;) but for the current fastest growing segment in grid applications, typically applications processing moderately large amounts of data, it may make sense to scale up once chips with a large number of multi-cores become a reality.</p>
<p>To watch&#8230;</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">P.S.</a> These shifts in data processing (moving to a grid-type of architecture in order to accommodate the increase in data and then back to a single-box architecture because of the appearance of chip with a large number of cores) makes a pretty good case for abstraction in order to lower the costs of transition from one architecture to another. Ideally the architecture and the environment in which an application runs should not affect the business logic of that application. One way to insulate your application&#8217;s business logic from these infrastructure issues is by abstraction.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/06/10/grid-design-patterns/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Freeing our data</title>
		<link>http://microintellia.com/blog/2008/05/27/freeing-our-data/</link>
		<comments>http://microintellia.com/blog/2008/05/27/freeing-our-data/#comments</comments>
		<pubDate>Tue, 27 May 2008 13:01:22 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/05/27/freeing-our-data/</guid>
		<description><![CDATA[I was reading this post on BW&#8217;s Blogspotting  and at first I agreed with it, maybe in the future the companies that currently hold our data to release it to the outside so that it can be mashed-up with other data that we have created and that is stored in other applications.
A pretty nice [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a href="http://www.businessweek.com/the_thread/blogspotting/archives/2008/05/freeing_our_dat.html" target="_blank">post</a> on BW&#8217;s Blogspotting  and at first I agreed with it, maybe in the future the companies that currently hold our data to release it to the outside so that it can be mashed-up with other data that we have created and that is stored in other applications.</p>
<p>A pretty nice picture of the future, but I don&#8217;t think anymore it will happen at a large scale because I think that data is the primary way that a company uses for binding an user to its services, an issue that I have briefly touched upon in this <a href="/blog/2008/04/23/pinned" target="_blank">post</a>. If the datastores get opened then the cost of user migration from one service to another goes down and with it the risk of seeing your users migrate to your competitors. The data a user creates while using a service, and not service&#8217;s functionality, is what makes a user continue to use that service because migrating to a similar service implies losing what the data that it has created.</p>
<p>One other road-block to exporting data and using it outside of the place where it originated is the way it will interact with the outside systems and the possible problem of standards: how will data from one service be packaged so that it can be consumed easily by other services? Exporting the data in some RSS format and mashing it up in a Yahoo Pipes fashion could provide a way around the thorny issue of standards.<br />
Security is another issue that comes to mind when dealing with exporting data.</p>
<p>For some companies binding users to their services by locking their data down doesn&#8217;t apply and Netflix is a pretty good example: Netflix can open up their users data because their service is about renting hard-to-find movies and not about hoarding user&#8217;s data in one form or another (email services, RSS readers, on-line newspapers, etc&#8230; are all about storing users data and applying some sort of functionality to it).</p>
<p>So we will have to wait and see how this un-folds. Frankly I do not think that data will get freed any time soon, in a world in which user loyalty exists only in history books companies will try anything it takes to bind users to their services and this includes data hoarding.<br />
Data will probably get shared (<a href="#">later edit: </a>but it will not be free in the sense that we can cherry-pick who is using it and who is not) between the different services within a large corporation not across corporations or between various companies thru partnerships, but data will not be freed without constraints. Controlling the way a service&#8217;s data is made available to other services will bind a user to that service even more because giving up on a service will mean giving up on the data stored within that service as well as giving up on the integration between that service and its partner services (within or without the original service&#8217;s corporation).</p>
<p><a href="#">Later edit:</a> This is <a href="http://www.businessweek.com/the_thread/techbeat/archives/2008/07/f8_facebook_is.html" target="_blank">one example</a> of how our data will be shared among various entities. The new portal as envisaged by Catherine Holahan is simply a way of storing user information and disseminating it into its partner sites. Interesting to watch&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/05/27/freeing-our-data/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Spring Application Platform</title>
		<link>http://microintellia.com/blog/2008/05/18/the-spring-application-platform/</link>
		<comments>http://microintellia.com/blog/2008/05/18/the-spring-application-platform/#comments</comments>
		<pubDate>Sun, 18 May 2008 02:42:38 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/05/18/the-spring-application-platform/</guid>
		<description><![CDATA[You must have heard about the latest offering from Spring Source, the SpringSource Application Platform, a platform based on OGSi which aims to help developers partitions their application into logical units (called bundles) and then manage the interactions between them. A very interesting product from Spring Source in an environment which seems familiar: application management. [...]]]></description>
			<content:encoded><![CDATA[<p>You must have heard about the latest offering from Spring Source, the <a href="http://www.springsource.com/web/guest/products/suite/applicationplatform" target="_blank">SpringSource Application Platform</a>, a platform based on OGSi which aims to help developers partitions their application into logical units (called bundles) and then manage the interactions between them. A very interesting product from Spring Source in an environment which seems familiar: application management. To a certain extent the SpringSource Application Platform is the logical extension of their first product, the IoC container: an IoC container is managing the relationships between classes, the SpringSource Application Platform is managing the relatioships between components.</p>
<p>I have looked a bit at this product, but for now I do not have the time to try it out, so I read up a bit on it and read some blog posts. The award for the most imbecile post written about S2AP goes pretty easily to <a href="http://www.thedelphicfuture.org/2008/04/springsources-application-server.html" target="_blank">Marc Fleury</a> who manages to get it wrong from the title: <strong>SpringSource`s Application Server.</strong> To him S2AP is an application server which is coming too late to the market, the market being currently dominated by, you must have guessed it, JBoss. Pretty hilarious as well as also his musings about VCs. The point is that S2AP is not an application server because it doesn`t provide the services that an application server typically provides, it is just a platform for putting together an application.</p>
<p>Another interesting post comes from <a href="http://www.osgi.org/blog/2008/05/springsource-application-platform.html" target="_blank">Peter Kriens</a> about S2AP extending the OSGi container: probably Spring Source is leveraging the market share it enjoys in order to add some headers that it finds necessary for doing a better logical partition of an application. It is confusing to the people behid OSGi, <span style="text-decoration: line-through;">and probably a bit unfair</span><a href="http://microintellia.com/blog/wp-admin/post.php#">(**)</a>, but I guess it it part of the game.</p>
<p>The fact that you have more control over the way you partition an application into bundles will drive the specialization of components further. In the future you will probably buy specialized bundles which target a very speficic functionality and wire them up in the SpringSource Application Platform, Billy Newport`s hits the nail on the head in this <a href="http://www.devwebsphere.com/devwebsphere/2008/05/springsource-ap.html" target="_blank">post</a>. You will not need to buy an application server from IBM or BEA or someone else only because you need a state of the art transaction manager and not use, while paying for, the rest of the capabilities that that application server comes with, but rather you will be able to buy only the transaction manager, plug it into your application as a bundle, expose its services and then integrate it into your application&#8217;s components.<br />
This is probably where Spring has the potential to do the most damage to the traditional app servers vendors in the future because it will force them to un-bundle their app servers into offerings that will be sold on the market as single bundles (a transaction manager, a JMS engine, etc&#8230;) rather than integrated solutions. It remains to be seen how this will un-fold, but the potential for damage is there. The road towards un-bundling of application servers into specialized components is a very disruptive process (<a href="http://microintellia.com/blog/wp-admin/post.php#">*</a>) to both app server vendors and their customers and as a result it will take a while to become mainstream but I think that this is where we are going: to specialized components bundled into applications.</p>
<p>I would conclude by saying that the future of S2AP is a bit uncertain, it is a brand-new product targetting a fairly new market, the market for composing applications out of components in OSGi (<a href="#">***</a>). If there is a need for this type of application composition probably Spring will occupy a large part of the market leveraging their brand, their product portfolio and know-how.<br />
I wish them a lot of luck in this enterprise and I will follow it closely.</p>
<p><a href="http://microintellia.com/blog/wp-admin/">*</a> I think that this is the most disruptive product to be released by the Spring people since the IoC container. It took a while for the IoC container to start having an effect in the JEE world, but once its benefits were recognized it revolutionized JEE. Let&#8217;s see if this will happen again.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">**</a> As Glyn has pointed out the OSGi-like headers are syntactic sugar. They created a bit of a confusion, but apparently it is getting straightened out.</p>
<p><a href="#">*** Later Edit:</a> I don&#8217;t know why but I get the impression that setting up a marketplace for these components would help their adoption. At the very least this would open a venue for people interested in trying them out and people interested in selling them.</p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/05/18/the-spring-application-platform/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pinned</title>
		<link>http://microintellia.com/blog/2008/04/23/pinned/</link>
		<comments>http://microintellia.com/blog/2008/04/23/pinned/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 12:47:02 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/04/23/pinned/</guid>
		<description><![CDATA[Like many other people I use a Bloglines for reading various RSS feeds to which I am subscribed. Bloglines has a pretty nifty feature, it lets you pin various items in an RSS feed so that you can re-visit them later. Pretty nifty, and I use it a lot.
Except that I find right now that [...]]]></description>
			<content:encoded><![CDATA[<p>Like many other people I use a Bloglines for reading various RSS feeds to which I am subscribed. Bloglines has a pretty nifty feature, it lets you pin various items in an RSS feed so that you can re-visit them later. Pretty nifty, and I use it a lot.</p>
<p>Except that I find right now that I am pinned to Bloglines. Let me explain.<br />
Any feed reader lets you export your OPML file which contains your feeds grouped into categorie and this feature pretty much lets you travel from feed reader to feed reader without many headaches. No feed reader would take its users hostage by refusing to export their OPML file because every user will refuse to be taken hostage in such a way.<br />
However, if you use Bloglines&#8217; pin feature a lot you will find yourself hostage to Bloglines because you cannot export the items that you have pinned and leaving Bloglines would also mean leaving behind the items that you have pinned and that are probably important to you. You cannot export these pinned items typically because this is a feature which is not widely-used by other feed readers and when it is used by other feed readers it is implemented in a variety of flavors which makes its export inefficient.</p>
<p>So I would say that I pretty much taken hostage by a feature. A niche feature, which makes a pretty interesting case for niche products: if you manage to get your user to create data while using your niche product, chances are that your user will be hostage to the data that it created and the feature consuming this data because this data cannot be exported easily to your competitors&#8217; services. Pretty interesting&#8230;<br />
<a href="http://microintellia.com/blog/wp-admin/post-new.php#">P.S.</a> Initially when I started pinning items on Bloglines I realized that I will be taken hostage to this feature and I thought about bookmarking them on del.icio.us. But I decided that I am too lazy for this. So I guess I&#8217;ll have to use Bloglines for quite a while&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/04/23/pinned/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Olympic torch saga</title>
		<link>http://microintellia.com/blog/2008/04/10/the-olympic-torch-saga/</link>
		<comments>http://microintellia.com/blog/2008/04/10/the-olympic-torch-saga/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 12:52:03 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/04/10/the-olympic-torch-saga/</guid>
		<description><![CDATA[This is what carrying the Olympic torch thru San Francisco looked like:
The first torchbearer held the Olympic flame aloft triumphantly. She waved to the crowd and set off — and promptly ran into a warehouse.(src).
After, of course, being carried thru London (seconds 25 thru 35 are particularly telling) and Paris (carrying the torch in a [...]]]></description>
			<content:encoded><![CDATA[<p>This is what carrying the Olympic torch thru San Francisco looked like:<br />
<em>The first torchbearer held the Olympic flame aloft triumphantly. She waved to the crowd and set off — and promptly ran into a warehouse.</em>(<a href="http://www.courant.com/news/nationworld/hc-torch0410.artapr10,0,5282222.story" target="_blank">src</a>).<br />
After, of course, being carried thru <a href="http://www.youtube.com/watch?v=hFJxfEX8RfA" target="_blank">London</a> (seconds 25 thru 35 are particularly telling) and <a href="http://www.youtube.com/watch?v=b8D6vAGae58" target="_blank">Paris</a> (carrying the torch in a bus amids boos and police on roller-blades stands out).</p>
<p>I am wondering if the IOC realizes what these events are doing to its brand (<a href="http://microintellia.com/blog/wp-admin/post-new.php#">*</a>) because lately the Olympic torch has become the symbol of collaboration with a brutal regime which has to be put out rather than a symbol of peace and fraternity. I am also wondering how things will play out in Beijing, because this is where the next episode of this saga will probably play. Right now the torch is safely out of the Western world where dissent is allowed (<a href="http://microintellia.com/blog/wp-admin/post.php#">**</a>) and it is passing thru a string of authoritarian regimes where it will not encounter any serious resistance.<br />
I would not be too surprised if the Olympic stadium will be empty, most of the Olympic tourists preferring to stay at home. I would not be too surprised if the Chinese government would fill this stadium with people picked up at random from the street. And I would not be too surprised if we will have some similar incidents in Beijing as well. If we do have these incidents the last place that I would be in is in IOC&#8217;s shoes: they would pretty much have to wait on the sidelines and pray that the Chinese government will not quell these dissenters (which happen to be all IOC customers) with too much brutality.</p>
<p>Personally, I think that these events are good. They are bringing home to the IOC the dangers of doing business with dictatorships: they could devalue your brand and beat the hell of the people that believe in your values in front of the cameras. Maybe they will think twice before awarding the place where the next Olympic games will take place&#8230;</p>
<p><a href="http://microintellia.com/blog/wp-admin/post-new.php#">*</a> Unlike the IOC the Chinese government doesn&#8217;t have these PR problems. It will probably continue to act the way that it does, brutally that is, after all its interests lie exclusively in providing cheap labor to the Western world and using the gains from it for consolidating its regional position. China is light years away from having any meaningful dialogue with a regular guy living in the Western world.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">**</a> The fact that the IOC banks on the success of this torch-bearing missing on collaboration with authoritarian regimes will not be lost on many. If I were in a decision-making position within the IOC I would play down the passing of the torch thru these countries because it would stress this collaboration even more. After all, IOC&#8217;s main customer is living in the Western world and you probably don&#8217;t want to alienate it by playing down its values&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/04/10/the-olympic-torch-saga/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Insufficient knowledge as moral hazard</title>
		<link>http://microintellia.com/blog/2008/04/09/insufficient-knowledge-as-moral-hazard/</link>
		<comments>http://microintellia.com/blog/2008/04/09/insufficient-knowledge-as-moral-hazard/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 21:21:49 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/04/09/insufficient-knowledge-as-moral-hazard/</guid>
		<description><![CDATA[I find that insufficient knowledge about a system or a package poses a moral hazard because it encourages people interacting with that system or package to take all sorts of short-cuts in order to get something done and do so thinking that they know what the effects of their actions are.
Knowing how a package implements [...]]]></description>
			<content:encoded><![CDATA[<p>I find that insufficient knowledge about a system or a package poses a moral hazard because it encourages people interacting with that system or package to take all sorts of short-cuts in order to get something done and do so thinking that they know what the effects of their actions are.</p>
<p>Knowing how a package implements some business requirement may make a developer pick up a method from that package and use it because it fits its requirements. Unchecked this may lead to spaghetti-code, pretty much everybody calling methods from all over the place in order to get their job done quickly.<br />
Using restrictive access attribute (such as private methods) is not really a work-around, if someone thinks they need a private method to be made public because they &#8220;know&#8221; the package they will usually make it public without any second thoughts.</p>
<p>The right approach to interacting in a new way with a package or system is to delegate that interaction to that package, i.e. to code this interaction in the package itself if possible. As I was arguing in a <a href="/blog/2007/12/03/transaction-costs-in-software-development/" target="_blank">previous post</a> knowledge about a package is one of the transaction costs of interacting with that package. Transaction costs usually delimitate who does what because resources will typically cluster together into larger entities in order to bring these transaction costs down. Transaction costs, when handled correctly, will prevent methods whose usage requires extensive knowledge (and which carry large transaction costs) to be called from all over the application. Methods that get called from all over the application are typically methods about which little knowledge is required, helper methods being a good example.</p>
<p>So I would advise people to either make sure that whoever is using their packages either understands them well or very little, having people in the middle that think they &#8220;know&#8221; the package may result in incorrect usage of their packages.<br />
I would also advise people to refrain from spreading knowledge about their packages indiscriminately and rather target the recipients of this knowledge carefully.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/04/09/insufficient-knowledge-as-moral-hazard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Things you would not expect to find at Walmart</title>
		<link>http://microintellia.com/blog/2008/04/02/things-you-would-not-expect-to-find-at-walmart/</link>
		<comments>http://microintellia.com/blog/2008/04/02/things-you-would-not-expect-to-find-at-walmart/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 15:01:15 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/04/02/things-you-would-not-expect-to-find-at-walmart/</guid>
		<description><![CDATA[I was walking down the aisles at Walmart the other day when I came across this product: fair trade coffee.
You have to wonder what is the relationship between Walmart and the producers of fair trade coffee: does Walmart reins in the urge to apply its enormous clout in order to drive the prices down on [...]]]></description>
			<content:encoded><![CDATA[<p>I was walking down the aisles at Walmart the other day when I came across this product: fair trade coffee.</p>
<p>You have to wonder what is the relationship between Walmart and the producers of fair trade coffee: does Walmart reins in the urge to apply its enormous clout in order to drive the prices down on these producers, most of whom are pretty small and un-organized? Or it does apply its clout, but reluctantly? Or it doesn&#8217;t exert any price pressures on fair trade coffee producers and uses fair trade coffee to increase its appeal among a particular demographic?</p>
<p>Strange, I was a bit shocked to find this on a Walmart shelf&#8230;</p>
<p>BTW, the price for that coffee was pretty high by Walmart standards, I could have bought 2 1-liter coffee jugs (I can&#8217;t believe that coffee can be bought this way unless you have a coffee shop or something) for the price of 250 grams of fair trade coffee.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/04/02/things-you-would-not-expect-to-find-at-walmart/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What future for health-care in Quebec?</title>
		<link>http://microintellia.com/blog/2008/03/27/what-future-for-health-care-in-quebec/</link>
		<comments>http://microintellia.com/blog/2008/03/27/what-future-for-health-care-in-quebec/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 17:16:37 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/03/27/what-future-for-health-care-in-quebec/</guid>
		<description><![CDATA[If you are living in Quebec you are probably aware about the debate surrounding the privatization of health-care, a debate that has been going on for quite a while. The debate about health-care in general has been going on for more than a decade, I wish I had a dollar for each political platform targeting [...]]]></description>
			<content:encoded><![CDATA[<p>If you are living in Quebec you are probably aware about the debate surrounding the privatization of health-care, a debate that has been going on for quite a while. The debate about health-care in general has been going on for more than a decade, I wish I had a dollar for each political platform targeting this issue which pops up around election time.</p>
<p>There are generally 2 sides to the privatization of health-care debate: the side pushing for the privatization of health care services, typically pro-business,  and the side wanting the government to run health care services, typically leaning towards a social democracy-type model.<br />
The pro-business camp&#8217;s opinion is that privatizing health care services would make them more efficient and would also transfer the burden to the ones willing and able to pay for them.<br />
The pro-social-democracy camp argues that this would cause an exodus of health-care professionals from the public services, which are barely coping with the current demand and which pay less, to the private services which would pay more and where health-care professionals would work under a smaller work load due to the filtering of &#8220;customers&#8221; by price. They argue that this would result in further degradation of the public health-care services, due to an even smaller number of professionals working for it, which in turn would raise the incentives for leaving it. The public health-care services would enter a down-ward spiral whose end-result would be that the people using the public services, the neediest in this case, would have no access to health-care services anymore. I subscribe to the first part (the public services would degrade over time), but not the second (the down-ward spiral) because there are ways to stop this exodus.<br />
For the health-care as a public service camp the smallest chink in the public access armor would essentially rip it open to the onslaught of private health-care.</p>
<p>The fact is that what both camps are focusing on is the way health-care services are distributed to people and not on the imbalances between the supply and demand of such services. Anyone with a pair of eyes would see that the demand of these services greatly exceeds the supply: long waiting times in emergency rooms, people parked in the hospital corridors for days, etc&#8230; And here things start to get interesting&#8230;<br />
Let&#8217;s suppose that you decide to privatize health-care completely and let the market decide who is paying for health-care that it consumes. A good or a service that has the supply and demand imbalances that health-care has would see its price get big pretty fast. Big prices mean also big profits, and there is no surprise here that the pro-business lobby is pushing towards  privatization because they stand to gain quite a lot from it.<br />
Now let&#8217;s suppose that you decide to keep the status-quo and allow health-care to be delivered only thru government agencies. The result would be that everyone would get the same pathetic service or no service at all, and this is exactly what we are getting right now: everybody gets to wait 5 hours in an emergency room regardless of how wealthy he or she is.</p>
<p>Both the pro-business group and the social-democrats are arguing over the means to distribute this very small supply of health-care services to a population that has a high demand for it. Leaving health-care to the market would ensure that only the wealthy would be have full access to it, leaving it the way it is would ensure that we are all getting the same service. It is essentially an argument over the way to distribute this scarce resource and over the winners and losers that come out of each particular distribution mechanism. Each camp is trying to prove that its distribution mechanism will also allow for the supply to grow faster, but I am pretty skeptical about it (<a href="http://microintellia.com/blog/wp-admin/post.php#">*</a>). So I would argue that we should look at the root of the problem and try to stimulate the supply of health care professionals and to enlarge the med schools quotas to reflect the current demand for such services.</p>
<p>Except that we have a bit of a problem (<a href="http://microintellia.com/blog/wp-admin/post.php#">**</a>) if we simply try to : we are leaving next to the US which is more than happy to let the whole health-care field to market forces. As explained above the result is that in US (which experiences pretty much the same imbalances between supply and demand) the price for health-care is very, very high along with profits and salaries among other things. If we increase the supply in Quebec we run the risk of seeing health-care professionals leave for the US in search of better salaries and reduced work-loads (<a href="http://microintellia.com/blog/wp-admin/post.php#">***</a>), an exodus similar to the possible exodus from public health-care agencies to private health-care companies.</p>
<p>So we have a problem. This pretty much is known. What solutions to this problem? Frankly, I don&#8217;t know. I think that we need to increase the number of health-care professionals running the risk of seeing some of them leave for US. In US things could be changing if the democrats get the White House (some health-care would be administered thru government agencies driving down prices and salaries) and this could dampen the incentives for leaving to US.<br />
Hopefully we will manage to get out of the grid-lock that we find ourselves in&#8230;</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">*</a> The pro-market argument for growing the supply to align itself with the demand is the following: a good which experiences high demand but a low supply sees its prices rise along with the profits. Entrepreneurs will realize that it is profitable to join this market because of the high profits and will start selling more of this very profitable good. This would in turn will raise the supply to match the demand for it and inevitably bring down the prices.<br />
I don&#8217;t buy this argument because in health-care the supply is pretty inelastic to demand since it takes a very long time to &#8220;produce&#8221; a doctor, about 15-20 years. In order to have the supply align itself with the demand you would have to carry out extensive demographic studies from which to determine the future demand for health-care services and tweak the med schools admission rates for the future demand. The fact that supply is inelastic to demand in health-care make say that the only thing that a market-based health-care system will achieve in Quebec is to redistribute resources and not to redistribute resources plus create new ones.<br />
There are probably some services within the health-care industry in which the supply is more elastic to demand and it would be a good idea to leave them to the market.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">**</a> It is a problem or an opportunity depending on how you look at it: high prices in US could drive the government of Quebec to sell some health-care services to US and use the money which these services would generate for funding other health-care services.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">***</a>  The fact that we have the US in vicinity renders a lot of the comparisons  between Quebec and France moot: a French doctor doesn&#8217;t have the option of packing up his or her belongings in a minivan and drive 300 kms to his or her new workplace in US. This puts a downward pressure on health professionals salaries in France thus reducing the health-care costs.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">P.S.</a> I am seriously thinking about starting to write this journal in French, but I don&#8217;t have much experience in writing in French and I think the first posts would be absolutely ludicrous (I will be probably missing all the accents ;-)). I&#8217;ll see what I&#8217;ll do.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">P.S.S.</a> I like economics and I wrote this post mainly for applying my knowledge of economics to what I know about health-care in Quebec. I have not researched deeply how health-care is being regulated and implemented in Quebec, I just wanted to try out some concepts. Hope I got them right&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/03/27/what-future-for-health-care-in-quebec/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What is missing in OS testing tools</title>
		<link>http://microintellia.com/blog/2008/03/17/testings-new-frontier/</link>
		<comments>http://microintellia.com/blog/2008/03/17/testings-new-frontier/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 17:22:38 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[AOP]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/03/17/testings-new-frontier/</guid>
		<description><![CDATA[I was watching this infoQ presentation by Alexandru Popescu and Cedric Beust on testing when I realized that a big market for testing is seriously neglected.
Regarding my use of testing I would say that JUnit pretty much fills my bill and I don&#8217;t see a need to move to TestNG. I was watching the presentation [...]]]></description>
			<content:encoded><![CDATA[<p>I was watching this infoQ <a href="http://www.infoq.com/presentations/beust-popescu-designing-for-testability">presentation </a>by Alexandru Popescu and Cedric Beust on testing when I realized that a big market for testing is seriously neglected.</p>
<p>Regarding my use of testing I would say that JUnit pretty much fills my bill and I don&#8217;t see a need to move to TestNG. I was watching the presentation not so much as to know more about TestNG, but to get some exposure to the market for testing products (<a href="#">*</a>). So the features which were presented and which were said to be in a high demand from the users were the ability to define test groups, to test data connectivity and to define dependencies between tests (<a href="#">**</a>). Pretty fair, I would take this functionality to be a logical progression from the ability to run a bunch of tests at random as JUnit lets you do it, you are basically starting to look at the tests you run from a higher level and you start looking for ways to aggregate these tests into higher-level constructs, such as test groups, which can then be manipulated according to various needs.<br />
So far I would say that Test NG is looking at ways to manage the complexity coming out of a high number of tests. Test NG is for test-heavy shops, where testing is considered a concern on par or close to development. Not a bad thing and I pretty sure that TestNG covers some functionality which is in high demand by Java developers.</p>
<p>There is, however, one need for testing that so far it is largely unsatisfied and sorely missed: the need to test workflows or series of events. Let&#8217;s say that you have an application that is a series of MDBs, each accepting messages, transforming them and then outputting them to the next MDBs. You would want to be able to test this application end-to-end.<br />
Let&#8217;s say that you have an application that receives market trades, needs to process them and then transform them in order to send them downstream to tax systems, settlement systems, etc&#8230; You would want to put thru a trade, set-up in a certain way and then trace its execution thru these flows and determine if, in what stage and in what shape has this trade reached the Application-to-Tax-System gateway.<br />
When I think about work-flow testing I usually think about defining a message, inputting this message into a work-flow engine and then defining interceptors to see how the original message has been manipulated at various stages. You may need to test both the work-flow itself (to see if the message has been going thru the work-flow that it needed to go thru), the end-result (to see where the message has been forwarded to and in what shape) as well as how it behaves at various stages in this workflow (if needed). I see work-flow testing primarily concerned with interception of messages (and this would probably be a great use of AOP) and with the possibility to correlate messages passing thru this work-flow with the original message.</p>
<p>OS testing tools so far are limited to synchronous testing. I wonder at what point will the need for work-flow testing become so pressing and the demand for it so great so that one OS shop will start doing something about implementing a testing framework for testing workflows. Then we could use Event-Driven-Testing for testing an application written in a Event-Driven-Architecture manner&#8230;</p>
<p><a href="#">*</a> I know that trying to form an opinion on a market such as the market for OS testing tools from a vendor presentation is a pretty risky business, what you get from vendor presentations is usually distorted because of bias and time constraints but I will assume that this presentation gave a fair image of what users want from testing tools.<a href="#"></a></p>
<p><a href="#">**</a> From what I know TestNG is a lot more than some annotations that give you the possibility to form test-groups and test dependencies. However, I would say that these issues are probably considered more important and more aligned with the market for OS testing tools since they were the ones which were included in this presentation.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">P.S.</a> If I were to choose one enterprise concern which is not addressed by the Spring stack I would choose work-flow. Spring has modules for integration, batch, transaction management, security management, connectivity to various end-points, etc&#8230;, it is missing this capability. From what I see work-flows are used pretty heavily in the enterprise space and for now I think they are mostly implemented either by in-house solutions or by commercial solutions. OS could probably make a contribution in this space as well. And if it does it should probably try to give the developer the ability to test work-flows, or at least make it easy for him/her.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">P.P.S.</a> The comments by Alan Keefer on this <a href="http://www.artima.com/forums/flat.jsp?forum=276&amp;thread=226320">thread</a> reinforce my beliefs that we need to carry out tests at every level, from high-level to unit test. For a work-flow based system this would mean that we need to test the work-flows themselves and not only the units making them up.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">Later edit:</a>  There are actually a few OS workflow tools. <a href="http://www.opensymphony.com/osworkflow/" target="_blank">OSWorkflow</a>, the ones at the <a href="http://www.theserverside.com/tt/articles/article.tss?l=Workflow" target="_blank">bottom</a> of this article and probably a few others. I should try them at one point.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/03/17/testings-new-frontier/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pros and cons of standards</title>
		<link>http://microintellia.com/blog/2008/03/12/pros-and-cons-of-standards/</link>
		<comments>http://microintellia.com/blog/2008/03/12/pros-and-cons-of-standards/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 01:54:01 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/03/12/pros-and-cons-of-standards/</guid>
		<description><![CDATA[I was reading Bill Burke`s post on transaction compensation via REST and JBPM and I have to tell that I agree with most of his remarks. Bill makes a very interesting point about compensating a transaction: that the compensation itself is an activity of a business process (the activity of handling failure, very likely outside of the system involved) and [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading Bill Burke`s <a target="_blank" href="http://bill.burkecentral.com/2007/09/18/distributed-compensation-with-rest-and-jbpm/">post</a> on transaction compensation via REST and JBPM and I have to tell that I agree with most of his remarks. Bill makes a very interesting point about compensating a transaction: that the compensation itself is an activity of a business process (the activity of handling failure, very likely outside of the system involved) and that this activity could be implemented as a regular activity in a business process using jBPM. It could also be exposed to the outside world thru a REST service.</p>
<p>This is a very interesting take on compensations and his proposition (that compensations are regular business activities that are part of a business process and that could be coded as such) gives a lot of flexibility to handling compensations. However, is exactly this flexibility that will probably force someone away from the compensation scheme devised by Bill and back to WS-BA. As <a target="_blank" href="http://markclittle.blogspot.com/2007/09/some-comments-around-rest-and.html">Mark pointed out</a> you still need to enforce end-points to run the same version of the communication protocol, be it WS-BA or an ad-hoc REST-based protocol.<br />
However, I would go further and say that the flexibility devised by Bill runs counter to market acceptance. Standards are straight jackets which people choose to wear when it makes sense, typically when it makes some process (such as interacting with a different system) more efficient. Coding a business activity in WS-BA would enable you to plug it effortlessly different systems implementing the WS-BA standard, in theory at least. You would expose your application to the outside world effortlessly and you could interact with a greater number of systems because you have chosen to trim down your application to fit into the WS-BA straight-jacket.</p>
<p>On the other side, if your application cannot be forced into the WS-BA standard probably it would make sense to drop this standard and expose the compensation logic as you and your partners agree. It would not be the first time that a standard gets ditched for a proprietary solution particular to a few partners and certainly not the last time. Sometimes a straight jacket is just too stifling&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/03/12/pros-and-cons-of-standards/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Determination</title>
		<link>http://microintellia.com/blog/2008/03/05/determination/</link>
		<comments>http://microintellia.com/blog/2008/03/05/determination/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 13:44:00 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/03/05/determination/</guid>
		<description><![CDATA[Today the weather in Montreal has been particularly brutal, we got 15 centimeters of snow at the temperature of -11 Celsius. Actually, it was not snow, it was some sort of ice pellets, around 1 millimeter in size that gathered on the roads. Anyone in Montreal would not describe this as brutal, but rather as [...]]]></description>
			<content:encoded><![CDATA[<p>Today the weather in Montreal has been particularly brutal, we got 15 centimeters of snow at the temperature of -11 Celsius. Actually, it was not snow, it was some sort of ice pellets, around 1 millimeter in size that gathered on the roads. Anyone in Montreal would not describe this as brutal, but rather as normal. What made the normal brutal were the winds of 70 km/h that were throwing these ice pellets into your face like one horrible vacuum cleaner running in reverse.</p>
<p>I was making my way along the streets of downtown Montreal cursing the weather like everyone around me when I see this guy waiting at a red light. He&#8217;s dressed in a suit and a tie, in sharp contrast to the sea of parkas around, with his face and knuckles bluish red from the cold. The shoes, not winter boots,  are ankle-deep in the chipped ice that is decorating our streets right now. He is fixating the red light waiting for a chance to keep going, who knows where, while fighting the wind that is trying to unbutton his suit. I kept wondering how did this guy got parachuted into this environment and where the hell he left his winter-coat. I also wondered at how this guy was determined to keep going, oblivious to the horrific conditions around him.</p>
<p>A fine picture of determination&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/03/05/determination/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some of today&#8217;s development problems</title>
		<link>http://microintellia.com/blog/2008/02/27/some-of-todays-development-problems/</link>
		<comments>http://microintellia.com/blog/2008/02/27/some-of-todays-development-problems/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 22:53:53 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/02/27/some-of-todays-development-problems/</guid>
		<description><![CDATA[I was reading this post about how architects should approach a project considering their team as a stake-holder, which is probably a bit misguided. I would not say that the team is a stake-holder because stake-holders are usually financially invested into the project and this investment drives attitudes around the project. The team is involved [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a href="http://fragmental.tw/2008/01/16/architecture-is-about-people/" target="_blank">post</a> about how architects should approach a project considering their team as a stake-holder, which is probably a bit misguided. I would not say that the team is a stake-holder because stake-holders are usually financially invested into the project and this investment drives attitudes around the project. The team is involved in the project, but its involvement is very different from the stakeholders.</p>
<p>However, the article shone light on the fact that you cannot ignore the team when embarking on a new project and tried to explore 2 different problems: the effects of team distribution and of the team skills on the architecture of the project.</p>
<p>Let&#8217;s start with the team skills: the article argues that when you embark on a new project you should center its architecture around the strengths of the team. Well, this is so obvious (you need to utilize the most of your team) that it doesn&#8217;t need to be re-stated. The problem that he posed is a bit unusual: the architect thinks that Ruby should be used for a project, however the team only groks Java. He goes on to say that the architect should probably use Java and try to evangelize Ruby in order for the team to learn Ruby. Well, the team will probably know some Ruby 6 to 12 months into the evangelization process, at which time a lot of development has been done in Java meaning that it is too late to contemplate using Ruby on this project. Maybe next time&#8230;</p>
<p>The other subject of the post was how team distribution affects architecture and the author of the post shows  a bad way of architecting an application without any regard to the team distribution and composition. I would say that he is right about it, when working in distributed team it is essential to be able to implement a certain amount of autonomy within the teams so that each team can make decisions on its own and not get grid-locked on dependencies from other teams. However, setting up autonomous teams is mostly a managerial issue and not a &#8220;pure&#8221; architectural issue, as you can see the borders between architecture and management start to blur in certain cases.</p>
<p>It is a pretty interesting article which outlines some recent developments in today&#8217;s IT environment: polyglot development and distributed teams.  These issues are managerial issues (maximizing resource utilization) which are cloaked in architectural clothes (if I can use this expression ;-)).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/02/27/some-of-todays-development-problems/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DTOs are not rich beans</title>
		<link>http://microintellia.com/blog/2008/02/22/dtos-are-not-rich-beans/</link>
		<comments>http://microintellia.com/blog/2008/02/22/dtos-are-not-rich-beans/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 03:16:31 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/02/22/dtos-are-not-rich-beans/</guid>
		<description><![CDATA[Of all the problems of Data Transfer Objects (DTOs) the one that stands out is the anemic domain problem: DTOs are basically objects with a few variables and getters/setters for them, lacking any complex behavior. This way of developing applications has been decried times and times again so I will not waste my time exposing [...]]]></description>
			<content:encoded><![CDATA[<p>Of all the problems of Data Transfer Objects (DTOs) the one that stands out is the anemic domain problem: DTOs are basically objects with a few variables and getters/setters for them, lacking any complex behavior. This way of developing applications has been decried times and times again so I will not waste my time exposing this problem.</p>
<p>However, I started realizing that maybe DTOs should not contain any complex behavior and that they should be as dumb as dirt, especially when being used for communication between multiple systems. Consider this example: we have a tax system which uses the object <strong>TaxInformation</strong> which various systems use for getting information about taxes. Let`s say that the commodity trades system, the equity trades system and the FX trades system are all using it. Let`s say that this object looks like this:</p>
<p><em>public class TaxInformation{</em></p>
<blockquote><p><em>private Trade trade;</em></p></blockquote>
<blockquote><p><em>private TaxReceipt taxReceipt;</em></p>
<p><em>public TaxInformation(Trade trade){</em></p>
<blockquote><p><em>this.trade = trade;</em></p>
<p><em>this.taxReceipt = new TaxReceipt();</em></p></blockquote>
<p><em>}</em></p>
<p><em>public TaxReceipt getTaxReceipt(){</em></p>
<blockquote><p><em>return taxReceipt;</em></p></blockquote>
<p><em>}</em></p></blockquote>
<p><em>}</em></p>
<p>As you can see a DTO dumber than dirt. Let`s create an endpoint creating and serving such an object:</p>
<p><em>public class TaxService{</em></p>
<blockquote><p><em>public TaxInformation getTaxInformation(Trade trade){</em></p></blockquote>
<blockquote>
<blockquote><p><em>TaxInformation taxInfo = new TaxInformation(trade);</em></p>
<p><em>return taxInfo;</em></p></blockquote>
</blockquote>
<blockquote><p><em>}</em></p></blockquote>
<p><em>}</em></p>
<p>All is fine, but a requirement comes in which says that if the trade is restricted then the tax receipt of the tax information object related to that trade should also be restricted. Here you are presented with a few choices:</p>
<p>1) Implement this requirement in the <strong>TaxInformation</strong> object probably in the constructor.</p>
<p>2) Implement this requirement in the <strong>TaxService</strong> object.</p>
<p><strike>3) Implement this requirement in the <strong>TaxReceipt</strong> object, in its constructor</strike>. For the sake of argument, let`s assume that we do not have this possibility, so I turned it off.</p>
<p>OOP purists will immediatelly recommend choice #1, because this would turn the DTO into a rich bean and would do away with the anemic DTO. This is a mistake, because all the systems using this object for communicating with the tax system will start having class versioning errors unless they are updated with this DTO`s new class. The problem is versioning such a DTO. Putting complex behavior in a DTO raises the risks of change in the DTO, which raises the effort of propagating this change in the systems which use this DTO for communication. At one point it makes sense to drop DTOs and use some sort of protocol for communication, preferrably a protocol which deals with change pretty easily (XML documents with schemas which always get extended and with constraints which get changed very rarely are a pretty good fit).</p>
<p>DTOs should probably be used in systems whose lifecycles are kept in synch (i.e. they get upgraded in synch), in such systems you can propagate type changes pretty easily because you have a certain amount of control over their lifecycles (<a href="http://microintellia.com/blog/wp-admin/post-new.php#">*</a>). Expanding on this, I would say that typed languages are probably most effective locally because type changes cannot be propagated over large distances efficiently. Type-coupling (or API coupling) is a very hard coupling and its should be avoided and replaced with protocols. DTOs do create an anemic model and should be avoided if possible, but if you choose types for communication between systems it would make sense to keep these DTOs to their most basic function of passing data around or to have procedures for propagating type changes in all the systems using types for communication.<br />
Sometimes weak DTOs are actually a good thing&#8230;</p>
<p><a href="http://microintellia.com/blog/wp-admin/post-new.php#">*</a> BTW, whether a set of systems whose lifecycles are kept in synch is actually one big system with one particular lifecycle is a pretty good question. I would say that you can think about it as a big system.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/02/22/dtos-are-not-rich-beans/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Voyage, voyage</title>
		<link>http://microintellia.com/blog/2008/02/06/voyage-voyage/</link>
		<comments>http://microintellia.com/blog/2008/02/06/voyage-voyage/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 22:34:13 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/02/06/voyage-voyage/</guid>
		<description><![CDATA[Au dessus des vieux volcans,
Glisse des ailes sous les tapis du vent,
Voyage, voyage,
Eternellement.
De nuages en marécages,
De vent d&#8217;Espagne en pluie d&#8217;équateur,
Voyage, voyage,
Vole dans les hauteurs
Au dessus des capitales,
Des idées fatales
Regardent l&#8217;océan&#8230;
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l&#8217;espace inouï de l&#8217;amour.
Voyage, voyage
Sur l&#8217;eau sacrée d&#8217;un fleuve indien, (voyage voyage)
Voyage (voyage)
Et [...]]]></description>
			<content:encoded><![CDATA[<p>Au dessus des vieux volcans,<br />
Glisse des ailes sous les tapis du vent,<br />
Voyage, voyage,<br />
Eternellement.<br />
De nuages en marécages,<br />
De vent d&#8217;Espagne en pluie d&#8217;équateur,<br />
Voyage, voyage,<br />
Vole dans les hauteurs<br />
Au dessus des capitales,<br />
Des idées fatales<br />
Regardent l&#8217;océan&#8230;</p>
<p>Voyage, voyage<br />
Plus loin que la nuit et le jour, (voyage voyage)<br />
Voyage (voyage)<br />
Dans l&#8217;espace inouï de l&#8217;amour.<br />
Voyage, voyage<br />
Sur l&#8217;eau sacrée d&#8217;un fleuve indien, (voyage voyage)<br />
Voyage (voyage)<br />
Et jamais ne revient.</p>
<p>Sur le Gange ou l&#8217;Amazone,<br />
Chez les blacks, chez les sikhs, chez les jaunes,<br />
Voyage, voyage<br />
Dans tout le royaume.<br />
Sur les dunes du Sahara,<br />
Des iles Fidji au Fujiyama,<br />
Voyage, voyage,<br />
Ne t&#8217;arrêtes pas.<br />
Au dessus des barbelés,<br />
Des coeurs bombardés<br />
Regardent l&#8217;océan.</p>
<p>Voyage, voyage<br />
Plus loin que la nuit et le jour, (voyage voyage)<br />
Voyage (voyage)<br />
Dans l&#8217;espace inouï de l&#8217;amour.<br />
Voyage, voyage<br />
Sur l&#8217;eau sacrée d&#8217;un fleuve indien, (voyage voyage)<br />
Voyage (voyage)<br />
Et jamais ne revient.</p>
<p>Au dessus des capitales,<br />
Des idées fatales<br />
Regardent l&#8217;océan.</p>
<p>Voyage, voyage<br />
Plus loin que la nuit et le jour, (voyage voyage)<br />
Voyage (voyage)<br />
Dans l&#8217;espace inouï de l&#8217;amour.<br />
Voyage, voyage<br />
Sur l&#8217;eau sacrée d&#8217;un fleuve indien, (voyage voyage)<br />
Voyage (voyage)<br />
Et jamais ne revient.</p>
<p><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/6PDmZnG8KsM&#038;rel=1"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/6PDmZnG8KsM&#038;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/02/06/voyage-voyage/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asynchronous processing and OOP</title>
		<link>http://microintellia.com/blog/2008/02/01/asynchronous-processing-and-oop/</link>
		<comments>http://microintellia.com/blog/2008/02/01/asynchronous-processing-and-oop/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 20:56:57 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/02/01/asynchronous-processing-and-oop/</guid>
		<description><![CDATA[I was reading this post on infoq about how good object-oriented programming mimicks a lot asynchronous processing. It is a pretty interesting post, even though it is not very organized, the author surfs around a few concepts, finds some interesting relationships between them and then ends the article.
The post looks for similarities between implementing some [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a href="http://www.infoq.com/news/2007/11/asynchronous-oop-and-fp">this post</a> on infoq about how good object-oriented programming mimicks a lot asynchronous processing. It is a pretty interesting post, even though it is not very organized, the author surfs around a few concepts, finds some interesting relationships between them and then ends the article.</p>
<p>The post looks for similarities between implementing some piece of functionality in an asynchronous manner and implementing the same piece of functionality with methods that do not return values. It pretty much finds these similarities, but there are some important differences which we will explore now.<br />
Let&#8217;s take a look at some code: suppose the you have this purchase order component which has the method placeOrder for placing an order:<br />
<em>public PurchaseOrderBean{</em></p>
<blockquote><p><em>public placeOrder(PurchaseOrder po) throws PurchaseOrderException{</em></p>
<blockquote><p><em>try{</em></p>
<blockquote><p><em>// update its status in the DB </em></p>
<p><em>changePurchaseOrderStatus(po);</em></p>
<p><em>// execute payment</em></p>
<p><em>paymentBean.performPayment(po);</em></p>
<p><em>// update the inventory</em></p>
<p><em>inventoryBean.updateInventory(po);</em></p>
<p><em>// integrate with the back office</em></p>
<p><em>backOfficeBean.notifyBackOffice(po);</em></p></blockquote>
<p><em>}catch(BackOfficeException ex){</em></p></blockquote>
<blockquote>
<blockquote><p><em>// handle BackOfficeException, possibly rolling-back the current transaction</em></p></blockquote>
</blockquote>
<blockquote><p><em>}catch(InventoryException ex){</em></p>
<blockquote><p><em>// handle InventoryException, possibly rolling-back the current transaction</em></p></blockquote>
<p><em>}catch(PaymentException ex){</em></p>
<blockquote><p><em>// handle PaymentException, possibly rolling-back the current transaction</em></p></blockquote>
<p><em>}</em></p></blockquote>
<p><em>}</em></p></blockquote>
<p><em>}<br />
</em><br />
As you can see in this case the method <em>placeOrder</em> simply tells the inventory bean, the payment bean and the back-office bean to do their work.</p>
<p>Now let&#8217;s implement the same method in an asynchronous manner using JMS and QueueSenders:<br />
<em>public PurchaseOrderBean{</em></p>
<blockquote><p><em>public placeOrder(PurchaseOrder po) throws PurchaseOrderException{</em></p>
<blockquote><p><em>try{</em></p>
<blockquote><p><em>// update its status in the DB </em></p>
<p><em>changePurchaseOrderStatus(po);</em></p>
<p><em>// execute payment</em></p>
<p><em>queueSenderToPaymentJMSQueue.send(formatMessage(po));</em></p>
<p><em>// update the inventory</em></p>
<p><em>queueSenderToInventoryJMSQueue.send(formatMessage(po));</em></p>
<p><em>// integrate with the back office</em></p>
<p><em>queueSenderToBackOfficeJMSQueue.send(formatMessage(po));</em></p></blockquote>
<p><em>}catch(JMS exception){</em></p></blockquote>
<blockquote>
<blockquote><p><em>// handle JMS Exception. Usually it means rolling-back the transaction and sending this exception up-stream.</em></p></blockquote>
</blockquote>
<blockquote><p><em>}</em></p></blockquote>
<p><em>}</em></p></blockquote>
<p><em>}<br />
</em></p>
<p>As you can see the biggest difference between the 2 implementations is exception handling. In both cases you are telling a component (in the first case a bean, in the second case a different system) to carry out its work but in the first case you get to deal with the exceptions. One big difference between asynchronous processing and synchronous processing that I see is that in the case of asynchronous processing you are delegating the whole implementation of a particular functionality including failures while in synchronous processing you can delegate dealing with failure to the method that orchestrates the interactions between these components.<br />
I consider this difference to be important when designing systems because it essentially splits tasks and responsabilities.<br />
The post was right on the money on the need to try to avoid methods returning values which need to be dealt with in the calling methods, because coding in such a way encourages to write components to which you can delegate a task better. Having to deal with methods that return values means basically that you need to interpret these values outside of this method and this means that not everything was delegated to the method. Sometimes you need to code this way though&#8230;</p>
<p>Now let&#8217;s dig a bit into the way exceptions are handled in this 2 pieces of code. Let&#8217;s suppose that the payment fails for this particular purchase order, the credit card is expired. In the first example all processing would basically stop at this step, we would roll-back the transaction and notify this error upstream.<br />
In the second example it is a bit more complicated, because the payment would fail in the payment system which would then have to notify the back-office, the inventory system that that particular purchase order has failed (probably the most efficient way to do this would be to publish a message about a failed payment on an ESB channel to which the other 2 systems are listening. Connecting the payment system directly to the systems it is related to is a tight-coupling and should be avoided. <a href="http://microintellia.com/blog/wp-admin/post.php#">*</a>).<br />
Exception handling is done differently in the 2 implementations: the first implementation it deals with the exception right at the source while the second implements exception handling by passing messages between the systems in the back-ground. The second implementation is also more prone to tight-coupling between systems.</p>
<p>One cost involved in the above implementations is the cost of exception handling . In synchronous processing exception handling is done upfront and it is usually not expensive since you are handling it at the source while in asynchronous processing exception handling usually ocurs behind the scenes with systems passing each other messages, you should pay attention to it when designing systems. If you could delegate the whole processing, including failure handling to a component it would probably make sense to use asynchronous processing. If you find that some failures imply multiple systems it would probably make sense to use synchronous processing.</p>
<p>Another cost involved in the above example is the cost of locking down resources: in the synchronous example this cost is pretty high: you need to start a transaction, start processing, lock down database rows, etc&#8230; and roll back that transaction in the event of failure while in the second example this cost is extremely low: you start a transactions, you send some messages and you commit the transactions.<br />
You essentially have these 2 costs and each implementation has a different cost: the asynchronous implementation has a high complexity cost (passing messages about exceptions behind the scenes) while the synchronous implementation has a high physical cost (the cost of locking down resources pending a transaction commit). These cost structure should be kept in mind when designing systems (<a href="http://microintellia.com/blog/wp-admin/post.php#">*</a><a href="http://microintellia.com/blog/wp-admin/post.php#">*</a>).</p>
<p>I would end this post saying that while most of the people seem to associate asynchronous processing with low-latency method calls, delayed execution and relaxed time constraints it is important to bear in mind that asynchronous processing should also be associated with the way you delegate a particular task to a particular system which is primarily a management issue. What I wanted to stress is that asynchronous messaging forces you to fully delegate processing (including exception handling) to a different component or system. It is this hand-off that I see as just as important as the other things that asynchronous is associated with: faster return from the call because you are simply passing a message rather than waiting for its execution,etc&#8230;.</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">*</a> One caveat though. It is a good thing to try to keep the number of the message types that are sent thru an ESB under control, otherwise you will end-up with a Spaghetti Oriented Architecture ;-).</p>
<p><a href="http://microintellia.com/blog/wp-admin/post.php#">**</a> The present push away from ACID transactions towards systems passing messages between each other would imply that the physical cost is larger than the complexity cost. At the same time ESBs are becoming more and more popular in order to keep the cost of the relationships between various systems low.<br />
Transactions can be viewed as a way to enforce state synchronization between multiple actors: these actors try to carry out a series of actions at the same time and if one of them fails they should all go back to original state. ACID transactions are enforcing state synchronization at the time the actions are carried out, however in some cases you can carry out this state synchronization later.<br />
Please check these links for some unusual transaction mechanisms. Some of them (especially XTP) will very likely become de-facto standards:<br />
<a href="http://www.infoq.com/news/2007/07/ws-tx-and-autonomy" target="_blank">Are Cross-Service Transactions A Violation of the Autonomous Tenet of Service Orientation?</a><br />
<a href="http://natishalom.typepad.com/nati_shaloms_blog/2007/08/xtreme-transact.html" target="_blank">Xtreme Transaction Processing under SBA terminology</a><br />
<a href="http://markclittle.blogspot.com/2007/12/large-scale-distributed-transactions.html" target="_blank">Large-scale distributed transactions</a><br />
<a href="http://www.devwebsphere.com/devwebsphere/2008/01/constrained-tre.html" target="_blank">Constrained Tree Schemas (CTS) and applications (CTA) for extreme OLTP (XTP)</a></p>
<p><a href="http://www.devwebsphere.com/devwebsphere/2008/01/constrained-tre.html" target="_blank"></a>Note: This post was written while listening to Mylène Farmer <a href="http://www.youtube.com/watch?v=wpG13rQU_e4" target="_blank">live at Bercy 2006</a>.</p>
<p>P.S. This post is also quite all over the place: exception handling in async interactions vs. synchronous processing, transactions, etc&#8230; I guess Mylène Farmer can be quite distracting ;-).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/02/01/asynchronous-processing-and-oop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Amazon&#8217;s EC2</title>
		<link>http://microintellia.com/blog/2008/01/28/amazons-ec2/</link>
		<comments>http://microintellia.com/blog/2008/01/28/amazons-ec2/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 21:13:32 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/28/amazons-ec2/</guid>
		<description><![CDATA[It is really interesting what is happening right now in the grid or cloud computing field: the biggest player in this field is Amazon.com, a retailer. You would have expected grid computing or cloud computing to be championed by a tech company, I personally would have thought that Sun would be pretty active in this [...]]]></description>
			<content:encoded><![CDATA[<p>It is really interesting what is <a href="http://www.infoq.com/news/2008/01/ec2-jee-groovy" target="_blank">happening right now</a> in the grid or cloud computing field: the biggest player in this field is Amazon.com, a retailer. You would have expected grid computing or cloud computing to be championed by a tech company, I personally would have thought that Sun would be pretty active in this field, at the time I believed this 3-year old <a href="http://www.theregister.co.uk/2005/10/25/sun_grid_slip/" target="_blank">announcement</a> to be more a bit more than hot-air.</p>
<p>You could speculate that Google is not lifting the curtain on parts of its infrastructure for fear that it would undermine one of its competitive advantage: the ability so scale out almost effortlessly. You could speculate that the large traffic sites which use grids for strategic reasons will be reluctant to open up their architectures to the outside world to the degree that Amazon has done and to a certain extent I see their absence from this space as a the cost of keeping inner workings of your organization away from your competitors eyes. Amazon probably has gone thru the same stage where its proprietary architecture was one important differentiator between itself and its competitors, but it looks like it has gone beyond it, it has grown beyond . Probably as Google, eBay, Yahoo, Microsoft will mature they will also start opening parts of their infrastructure which are not creating a difference between their services.</p>
<p>But I still don&#8217;t understand why Sun&#8217;s is silent in this space. Part of its strategy to move towards open source would have been to move towards services at the same time (since your code doesn&#8217;t pay you need to make money from running services on this code). Support is one type of service, but I see grid computing as one service which is far more profitable to Sun.<br />
Cloud computing comes with a pretty high entry barrier: you need know-how, operation teams, investments in hardware, etc&#8230; in order to run the large data-centers that are hosting this service. Sun could have tried to do that and in the article at the beginning of the post they seemed pretty determined to open up such an environment. Judging by the size of their investment in MySql you could say that Sun it committed to software. I don&#8217;t see hardware playing a big role in the future, but rather infrastructure. Once you solve the problems of scaling out the need for big iron boxes diminishes, however the infrastructure starts to matter a lot. The only thing that Sun seems to do is to sell various grid-solutions but not to host grids, I think they are missing out on a big piece of what will be demanded in the future IT landscape.</p>
<p>So how do I see Amazon&#8217;s grids doing in the future? I see them doing pretty well, for now the market for <em>grid computing on a credit card</em> (to quote Cameron Purdy) has only one seller, that is Amazon. Amazon will bank on the integration between small companies and its grid capabilities, integration which translates in in the number of VM images stored on EC2, on the different configurations that different hosts are using, etc&#8230; This integration is essentially an infrastructure lock-in and once Amazon has acquired these customers it is a safe bet that they will not migrate to its competitors (which are yet to appear) easily.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> I was thinking about using Amazon`s EC2 to host Facebook applications which start having operational problems because of becoming immensely popular (as illustrated on this <a href="http://blog.pmarca.com/2007/06/analyzing_the_f.html" target="_blank">post</a> on Marc Andressen`s blog). It would probably make sense, but I didn`t dwell too much on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/28/amazons-ec2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hiring</title>
		<link>http://microintellia.com/blog/2008/01/23/hiring/</link>
		<comments>http://microintellia.com/blog/2008/01/23/hiring/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 16:08:18 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/23/hiring/</guid>
		<description><![CDATA[I was reading the Prefer Design Skills post on Martin Fowler&#8217;s bliki and I agree with most of its conclusions. He&#8217;s spot on on the need to prefer someone with design skills vs. someone with skills about a particular language.
Design skills carry a lower risk of becoming obsolete than the knowledge of a programming language, [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading the <a target="_blank" href="http://martinfowler.com/bliki/PreferDesignSkills.html">Prefer Design Skills</a> post on Martin Fowler&#8217;s bliki and I agree with most of its conclusions. He&#8217;s spot on on the need to prefer someone with design skills vs. someone with skills about a particular language.<br />
Design skills carry a lower risk of becoming obsolete than the knowledge of a programming language, programming languages come and go, good design usually stays. So it would follow that when you bring design skills in house you bring in skills which depreciate slowly and this is beneficial.</p>
<p>Design skills are largely the outcome of some soft skills (good communication with the customer, easy understanding of a domain, maybe knowledge of a few domains, etc&#8230;) that are much needed by any developer. When you bring design skills in-house you also bring those soft skills in. These soft skills will translate in a more frictionless environment, better communication with the client, faster ramp-up on new projects for which the person with design skills has domain knowledge, etc&#8230;</p>
<p>Hiring a person can be viewed as an investment: you are investing the salary for the probation period, the relationships that this person will make (these relationships may included relationships with your customer).</p>
<p>Hiring a person comes with opportunity costs: you will probably have to refuse the same position to some other one.The opportunity costs of a hire are the skills of the person(s) which has/have been refused the position and the contribution that the refuse would make in the future, it is important to keep these costs down as well.</p>
<p>The opportunity costs of choosing a person with design skills vs one with language skills is largely the time it takes the design-skills person (I am getting tired of typing this denominator) to learn the language. I would trade this opportunity cost vs. the opportunity cost of hiring someone with no design skills because I feel so (sorry, I don&#8217;t have time to go into details).</p>
<p>Reading the above you will see a huge bias towards design skills vs. language skills in this post to the point of where you are probably wondering when should you hire a person with strong language skills (or who knows, maybe if you should hire such persons at all).<br />
Staying in the same controlled thought-experiment environment I would add that positive bias towards a particular set of people tends to rise those people&#8217;s salaries, they become more expensive as the demand for them increases faster than their supply. It would follow that at one point the premium associated with design skills would become so large as to dwarf the benefits from employing people with design skills. At that point it would become economically sensible to hire language-skills people.<br />
Another point would be that you could lower the opportunity cost of refusing a person with design skills by hiring a person with language skills which is motivated to sharpen his/her design skills. If you come across such a person the opportunity cost of hiring his/her would be the contribution made by the person with design skills while the person with language skills is still in the ramp-up period of sharpening his/her design skills. I would say that this opportunity cost would be more than offset by the relationship that you will develop with the person with strong language skills while mentoring, tutoring his/her.</p>
<p>And this is the last time you will read design skills in this post, I feel like I said it 500 times ;-).</p>
<p>P.S. I guess it shows that I love economics ;-).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/23/hiring/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Testing&#8230;</title>
		<link>http://microintellia.com/blog/2008/01/22/testing/</link>
		<comments>http://microintellia.com/blog/2008/01/22/testing/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 21:57:53 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/22/testing/</guid>
		<description><![CDATA[I am testing a few things with my RSS feed, it will change the way it exposes the contents of this blog.
I hope it will not create much of a disruption.
]]></description>
			<content:encoded><![CDATA[<p>I am testing a few things with my RSS feed, it will change the way it exposes the contents of this blog.</p>
<p>I hope it will not create much of a disruption.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/22/testing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Communication problems in dynamic languages</title>
		<link>http://microintellia.com/blog/2008/01/21/communication-problems-in-dynamic-languages/</link>
		<comments>http://microintellia.com/blog/2008/01/21/communication-problems-in-dynamic-languages/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 21:36:25 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/21/communication-problems-in-dynamic-languages/</guid>
		<description><![CDATA[I was reading this post on manageability.org which is hi-liting some of the problems with large projects in dynamic languages. I am not familiar with these problems, never having to code in a dynamic language on a large-scale project, but I am currently working on a large scale project in Java with many distributed teams [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://www.manageability.org/blog/stuff/chandler-failure">this</a> post on manageability.org which is hi-liting some of the problems with large projects in dynamic languages. I am not familiar with these problems, never having to code in a dynamic language on a large-scale project, but I am currently working on a large scale project in Java with many distributed teams and in such an environment it is crucial that the code created by different teams is put together fast and reliably. Putting the code from various sources together fast is necessary for efficient collaboration between teams.</p>
<p>Probably the number one problem of distributed teams working on the same project is to make sure that the code doesn&#8217;t contain  references to methods which don&#8217;t exist or which have changed. Statically-typed languages solve this problem by their own definition at compile time. Dynamically-typed languages probably have some solutions to this problem (I heard some people documenting the Ruby code that they write), but the biggest drawback of them is that this type of solutions are human-powered and not automated, an automated solution would be something similar to a compiler inspecting your code for invalid method calls. I would say that the solving code-conflicts that arise in distributed teams are more expensive in dynamic languages than in static languages, therefore when choosing a dynamic language you should probably stay away from coding in a distributed development environment (<a href="http://microintellia.com/blog/#">*</a>).</p>
<p>One problem that I see with Ruby and all those elegant languages is that they are not very expressive to a large audience. They encourage brevity, but I find that they encourage it at the expense of readability and this narrows their audience (this is why I find it unlikely that Ruby will break out of a small elite). A developer working on an application needs to understand pretty fast what a particular method does rather than marvel at the &#8220;beauty&#8221; of that particular piece of code. I find that the information stored in Ruby code is harder to extract than the same information stored in Java code. It is &#8220;beautiful&#8221; (<a href="http://microintellia.com/blog/#">**</a>), but also inefficient and it is more expensive to work with it.</p>
<p>I would say that the biggest challenge using dynamic languages revolves around collaboration and communication. Statically-typed languages put a smaller cost on communicating thru code, dynamic languages can achieve the same thru some external mechanism. While dynamic languages have more features, this freedom comes at the expense of collaboration. Evidence would seem to make this supposition true, most development in dynamic languages happens in small teams concentrated locally where the needs for communication are small.</p>
<p><a href="http://microintellia.com/blog/#">*</a> All the above being said I remember Martin Fowler talking about agile projects coded by distributed teams which did very well. He didn&#8217;t mention what language these teams are using, but given the fact that ThoughtWorks seems to favor Ruby I would assume that these distributed teams were using Ruby as well. It would be interesting to see the steps taken by them in order to be able to handle these communication problems.</p>
<p><a href="http://microintellia.com/blog/#">**</a> I personally find it brain-dead to talk about the &#8220;beauty&#8221; of code because this is not the purpose for which code is written. A statue should be beautiful because this is its purpose, to be enjoyed by who watches it, a piece of code&#8217;s purpose is to work as it is supposed to.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> The communication and collaboration costs of dynamic languages will define the population of developers that use them and their usage within that population. I would not be too surprised is most of Ruby and Groovy usage will be restricted to small scripts which do not require a lot of collaboration while a small niche of very productive teams will be able to use them on a large scale.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/21/communication-problems-in-dynamic-languages/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java now and in the future</title>
		<link>http://microintellia.com/blog/2008/01/17/java-now-and-in-the-future/</link>
		<comments>http://microintellia.com/blog/2008/01/17/java-now-and-in-the-future/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 19:47:14 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/17/java-now-and-in-the-future/</guid>
		<description><![CDATA[If you are to read most of what is published today about the Java platform it seems that the future of Java doesn&#8217;t look pretty good at the moment as it keeps losing battle after battle with the movement behind dynamic languages such as Ruby and PHP. At the same time improvements to the language [...]]]></description>
			<content:encoded><![CDATA[<p>If you are to read most of what is published today about the Java platform it seems that the future of Java doesn&#8217;t look pretty good at the moment as it keeps losing battle after battle with the movement behind dynamic languages such as Ruby and PHP. At the same time improvements to the language which could give it some boost seem to be badly implemented, most people beeing unhappy with the implementation of generics and the proposed closure enhancement looking pretty horrific.</p>
<p>You have to wonder what will happen to Java in the future. Will it disappear and turn into a dinosaur that could not adapt to a changing IT environment or it will manage to survive the problems that it has at the time? One good look at the Java language would have to consider both the language itself and the libraries/frameworks built under it, the contributors to the language, both contributors to the language features and to its libraries/frameworks, etc&#8230; as well as the users of the language and its libraries, i.e. the developers that create Java applications.</p>
<p><strong>The different types of contributors to the Java language.</strong> I would start by looking at the contributors and I would split them in 2 camps: corporate contributors and non-corporate contributors (<a href="http://microintellia.com/blog/#">*</a>). Looking at the chief contributions these 2 types of contributors make to the Java platform I would say that the corporate contributors are mostly active contributing libraries and frameworks and that the non corporate contributors are contributing Java language variants such as Groovy and Scala (<a href="http://microintellia.com/blog/#">**</a>). The split between contributors seems to mirror the split between the language itself and the libraries/frameworks being built under it, this is an important point.</p>
<p>It is important to look at the motivations of each contributor type for contributing to the Java platform: the corporate entities are mostly contributing libraries and frameworks that target specific problems with a wide audience while the non-corporate entities typically target problems with small audiences, such as languages. The size of the entities involved in a particular task is usually a good indicator of its audience and of the need for coordination (the bigger the number of entities, the bigger the need for coordination).<br />
Corporate entities are more effective in projects where a certain amount of discipline and coordination is required (such as when defining the WS-* specs), while non-corporate entities are more effective in projects which do not require a large amount of coordination. The need for coordination between corporate entities is primarily driven by the number of these entities and the fact that these entities have different, sometimes competing, interests to which a common denominator has to be found.<br />
Opposite to the need of coordination you would find most entities that created the languages currently running on the Java platform: These languages are initiated by individuals and are maintained by a single team that is usually pretty small.</p>
<p>One important thing about the contribution of corporate entities to the Java language in terms of libraries/frameworks is that these corporate entities need these huge investments in libraries/frameworks to be relevant in the future. Backward compatibility is very much needed for them in order to provide the stability required for continuing to make these contributions, this is very important to consider when thinking about truncating Java (see small section below) and when making language changes.</p>
<p><strong>The mushrooming of JVM languages</strong> (<a href="http://microintellia.com/blog/#">***</a>). You would expect that once the JRE got modified to allow easier access to different languages on the Java platform that the number of Java variants will grow very large, to the point of becoming unmanageable. This has not happened so far and if I were to identify the reasons for this I would first say that 1) there is an entry barrier for creating a language, you need to design it well and 2) the need to keep relevant investments made when committing to a particular language. The small number of languages used on the Java platform, in sharp contrast to the number of Lisp variants, is due to the fact that when a entity adopts a such a language it will make a commitment to use it in order to keep development costs down (you don&#8217;t want your web development shop to work 10 different languages, each needing a guru). The need to keep development costs down, which doesn&#8217;t exist in Lisp&#8217;s world because Lisp is used by academia rather than by everyday coders, put a ceiling over the number of languages running on the Java platform. I would expect this pressure on the number of languages running on the Java platform to exist in the future, new JVM languages will start being used only if they truly offer gains(<a href="http://microintellia.com/blog/#">****</a>).</p>
<p><strong>Open sourcing Java</strong>. Just like the mushrooming of Java languages the mushrooming of Java-like languages which branch out of the main Java language maintained by Sun didn&#8217;t happen (looking at the hundreds of Linux variants you would have thought that it should happen). I think that this is due to the exactly same thing that prevented the mushrooming of JVM languages - the commitment that using a language entails.</p>
<p><strong>Truncating Java.</strong> The JRE got too big and even with today&#8217;s networks it is still a pain to download and install it. Split it up in OSGi bundles and spin them off the runtime (with Java AWT and Swing being the first victims). Keep in the runtime only what is absolutely necessary for the current enterprise libraries to work well (the collections library, threads, etc&#8230;).</p>
<p><strong>Competition from Ruby.</strong> Ruby appears as a serious contender to Java, supposedly gaining market stare and mind-share. I don&#8217;t think that this will last long primarily because Ruby will not have resources for re-creating the current Java libraries. I also think that re-creating Java&#8217;s libraries in a different language is a waste of time. My opinion is that it is beneficial to learn Ruby in order to use JRuby and tap into the vast libraries currently available on the Java platform.</p>
<p><strong>My opinion on Java&#8217;s present and future.</strong> I think that the current split in contribution to the Java platform (corporate contributors generating libraries, frameworks, products, etc&#8230; and the non-corporate contributors creating languages) is correct. Let each camp go forward in its own way, the corporate entities will continue to produce the specs, libraries and frameworks that we all use and that we all need to be relevant in the future while the non-corporate entities will work on creating new languages from which to call those libraries. There will not be a mushrooming of languages because the costs associated with using a language will keep the number of languages down. There will be some healthy competition from various languages that attain buzzword-status, but it will not last for long.<br />
This would conclude my post. I admit that its subject (Java&#8217;s present and future) is very broad and covering it in one blog post is very hard but I have these opinions that I want to share with the world.</p>
<p><a href="http://microintellia.com/blog/#">*</a> By non-corporate entities I mean most small cohesive groups that grow around Java such as the groups maintaining Groovy, Scala, etc&#8230; By corporate entities I mean both large corporations involved in various specs (such as IBM, BEA, Oracle, etc&#8230;) and small corporations such as Spring Source or Red Hat. Also, the contribution of a corporate entity to the Java platform is not restricted to the contribution that entity makes in the open-source space, but it means all the code that entity has created in the Java platform, closed source as well. I know this definition borders somewhat on using the language rather than contributing to it, but I will keep it this way.</p>
<p><a href="http://microintellia.com/blog/#">**</a> I know that Java languages are also contributed by corporate entities with JRuby being contributed by Sun being one such example (Sun actually brought JRuby under its umbrella, JRuby being started by a non-corporate entity).</p>
<p><a href="http://microintellia.com/blog/#">***</a> By JVM languages I mean languages different from Java that run on the JVM such as Grrovy, Scala, JRuby, etc&#8230;</p>
<p><a href="http://microintellia.com/blog/#">****</a> Interestingly enough, Java platform languages would be a pretty good case of study for word-of-mouth advertising: some guy created Scala, another guy tried it and blogged about it, few more did the same, some other guy requested some features, etc&#8230;, before you know Scala is slowly being shoved into the spotlight.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/17/java-now-and-in-the-future/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Things that you don&#8217;t want to read on food packaging</title>
		<link>http://microintellia.com/blog/2008/01/16/things-that-you-dont-want-to-read-on-food-packaging/</link>
		<comments>http://microintellia.com/blog/2008/01/16/things-that-you-dont-want-to-read-on-food-packaging/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 15:26:41 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/16/things-that-you-dont-want-to-read-on-food-packaging/</guid>
		<description><![CDATA[&#8220;For cooking instruction please go to so-and-so.com&#8221;.
Far out. I wanted to cook some couscous and when I was looking on the package for the time I had to boil it and for how much water to add I came across &#8220;For cooking instruction please go to http://phoeniciaproducts.com&#8220;.
Guys, I wouldn&#8217;t bank on people going on the [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;For cooking instruction please go to so-and-so.com&#8221;.<br />
Far out. I wanted to cook some couscous and when I was looking on the package for the time I had to boil it and for how much water to add I came across &#8220;For cooking instruction please go to <a target="_blank" href="http://phoeniciaproducts.com">http://phoeniciaproducts.com</a>&#8220;.</p>
<p>Guys, I wouldn&#8217;t bank on people going on the web for cooking instructions, at least not now and not here in North America. I would definitely not bank on people searching your poorly-designed site in order to find out how to cook the food they bought from you while the water is boiling in the pan. I would bank on people reading the food package for this.</p>
<p>Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/16/things-that-you-dont-want-to-read-on-food-packaging/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An interesting take on Net Neutrality</title>
		<link>http://microintellia.com/blog/2008/01/11/an-interesting-take-on-net-neutrality/</link>
		<comments>http://microintellia.com/blog/2008/01/11/an-interesting-take-on-net-neutrality/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 18:55:20 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/11/an-interesting-take-on-net-neutrality/</guid>
		<description><![CDATA[Andrew Odlyzko, the head of University of Minnesota&#8217;s Digital Technology Center has this interesting paper on Net Neutrality. While I don&#8217;t buy all of its arguments, especially the ones on financial markets, Andrew puts an interesting perspective on the Net Neutrality debate: a brief history of price discrimination in history and how once Net Neutrality [...]]]></description>
			<content:encoded><![CDATA[<p>Andrew Odlyzko, the head of University of Minnesota&#8217;s Digital Technology Center has <a target="_blank" href="http://www.dtc.umn.edu/~odlyzko/doc/net.neutrality.pdf">this</a> interesting paper on Net Neutrality. While I don&#8217;t buy all of its arguments, especially the ones on financial markets, Andrew puts an interesting perspective on the Net Neutrality debate: a brief history of price discrimination in history and how once Net Neutrality achieved Google will have a lot of incentives in engaging in price discrimination itself in a different domain.</p>
<p>One interesting point is that legislation relating to price discrimination in one domain or another appears because it is demanded by the people rather than because it is demanded by some corporation or another.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/11/an-interesting-take-on-net-neutrality/feed/</wfw:commentRss>
		</item>
		<item>
		<title>One of Ruby&#8217;s best friends&#8230;</title>
		<link>http://microintellia.com/blog/2008/01/08/one-of-rubys-best-friend/</link>
		<comments>http://microintellia.com/blog/2008/01/08/one-of-rubys-best-friend/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 17:21:21 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2008/01/08/one-of-rubys-best-friend/</guid>
		<description><![CDATA[&#8230; is probably WebLogic Server 10&#8217;s management console because the moment you encounter it you feel like leaving enterprise Java completely. After using it for a while the phrase &#8220;bloated piece of garbage&#8221; comes to my mind upon seeing its blue colors.
I find that WL10&#8217;s console fails pretty badly the test of diversity: an application [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; is probably WebLogic Server 10&#8217;s management console because the moment you encounter it you feel like leaving enterprise Java completely. After using it for a while the phrase &#8220;bloated piece of garbage&#8221; comes to my mind upon seeing its blue colors.</p>
<p>I find that WL10&#8217;s console fails pretty badly the test of diversity: an application server would ideally need a console that can accommodate everybody from a developer testing its code to an operations guy managing it in production mode. The number of roles in IT is increasing and a product that is being used by various people in various roles needs to adapt to each of these roles. Sadly, WL10 doesn&#8217;t do it, it assumes that you need all the time all the bloat that it can provide.<br />
You would expect WL10 to find a way to delegate handling the complexity of running servers to its users (such as the possibility of creating profiles that would allow someone to run common tasks more easily), but this doesn&#8217;t happen. I think this delegation is necessary in order to make WL10 more easy to work with for the growing number of IT roles that  are using it.</p>
<p>The funniest thing that I see when I start up a server is the below screenshot detailing the settings for a particular WL10 server:<a target="_blank" href="/blog/wp-content/uploads/2008/01/wl10console.jpg"><br />
<img src="/blog/wp-content/uploads/2008/01/wl10console.thumbnail.jpg" /></a><br />
The red lines display the items I have never, or very rarely, interacted with. Why do I need to click on Federation Services for testing one of my EJBs? The number of unnecessary links that WL10&#8217;s console throws at you is probably somewhere around 80% of its &#8220;real-estate&#8221;. &#8220;Real-estate&#8221; being wasted away.<br />
BEA should find a way to make its customers use its features (which I assume are quite useful) in a more efficient way. Throwing a ton of buttons, links, features at an unsuspecting user is not the way to go about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2008/01/08/one-of-rubys-best-friend/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PL-SQL vs Java - speed vs ease of development</title>
		<link>http://microintellia.com/blog/2007/12/28/pl-sql-vs-java-speed-vs-ease-of-development/</link>
		<comments>http://microintellia.com/blog/2007/12/28/pl-sql-vs-java-speed-vs-ease-of-development/#comments</comments>
		<pubDate>Fri, 28 Dec 2007 21:09:04 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/12/28/pl-sql-vs-java-speed-vs-ease-of-development/</guid>
		<description><![CDATA[You know the old debate between PL-SQL developers and Java developers: &#8220;Your Java app will never run as fast as my PL-SQL programs&#8221;, &#8220;you will never be able to pass a message to an external system and update a DB row at the same time&#8221;.
Well, the 2 camps are both right, PL-SQL is very good [...]]]></description>
			<content:encoded><![CDATA[<p>You know the old debate between PL-SQL developers and Java developers: &#8220;Your Java app will never run as fast as my PL-SQL programs&#8221;, &#8220;you will never be able to pass a message to an external system and update a DB row at the same time&#8221;.</p>
<p>Well, the 2 camps are both right, PL-SQL is very good at performance, while Java is very good at modeling an application. We should use each platform&#8217;s strengths. So what would follow from this approach? Well, I think it is pretty obvious: create small PL-SQL procedures focused very well on their target and orchestrate them in Java. Avoid creating big PL-SQL procedures because one side effect of this approach would be creating high complexity in a language and a platform that doesn`t deal with complexity so well. Calling these small PL-SQL procedures amd assembling them into larger blocks from Java code is basically orchestrating them from a platform that handles complexity pretty well.</p>
<p>Do this and you will have a Happy New Year!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/12/28/pl-sql-vs-java-speed-vs-ease-of-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Random notes on the economics of knowledge</title>
		<link>http://microintellia.com/blog/2007/12/28/random-notes-on-the-economics-of-knowledge/</link>
		<comments>http://microintellia.com/blog/2007/12/28/random-notes-on-the-economics-of-knowledge/#comments</comments>
		<pubDate>Fri, 28 Dec 2007 17:14:28 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/12/28/random-notes-on-the-economics-of-knowledge/</guid>
		<description><![CDATA[The biggest cost associated with knowledge is learning: in order for one person to absorb the necessary knowledge so that it operates efficiently in a particular environment it is necessary for it to learn that knowledge. It is important to acknowledge this cost because the cost of operating in that environment without the necessary knowledge [...]]]></description>
			<content:encoded><![CDATA[<p>The biggest cost associated with knowledge is learning: in order for one person to absorb the necessary knowledge so that it operates efficiently in a particular environment it is necessary for it to learn that knowledge. It is important to acknowledge this cost because the cost of operating in that environment without the necessary knowledge is typically greater: a person/team operating with insufficient knowledge has large management costs. Taken to extreme insufficient knowledge can lead to micro-management.</p>
<p>Disseminating knowledge is a process usually tied to the domain to which that knowledge is pertinent, to the organization dispersing the knowledge and the people that need to receive that knowledge. In this process you have to rely both on people as well as on systems in order to make it more efficient. Ideally, you would not swamp the persons with requests about knowledge, but rather put them in a position where they can guide people needing the knowledge to the appropriate knowledge resources.<br />
Documentation is the primary vector of disseminating knowledge about a project<a href="http://microintellia.com/blog/#">*</a>, it is the first point of contact between a person and that project and a point of contact to which someone will refer continously during the interaction with that project. It is important that we acknowledge this double role of documentation (initial point of contact and then continous point of contact) and that we structure it to accommodate both roles: a high-level view for initial contact and a lower-level view for displaying the internals of a project.</p>
<p>The knowledge about a domain &#8220;encapsulated&#8221; in one person depreciates slowly for a small period of time and then rapidly as more time passes with that person outside of the domain. For example, a person that is absent from a domain for a small period of time, during which the domain has changed, will be able to absorb the domain changes quickly, if it has been absent for a big period of time it may have problems getting back in shape. However, previous domain knowledge will help.</p>
<p>Storage and retrieval of knowledge is usually expensive. The more &#8220;fuzzy&#8221; the domain of that knowledge the more expensive it gets to retrieve good knowledge about it. In &#8220;fuzzy&#8221; domains you usually rely on people to get to good information. In &#8220;fuzzy&#8221; domains you will also need people in order to resolve conflicts in the interpretation of knowledge. It is important to identify these persons and set-up a communication channel with them.<br />
The need for people in processing knowledge is probably one reason for the informal networks that get established in large organizations: sometimes it pays to know who knows something, sometimes it is the most efficient way to deal with knowledge. Getting to a person that knows something that you need to know is a process of discovery which will ideally be optimized.</p>
<p>Blogs can be used for delegating knowledge management to a person that is motivated to provide that knowledge continously. Bloggers are pretty attached to the subjects they blog about and are likely to follow these subjects and report on them efficiently (at least good bloggers should report efficiently). These reports constitute knowledge about the blogger&#8217;s subjects which are pretty precious. Another nice thing about blogs is that you can initiate conversations with their authors and get pointers from them, blogs act both as systems for disseminating knowledge and as people disseminating knowledge at the same time.<br />
In an organization blogs could be used for finding persons that have knowledge about something and for contacting this person about that knowledge. We should be able to differentiate between blogs and to assign blogs to various knowledge resources.<br />
I think there is a lot more to knowledge management in blogs than I can express right now, I will leave this for later.</p>
<p>The book <a target="_blank" href="http://books.google.com/books?hl=en&#038;id=aEMHzEUJQZQC&#038;dq=economics+of+knowledge&#038;printsec=frontcover&#038;source=web&#038;ots=VjA0JHxsXB&#038;sig=FYo48kyFZQrQear_VHWcYefjyfg">Economics of Knowledge</a> by Dominique Foray is a pretty good book on this subject.</p>
<p><a href="http://microintellia.com/blog/*">*</a> I will use the term project as the object to which knowledge applies.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/12/28/random-notes-on-the-economics-of-knowledge/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tech support for open source projects</title>
		<link>http://microintellia.com/blog/2007/12/27/tech-support-for-open-source-projects/</link>
		<comments>http://microintellia.com/blog/2007/12/27/tech-support-for-open-source-projects/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 15:37:40 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/12/27/tech-support-for-open-source-projects/</guid>
		<description><![CDATA[Customer service has emerged as one way to fund an open source package which grows so much that you cannot support it by relying only on code committed by random committers: you release the APIs under a particular license and you pay for the expenses by selling support subscriptions.
This obviously applies to one small part [...]]]></description>
			<content:encoded><![CDATA[<p>Customer service has emerged as one way to fund an open source package which grows so much that you cannot support it by relying only on code committed by random committers: you release the APIs under a particular license and you pay for the expenses by selling support subscriptions.<br />
This obviously applies to one small part of the open source movement because there are open source projects which get funded in a different manner: RedHat sells customized versions of Linux, IBM provides corporate backing for various open source projects, pooling of corporate resources for maintaining other open source projects, etc&#8230;</p>
<p>As far as I know tech support is used for backing various open source projects such as a variety of Linux flavors, JBoss, Spring Framework, etc&#8230; Tech support relies heavily on the lack of knowledge of operating that open source package: you have some problems configuring JBoss&#8217;s transaction manager and the cheapest way to deal with it is to open a ticket with JBoss rather than try to jump in to the free code. Tech support is actually outsourcing the management of the knowledge required to operate a particular product and as such it feeds on the lack of knowledge about that product. If your product is big and hairy (think about a stack) but widely used you will make a lot of money from tech support. Tech support revenues grow as the complexity of operating that product grows because tech support is tied to the knowledge required to operate that product.</p>
<p>Tech support runs counter to light-weight frameworks, from their definitions they are light and easy to handle. Which makes you wonder about how would a framework championing light-weight development would be able to sell tech-support subscriptions. You will probably sell tech support to Fortune 500 companies which require support for most of the software they use (requirement which is probably a by-product of internal rules more than anything else) but anything else will probably be a tough sell. I understand a 20-person company buying tech support from JBoss for managing their application cluster better but I don&#8217;t understand why would the same company buy tech support for a lightweight container. By definition the usage of that container would be so straight-forward as not to make you need support, you should be able to solve a problem either looking it up on that framework&#8217;s forums or thru the documentation.</p>
<p>That&#8217;s why I am following Spring&#8217;s model with a lot of interest: the very goal they are trying to achieve (an easy to work with and non-intrusive framework) runs against the rationale of supporting that framework thru subscriptions to customer service. The steps that they are taking, such as releasing <a href="http://www.infoq.com/news/2007/12/springsource-support" target="_blank">value added packages</a> probably shows that supporting a light-weight framework is not very efficient and that you have to resort to a different model for funding it.<br />
I would say that this new strategy is promising because these value-added packages will increase the knowledge required for efficient operation and implicitly the need for tech support.<br />
Kudos to Spring Source for breaking away from an old model.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> Tech support also relies on the complexity required for interacting with a particular product, be it an operating system, an application server, etc&#8230; The more complex the product, the bigger the need for tech support. Spring Source`s products so far were not complex to operate, on the contrary, their objective was to allow for transparent, non-intrusive development and ease of operation is part of this objective. With Spring Source move into value added packages they also move into more complex products (if you look at what Spring Integration is trying to achieve you will see a lot of very complex interactions between various products in the Spring Source stack). The more complex these products, the bigger the need for tech support. It will be interesting to watch how this will unwind.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/12/27/tech-support-for-open-source-projects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transaction* costs in software development</title>
		<link>http://microintellia.com/blog/2007/12/03/transaction-costs-in-software-development/</link>
		<comments>http://microintellia.com/blog/2007/12/03/transaction-costs-in-software-development/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 18:29:49 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/12/03/transaction-costs-in-software-development/</guid>
		<description><![CDATA[Probably the most interesting thing that I read in quite a while is the paper &#8220;The Nature of the Firm&#8221; ** by Robert Coase which can be viewed here. Ronald Coase answers a pretty interesting question: why in some cases it makes sense to gather resources together to carry out an economic activity while in [...]]]></description>
			<content:encoded><![CDATA[<p>Probably the most interesting thing that I read in quite a while is the paper &#8220;The Nature of the Firm&#8221; <a href="http://microintellia.com/blog/#">**</a> by Robert Coase which can be viewed <a href="http://www.cerna.ensmp.fr/Enseignement/CoursEcoIndus/SupportsdeCours/COASE.pdf">here</a>. Ronald Coase answers a pretty interesting question: why in some cases it makes sense to gather resources together to carry out an economic activity while in other cases it makes sense to delegate that altogether to an outside party.<br />
The answer lays in the extra costs that lay in carrying out a transaction or, as they are known, in <a href="http://en.wikipedia.org/wiki/Transaction_cost" target="_blank">transaction costs</a>. Let&#8217;s say that you want to have your own house. You have 2 choices: one is to sub-contract parts of building the house and orchestrate the activities of the companies that you have sub-contracted: the one that pours the foundation, the one that puts up the walls, the people that paint your house, etc&#8230; or you can delegate the operation to the external entity, the home builder. The costs of each choice are (at first sight) the following:<br />
1) carrying out the orchestration on your own: paying for the company that pours the foundation, the one putting up the walls, the one putting up the roof, etc&#8230;<br />
2) delegating this to the home builder and paying for all of the above (the home builder will have to pay the sub-contractors just like you do) + the profit of the home builder who will be doing the orchestration for you.<br />
At first sight it appears that you should be doing all the stuff yourself and come off cheaper than by delegating this to the home builder. But apart from the costs of the subcontractors you also incur the costs of interacting with them: you need to inspect the work of each one because you don`t know how good that sub-contractor is, you need to look around for good subcontractors, you waste a lot of time negotiating with them, etc&#8230; No suprise that most people prefer to go with a builder<a href="http://microintellia.com/blog/#">***</a>.</p>
<p>What basically <em>The nature of the Firm</em> says is that if the costs of carrying out the activity on your own are less than the costs of delegating this to a dedicated party you should carry out this activity on your own rather than delegate it. You can see Coase&#8217;s theorem at work in the current  outsourcing/offshoring trend: the transaction costs for outsourcing some operations are so low to the fact that a corporation can delegate efficiently various tasks to outside partners.</p>
<p>So how would this apply to software development? I would say that transaction costs demarcate pretty well what needs to be grouped together and carried out by one entity (which assumes a specialization of some sort) and what needs to be delegated to a different party. Well, this is what is needed for architecting a project: you need to determine how to group various classes, packages, systems together so that they minimize the interactions between them. The interactions between systems (or classes or packages) can be thought of as transactions: one class calls the other to do some work just like a home-builder calls the carpenter to install the hard-wood floor. By looking at the transaction costs between various components of an application you could determine what transactions (method calls) should be consolidated into component that handles them and what transactions should be allowed to exist on their own.</p>
<p>I would say that one big  cost associated with a method call (or call to a package/outside system) is extensive orchestration between various classes (a method that calls 15 other methods from 7 different classes). If you have a pattern of method calls repeating over your code-base you should probably  try to take a step back and consolidate these calls into a component that will serve the purpose of that particular orchestration. This way you will create a specialized component to which you delegate this orchestration, rather than replicating it multiple times. Efficient specialization of the components will incur lower transaction costs because it will push down on the number of interactions between components. For this you need domain knowledge. While designing a system you should look for specialization and for ways to achieve this specialization and once this specialization achieved you should look for ways to interact with these specialized components efficiently. If this is done properly you will end up with a system in which the cost of interaction between various components is low.</p>
<p>Another big cost for interacting with a different system is knowledge about the other system and class. The more knowledge you need to have about an external entity the more costly it is for you to interact with that system: you will need to be kept up-to-date with changes in this knowledge, there is a ramp-up cost, you can handle only this much knowledge, etc&#8230; It is a good thing to minimize the knowledge required for interacting with an external entity, this way a component can interact more efficiently with other components.<br />
One corollary would be that you need to externalize as little as possible from any component and try to keep most of its sub-components private. One side effect of having too much of a component available is that you run the danger of a component coupling to it unnecessarily.</p>
<p>One cost for interacting with an external system is API coupling: the fact that you need classes exported by that external system<a href="http://microintellia.com/blog/#">****</a> in order to connect to it. If your system shares classes with an external system you will need a way to synchronize the shared classes with the external system. This is done usually either by having the external system having different versions for its points of interaction or by having a mechanism that publishes classes used for interaction. Either alternative is pretty costly, so you may try to keep away from sharing classes with an external system (though sometimes it may be impossible).<br />
Transaction costs can be applied in project management as well: you should look out complex interactions between teams and try to assign them to a resource best dedicated to handle them (this resource could be a team-member, a well-defined process, etc&#8230;). However, in this case you should avoid assigning this interaction to a real person because you will run into scarcity constraints (i.e. you will run out of people) very fast if you keep delegating to real people. This is why these interactions are probably best addressed to a process.</p>
<p>I think that developing a software project while keeping an eye on the transaction costs is a good approach.</p>
<p><a href="#">Later Edit.</a> Transaction costs are very useful in determining the interaction between large components (systems, services, applications) and they are probably best used for managing this interaction. When you design the interaction of various systems the interaction costs (which are transaction costs) should be kept to a minimum for that interaction to occur without many problems.</p>
<p><a href="http://microintellia.com/blog/#">*</a> In this post transaction will be used for its economic meaning: i.e. it will stand for an exchange between 2 parties.</p>
<p><a href="http://microintellia.com/blog/#">**</a> If I am not mistaken Ronald Coase received the Nobel prize in economics for his work on transaction costs and this paper.</p>
<p><a href="http://microintellia.com/blog/#">***</a> Please note that there are people that actually build their own houses on their own. The vast majority of them are in the construction business or have connections in the construction business so their transaction costs are a lot lower that for the ordinary person.<br />
On a different note, the orchestration needed for building a home (calling the people that put up the jeep-rock after the 2/4`s have been erected, calling the painter for painting the walls after the walls have been put up, etc&#8230;) is a very simple business process without any intrisic value and prone to copying. No wonder that the builder itself makes a pretty small margin while the lion`s share of the profits go to the entity which owns the land&#8230;</p>
<p><a href="http://microintellia.com/blog/#">****</a> You are generally sharing classes with an external system if you interact with it via RMI or EJB. Interacting with an external system via WS-* or REST is a lighter coupling.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/12/03/transaction-costs-in-software-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The case for meaningful names for methods/classes, etc&#8230;</title>
		<link>http://microintellia.com/blog/2007/11/16/the-case-for-meaningful-names-for-methodsclasses-etc/</link>
		<comments>http://microintellia.com/blog/2007/11/16/the-case-for-meaningful-names-for-methodsclasses-etc/#comments</comments>
		<pubDate>Fri, 16 Nov 2007 19:06:23 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/11/16/the-case-for-meaningful-names-for-methodsclasses-etc/</guid>
		<description><![CDATA[Code contains knowledge about the application and not only the commands to execute that application, this is a thing that is a bit unknown.
Meaningful names for classes/methods, etc&#8230; will expose the knowledge buried in the code better to a person working with that code. When you are changing the behavior of a method or a [...]]]></description>
			<content:encoded><![CDATA[<p>Code contains knowledge about the application and not only the commands to execute that application, this is a thing that is a bit unknown.<br />
Meaningful names for classes/methods, etc&#8230; will expose the knowledge buried in the code better to a person working with that code. When you are changing the behavior of a method or a class it is a good policy to also change its name in order to expose the behavior of that class better.<br />
The knowledge of an application should not be encapsulated only in UML diagrams or PowerPoint documents, it should be encapsulated into the code itself because easier to read code translates into a better application.</p>
<p>I have become interested lately into knowledge management. It is a pretty interesting field that applies pretty well to software development.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> In the ideal case a person could learn a bit about the domain by going over the APIs, in such an environment you could say that the domain knowledge is pretty well encapsulated in the code. Of course, this would not mean that the domain knowledge should only exist in the code, only that it is a desirable to have the code reflect the domain.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/11/16/the-case-for-meaningful-names-for-methodsclasses-etc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Push the technology way back</title>
		<link>http://microintellia.com/blog/2007/11/16/push-the-technology-way-back/</link>
		<comments>http://microintellia.com/blog/2007/11/16/push-the-technology-way-back/#comments</comments>
		<pubDate>Fri, 16 Nov 2007 14:36:28 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/11/16/push-the-technology-way-back/</guid>
		<description><![CDATA[I was listening to this presentation by some people at ThoughtWorks about designing an application when I was struck by this quote which goes roughly like this:
 I keep thinking of clever designs to push the technology out of the picture so that changes in the business domain can be implemented more easily.
Very clever quote. [...]]]></description>
			<content:encoded><![CDATA[<p>I was listening to <a target="_blank" href="http://www.infoq.com/presentations/modifiability-fowler">this presentation</a> by some people at ThoughtWorks about designing an application when I was struck by this quote which goes roughly like this:<br />
<em> I keep thinking of clever designs to push the technology out of the picture so that changes in the business domain can be implemented more easily.</em></p>
<p>Very clever quote. The business domain keeps changing a lot more frequently these days, I think due to an increase of the number of stakeholders which increases the variety of requirements, so it is imperative to be able to make those domains changes easily. Being unable to make these domain changes because of technological reasons carries a pretty big cost.<br />
This is why the technology should take a back seat to the domain. Ideally it would be abstracted so that it is decoupled from the domain.</p>
<p>Another quote that I liked was: <em>you are given a domain when you start working on a project, you are not making this domain up and that your implementation should reflect very well that domain. The job of the domain modeler is to find out that domain and then represent it as faithfully as possible. The domain will change, but it not change in a radical fashion because this would imply that the underlying business changes radically and this doesn&#8217;t happen that often.</em><br />
As I was saying before, the domain changes more frequently these days so it is better to have your application very well aligned with the domain so that changes in the domain can be translated into changes in the application very easily. If you cannot add a new feature because some framework doesn&#8217;t allow you to then you have a pretty big problem.</p>
<p>Another big theme in this panel was how to defer decisions till the last possible moment, which is a pretty neat things: it pays off to make decisions later when you probably have more information to base your decisions on.</p>
<p>All in all, a pretty interesting presentation.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/11/16/push-the-technology-way-back/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Facebook platform and Open Social</title>
		<link>http://microintellia.com/blog/2007/11/15/the-facebook-platform-and-open-social/</link>
		<comments>http://microintellia.com/blog/2007/11/15/the-facebook-platform-and-open-social/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 20:25:20 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/11/15/the-facebook-platform-and-open-social/</guid>
		<description><![CDATA[Most of the social network operators depend on creating network externalities, the relationships between people using the same social network make leaving a social network more costly.
It is interesting to see the effects of Open Social, essentially a cross-corporation platform for hosting social-network widgets on Facebook. I am not arguing whether Open Social is better [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the social network operators depend on creating <a target="_blank" href="http://en.wikipedia.org/wiki/Network_externality">network externalities</a>, the relationships between people using the same social network make leaving a social network more costly.<br />
It is interesting to see the effects of <a target="_blank" href="http://blog.pmarca.com/2007/10/open-social-a-n.html">Open Social</a>, essentially a cross-corporation platform for hosting social-network widgets on Facebook. I am not arguing whether Open Social is better than the <a target="_blank" href="http://developers.facebook.com/">Facebook platform</a>, I don&#8217;t know much about any of them. But think about a widget with some social capabilities deployed both on Facebook platform as well as on a social networking implementing Open Social (such as Ning) (such a widget will obviously be exposed thru 2 different APIs: Facebook&#8217;s platform API and Open Social). This widget would establish cross-corporations connections and would create cross-corporation network externalities. This widget would effectively lower the cost of leaving Facebook: all the connections handled by this widget will work if you leave Facebook and join a different social network. Facebook will fade into the background as well as this widget is concerned. If more and more social functionality got created in widgets the network externalities would become cross-corporations to the point where the hosting platform (Ning, Facebook, Orkut) becomes irrelevant. A social network hosting these widgets will probably become more atuned to its members to the point where a member will probably navigate between multiple social networks, each connected by the widgets. The social networks which are not well defined (MySpace, etc&#8230;) will probably grows less than social networks that define their users.</p>
<p>It is interesting to see how will Facebook react to Open Social. Putting a widget both on an Open Social site and on Facebook is not extremely hard, you decouple the interaction between the widget and the host system from the services of the widget and you code 2 interactions: one for Open Social and Facebook (the fact that you have to code to only 2 different APIs which are quite simple helps a lot). Also, from what I understand you are basically coding to a container API, which probably doesn&#8217;t require a very complex interaction. Due to the low cost of creating cross-corporation widgets via Open Social Facebook doesn&#8217;t have a big room to maneuver, it cannot take the widgets developers hostage as Microsoft and various telcos have done it (the high cost of developing to a particular platform prevented developers from creating applications that would work both on Windows as well as on Linux). Sooner or later Facebook will have to face the facts and drop its platform altogether because it will become just a redundancy.<br />
One smart thing that Open Social has done is to create an API which is very simple. When they created a API competing with Facebooks they have created opportunity costs for coding to Facebook. The fact that this competing API comes with a low cost of development means that coding to Facebook carries a low opportunity cost which means further that these APIs are not competing for developemnt resources (coders, managers, etc&#8230;), a very important thing if you want to gain mind and market share.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> I think I rushed ahead when saying that Facebook will have to drop its platform. Currently there is not much difference between the Facebook platform and Open Social, both basically let you deploy your application within a social network. Currently both of them are basically containers. But this could change in the future. One potential important difference is how these containers will give an application access to members using the social network on which it is deployed (users, advertisers, etc&#8230;). Access to members within a social network could be what would split the organizations backing Open Social (hi5, Orkut, Ning, etc&#8230;) because a social network is all about access and different social networks would need different access between members. Anyway, I will end this here.</p>
<p><a href="http://microintellia.com/blog/#">Later edit 2:</a> It looks like there is an <a target="_blank" href="http://www.businessweek.com/the_thread/techbeat/archives/2007/12/social_networki_2.html?campaign_id=rss_blog_blogspotting">explosion of social network platforms</a>. It is interesting to see how this will unfold: as far as I know the costs of coding to a particular social network API are pretty low if the application is well designed (you are simply coding to a container API with whom your application has a pretty simple interaction) so it is conceivable that developers for social network applications will be able to code to multiple social networks at the same time. Or who knows, maybe developing widgets for social networks will go the way of developing mobile applications: a highly fragmented environment where the costs of coding to a mobile device/operator combinations are so high that the developer is taken hostage by that mobile device/operator. Open Social tried to provide an API to make developing to the whole social networking industry easy (an initiative which bears many similarities with Google&#8217;s Android BTW), but they may fail.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/11/15/the-facebook-platform-and-open-social/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Software as a Service</title>
		<link>http://microintellia.com/blog/2007/11/14/software-as-a-service/</link>
		<comments>http://microintellia.com/blog/2007/11/14/software-as-a-service/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 22:27:23 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/11/14/software-as-a-service/</guid>
		<description><![CDATA[Various thoughts on one hot buzzword:
One recent development in the IT world is the emergence of the Software as a Service, or of services that are provided to someone running an IT operation. This is due primarily due to the drop in the cost of communication which allowed for closer partnerships.
The most important thing about [...]]]></description>
			<content:encoded><![CDATA[<p>Various thoughts on one hot buzzword:</p>
<p>One recent development in the IT world is the emergence of the Software as a Service, or of services that are provided to someone running an IT operation. This is due primarily due to the drop in the cost of communication which allowed for closer partnerships.</p>
<p>The most important thing about consuming a service is that it allows you to decompose the interaction with the Service Provider. While previously you needed to purchase a big,fat shrink-wrapped product and then orient your application around it now you can pick from the offerings that a service has and choose the ones that bets suit you from a cost, QoS, etc&#8230; perspective. This, obviously, doesn&#8217;t prevent the sale of consolidated service stacks. (However, you should be careful when buying a service stack because you are also buying the relationships between these the services in this stack. These relationships will ideally be customizable easily).</p>
<p>The different economics (the fact that you are buying the service thru a subscription rather than with one payment) drives a different interaction: the Service Provider has a big incentive to take you &#8220;hostage&#8221;. On the other side the consumer of a service wants to minimize the costs of transition from one Service Provider to another in order not to be taken &#8220;hostage&#8221;.Taking a Service Consumer &#8220;hostage&#8221; is done thru features, but it can also be done by coupling your application to that service. You should avoid coupling in order to avoid being taken hostage. Features that are not implemented by competing Service Providers will probably be more expensive and will also take you hostage (funny how you actually pay more for being taken hostage).<br />
One type of coupling between a Service Consumer and a Service Provider is thru APIs. The Service Consumer should abstract the interaction with the Service Provider in order to minimize this coupling so that they could switch to a different Service Provider easily if they need to.The service consumers have the upper hand in this game, if the interaction with a service is properly designed switching to a different provider should be easy.</p>
<p>Another type of coupling between your operation and the Service Provider is thru data: you need to keep control over your data so that you can move from one service provider more easily. When you are moving from one service provider to another you should make sure that you keep control over the data so that your data is not taken hostage by your service provider. Providing data to your service provider should be a process that should be very careful organized, you need to keep a tight control over it. You need to keep a very tight control as well over the data produced by your service provider: invoices of the things you have sold thru that Service Provider, the customer records that a CRM service provider has about your customers, etc&#8230; A service provider which cannot communicate to you the data that it has produced on your behalf should be considered risky, you may be taken &#8220;hostage&#8221;.<br />
One particular type of data that you may be interested in is data concerning the service usage. Consider this example: one retailer outsourced its B2C site to a Service Provider. The site was recording a lot of traffic, but very few sales were taking place. Click-path-analysis (which is essentially scanning the data of how the B2C service was used) eventually revelead that the check out process was confusing. The service usage data is vey important, especially if the service is facing ordinary consumers.</p>
<p>The services that are outsourced to an Service Provider are not services which are strategic an operation but rather services that have been commoditized to the point where they don&#8217;t differentiate one operation from another. This implies that you should not outsource services that your company counts on for getting ahead of the competition. For example, if the customer experience is at the crux of your operation it doesn&#8217;t make much sense to outsource it to salesforce.com, because this would eliminate one important arrow from your quiver. However, if you are building an operation that revolves mainly importing various artifacts from China you may consider salesforce.com for managing your relations with your customers.</p>
<p>The service that you subscribe to should have some latency, the SLA&#8217;s regarding latency should be somewhat relaxed. Most of the services will be provided remotely from a different data-center, this should be considered. This would add more weight to the fact that you should not outsource services critical and strategic to your operation. You could mitigate this by delegating coarse-grained services to the Service Provider so that the interactions between your applications and the service you are using are not frequent. This would mean that it pays off to delegate more functionality to the Service Provider, as a result the service they provide should be easy to customize according to your needs.</p>
<p>When you are outsourcing a service to a Service Provider you are also outsourcing the maintenance, operation and the security of that service and its data. You should make sure that the Service Provider&#8217;s op team is up to the challenge (this point is so evident I didn&#8217;t think it should be stated).<br />
Software as a Service will probably continue to drive the commoditization of various IT operations, SaaS is about outsourcing non-differentiating  operations to an entity best equipped to handle them.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/11/14/software-as-a-service/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile development</title>
		<link>http://microintellia.com/blog/2007/11/03/agile-development/</link>
		<comments>http://microintellia.com/blog/2007/11/03/agile-development/#comments</comments>
		<pubDate>Sat, 03 Nov 2007 17:32:58 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/11/03/agile-development/</guid>
		<description><![CDATA[A post of various thoughts that I have about Agile development.
Judging from my previous posts you may believe that I am against Agile Development. I am not, as a matter of fact I agree with a few of their &#8216;practices&#8217;:
I agree that you need the team members need to be constantly kept-up-to date with project [...]]]></description>
			<content:encoded><![CDATA[<p>A post of various thoughts that I have about Agile development.<br />
Judging from my previous posts you may believe that I am against Agile Development. I am not, as a matter of fact I agree with a few of their &#8216;practices&#8217;:<br />
I agree that you need the team members need to be constantly kept-up-to date with project developments, this way you can delegate tasks more effectively. I agree that you need to test your applications well, this makes your applications easier to change for one thing. I agree that iterations are a good way of developing a project which has a lot of uncertainty in it.<br />
I would say that I agree with quite a few practices championed by Agile developers. What I have trouble agreeing with is the vagueness that pervades most Agile concepts. Most Agile concepts are pretty vague since Agile development aims to encompass all software development (not a small feat is you think about it) with the result that concepts can be stretched into being meaningless (just check out this Agile practitioner <a target="_blank" href="http://www.infoq.com/news/2007/09/newardarch#view_10662">definition of developer</a>). Agile practices are so easy to stretch that you would think they were constructed this way in order to avoid blame and reap glorious praise, to be honest sometimes I think this is their chief purpose.</p>
<p>Another problem that I have is with the total lack of structure when it comes to project management. Rather than this thick Agile soup that tries to have an answer to everything we would be a lot better off if we had some IT-management patterns, similar to the GoF design patterns, I am trying to figure out what OOP would have looked like without those design patterns and it is not a nice picture. Who knows, maybe one day some guy will write a book where you could read something along these lines: &#8220;we had this team made up of 5 people, 3 junior, 2 senior, we had this project in this environment. We had some conflicts between the 2 seniors which were resolved in this way. We determined that the best way to tackle these problems was to split the tasks in this way, etc&#8230;&#8221;. This type of book, a collection of effective and widely applicable project management patterns, would serve IT a lot better than the latest iteration of Agile practices.</p>
<p>If you have a homogenous team then Agile process will probably work for you. The moment you run into a team where there are big differences between members and their skill sets you will see a different set of dynamics because you will want to make the most out of each member&#8217;s skill set. Unfortunately, Agile development doesn`t have an answer to handle this.</p>
<p>The focus on developers going as far as to declare that you only need developers in order to put thru a successful software project is pretty ludicrous, it&#8217;s pretty ludicrous and pompous for developers to say that you only need developers for a software project, it sounds like a second-hand shoe salesman.</p>
<p>Small iterations and continous release sometimes run you into troubles: consider that you are exposing your application to the outside world (in REST or WS or whatever). Let&#8217;s say that you make a small change in the way the app gets exposed, like you added a method or changed a signature. The only way you can release this to prod is by creating a new version of the same service so that you don&#8217;t break the dependencies on the current service. Well, versions cannot be created very often or you run the risk of developing Versionitis, AKA version management problems. This puts a lid on the number of times you can port to prod, you will be able to port to PROD only rarely in order to avoid going into a versioning nightmare.<br />
Continous release probably applies to projects where you have no or minimal interaction with outside parties or where you have a fair degree of  control over their environments.</p>
<p>Agile development is mostly a mirror of various development practices occurring at various development shops which happen to have their a very skilled workforce (think ThoughtWorks and the like). It would be a mistake to believe that all of these practices apply outside of these shops. My opinion is that you should watch Agile Development from a safe distance, pick what you think works for you, try to formalize it in order to get it closer to your needs and move on.</p>
<p>As always I don`t have the time to finish this post, it has been gestating for a while now, so I will release it as it is.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/11/03/agile-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Annotations used for deployment</title>
		<link>http://microintellia.com/blog/2007/10/15/annotations-used-for-deployment/</link>
		<comments>http://microintellia.com/blog/2007/10/15/annotations-used-for-deployment/#comments</comments>
		<pubDate>Mon, 15 Oct 2007 15:37:42 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/10/15/annotations-used-for-deployment/</guid>
		<description><![CDATA[I was reading this post from Bill Burke&#8217;s blog and I found myself shocked by the sheer number of annotations required for making a business object WS-BA compatible (if I understand well the post).
One thing that I don&#8217;t like about using annotations is that they tend to stay with the code. I think that these [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://bill.burkecentral.com/2007/10/15/client-driven-business-activity/">this</a> post from Bill Burke&#8217;s blog and I found myself shocked by the sheer number of annotations required for making a business object WS-BA compatible (if I understand well the post).<br />
One thing that I don&#8217;t like about using annotations is that they tend to stay with the code. I think that these documentation provided by annotations should be outside of the code because in this case you are coupling your business component to an external concern: you are coupling your component to the WS specification.<br />
What you get in Bill&#8217;s post is the first stage of annotation creep: you need to externalize your component in order to plug it into an operational environment and you do it thru an annotation. Next operational environment comes with a brand-new set of annotations. And so on&#8230;<br />
I keep thinking that the best way to deal with all these annotations would be to sub-class the original interface and apply annotations to it. You will have quite a lot of problems: the classes which are mapped to the original interface will need to be sub-classed as well and their sub-classes mapped to the annotated interface. You will have problems when updating the original interface, you will find that you need to update all its annotated sub-interfaces. And a whole other set of problems.<br />
You feel like you almost need to define inheritance in annotations: an interface would inherit the methods from an interface and the annotations from a different place and you would work with this new interface properly annotated for the operational environment. My opinion is that annotations, like any other type of static, hard-to-change documentation, have serious limitations when it comes to exposing a class to many, varied environments and when you are using it for documenting operational concerns. No wonder so many people prefer XML&#8230;</p>
<p>BTW, this post uses Bill Burke&#8217;s post only for displaying an example of annotation-creep.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> If you think about the way annotations are currently used (putting them all over your code base in order to insert a component into various frameworks) they can be thought of as some sort of cross-cutting concerns (they are cross-cutting to a certain extent). I wonder if using something like an aspect would not do a better job of expressing the various concerns that annotations are currently used for. Aspects are orthogonal to the code-base at the same time, a pretty neat thing.<br />
Wouldn&#8217;t it make sense to WS-BA-enable your whole application by specifying a point-cut and then applying annotations against this point-cut? It would be a lot easier and it would de-couple your code-base from external concerns. I am not sure if it is doable (I could think of a solution, but it is not pretty).<br />
I think that the way annotations are currently used is not 100% OK and that it poses some maintainability problems in the future. Putting information into annotations is partly a response to XML-creep (as Bill Burke pointed out in the comments) but it is a solution far from perfect. What we are dealing with here is the need to add some information to a component in order to plug it into a framework. Annotations, as well as XML, are not doing a good job because they address this problem (plugging the component into the framework) at the individual level, at the component level. What we really need is a mechanism that would let you plug a whole set of components into a framework easily (I suggested using point-cuts).</p>
<p><a href="http://microintellia.com/blog/#">Later Edit 2.0:</a> I think that adding querying capabilities at the code-base level (similar to AspectJ`s point-cut language) along with a mechanism to interpret these queries into Java would be the killer feature that Java lovers wait for. It would create a whole new way of developing: for example AOP would be implemented by joining point-cuts to an interception mechanism. A lot of the current mappings (in XML or in annotations) could be solved by defining a point-cut and then a mechanism to interpret this point cut. In the above case you would define a point-cut of your components that you want to WS-BA-enable and a mechanism for working with the components returned by this point-cut. Embedding a framework into an application would consist of creating a point-cut and then passing it to the framework in order to process it.<br />
This would be application-level introspection and reflection and it would do away with both annotation-creep and XML-creep. I can`t dwell too much on it cause I gotta go to sleep.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit 3:</a> In this <a target="_blank" href="http://bill.burkecentral.com/2007/10/22/the-rise-of-meta-annotations/">post</a> Bill Burke argues about using meta-annotation in order to de-couple your code-base from framework specific annotations. Adding a level of indirection between framework-specific annotations will free your application from framework-specific dependencies, this is for sure, but you will still tie your code to a representation (the representation specified by your annotations that serve as end-points for the original framework specific annotations). I am not sure that this is desired. I still think that your code-base should not be polluted by any external concerns.<br />
It is interesting to see what will happen:<br />
1) Will the world continue with annotation-creep and XML-creep for plugging their applications into various frameworks?<br />
2) Will the world settle for a mid-way solution, like the meta-annotation solution suggested by Bill for the same problem?<br />
3) Will the world try to solve this thru a different design?<br />
4) Will the world decide that frame-work plugging is so costly that we might as well migrate to a different language/platform in order to reduce these costs?<br />
It is all a question of <strike>supply and demand</strike> basic economics: plugging an application into a framework is currently a pretty costly operation. If the demand for this operation rises significantly (the number of times an application is plugged into a framework increases) it would make sense to make an investment (new methodology, new framework, etc&#8230;) in order to slash the costs. Either you make the investment or your language/platform becomes so costly so that it will prove cost-effective to move to a different language/platform.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/10/15/annotations-used-for-deployment/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A new attack vector for spammers?</title>
		<link>http://microintellia.com/blog/2007/10/12/a-new-attack-vector-for-spammers/</link>
		<comments>http://microintellia.com/blog/2007/10/12/a-new-attack-vector-for-spammers/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 21:33:27 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/10/12/a-new-attack-vector-for-spammers/</guid>
		<description><![CDATA[I was thinking about how blogs combat for spamming thru comments when I came across this idea:
There are entry barriers for comments because the user, along with a third-party, do the job of filtering comments, but as far as I know there are no entry barriers for track-backs.
A spammer could use track-backs quite efficiently because [...]]]></description>
			<content:encoded><![CDATA[<p>I was thinking about how blogs combat for spamming thru comments when I came across this idea:<br />
There are entry barriers for comments because the user, along with a third-party, do the job of filtering comments, but as far as I know there are no entry barriers for track-backs.<br />
A spammer could use track-backs quite efficiently because track-backs are managed usually thru third-parties (such as Technorati, Google, etc&#8230;) which will probably not be able to defend against this. These third parties will not be able to defend against this type of spam because they delegate nothing towards the blog against which they compile track-backs (at least they do not do this right now). The user should make the final decision on whether the track-back is a real track-back or spam and decide whether to display that track-back or not.</p>
<p>When will we have track-back spam? And what shape will take the defense against it?</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> Obviously track-back spam has a much higher cost than blog comments spam so this may make it un-profitable.<br />
On the defense side: you are essentially using a third-party service (like Technorati search) over which you don&#8217;t have much control. You could set-up a filter on your site that would filter the results that this third-party gives you.<br />
So, it looks like track-back spam is not the way to go. Mind you, if track-back spam would have been profitable we would have had it a long time ago.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/10/12/a-new-attack-vector-for-spammers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>XP Testing</title>
		<link>http://microintellia.com/blog/2007/10/11/xp-testing/</link>
		<comments>http://microintellia.com/blog/2007/10/11/xp-testing/#comments</comments>
		<pubDate>Thu, 11 Oct 2007 17:41:45 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/10/11/xp-testing/</guid>
		<description><![CDATA[Yet another short post on a topic dear to XP-developers everywhere.
Testing as documentation.
Testing is not documentation. Or rather put is poor documentation. Sure you encapsulate the desired behavior of your application in tests, but this doesn&#8217;t mean that you  actually document it. One of the reasons that testing is not documentation because in order [...]]]></description>
			<content:encoded><![CDATA[<p>Yet another short post on a topic dear to XP-developers everywhere.</p>
<p><a href="http://microintellia.com/blog/#"><strong>Testing as documentation.</strong></a><br />
Testing is not documentation. Or rather put is poor documentation. Sure you encapsulate the desired behavior of your application in tests, but this doesn&#8217;t mean that you  actually document it. One of the reasons that testing is not documentation because in order to get the desired behavior out of a test (especially a non-commented test) you need to reverse engineer the test. As you can imagine this is a very error-prone process. You could make your tests more readable by commenting them but those comments are the actual documentation and not the tests themselves. If tests were documentation then documenting the tests would be as documenting the documentation, a mind-numbing concept on its own.</p>
<p>Tests, and unit tests especially, are low-level entities, they are close to the code. Documentation requires views of the application at different levels, from the low-level (small pieces of code) to high-level (functionality).While you could put together a series of tests which would test the application at a higher-level (and you should probably do so in order to test your application at this level) I don&#8217;t think you can navigate the tests easily in order to determine which are high-level, which are low-level, etc&#8230;</p>
<p>Yet another reason for which testing is not documentation is the fact that documentation and testing have 2 different reasons to exist: documentation is about informing a developer about the application (and this includes a lot more than functionality) while testing is about making sure that certain desired functionality is being implemented correctly. Documenting an application requires that you express some concepts in the most efficient and less error-prone way so that a developer can pick up the documentation and understand it as easily as possible.<br />
This process of encapsulating knowledge in order to make it available to someone is a very tricky process and the failure of various methodologies would be witness to this. My impression is that this is a process which requires a lot of research, particularly in knowledge management, and that the test as documentation solution advanced by the XP-guys is just another milestone on the road to greater confusion.<br />
Some people may find test as documentation to work for them, but I think they are a very small minority. Documenting an application is a process that is particular to a development team and assuming that all development teams can be reduced to a common denominator (such as test-is-documentation) is a pretty big mistake.</p>
<p><a href="http://microintellia.com/blog/#"><strong>Test-driven development.</strong></a><br />
Yet another interesting use of testing. First of all, do you really want to start new development with a compilation error (talk about starting on the right foot)? Probably not.<br />
The biggest problem that I have with TDD is that it encourages you to write a test before you write a class this test is supposed to test. As you expect, you get a compilation error. However, one problem that arises is that you reference the target class in the test itself, and you do this by usually putting the target class in a dummy package. Once all is fine you re-factor your code base and the target class gets assigned to its proper package.<br />
This is a classic example of designing after coding: moving the target class to its proper package is a design issue (assigning a package to a class is basically managing the relationships between your classes) which you get to do after the class is coded. I think that this is a pretty bad arrangement, ideally you design before you code.<br />
I know that design is seriously looked down in the XP community and TDD is symptomatic of this attitude.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/10/11/xp-testing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pair programming</title>
		<link>http://microintellia.com/blog/2007/10/08/pair-programming/</link>
		<comments>http://microintellia.com/blog/2007/10/08/pair-programming/#comments</comments>
		<pubDate>Mon, 08 Oct 2007 03:16:53 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/10/08/pair-programming/</guid>
		<description><![CDATA[Another short article on agile development.
You are probably familiar with people complaining that software development is one of the most error-prone and wasteful industries (if cars were manufactured by developers they would consume 50 gallons of gas per 100 miles, would require a visit to the mechanic every second week and would break down after [...]]]></description>
			<content:encoded><![CDATA[<p>Another short article on agile development.<br />
You are probably familiar with people complaining that software development is one of the most error-prone and wasteful industries (if cars were manufactured by developers they would consume 50 gallons of gas per 100 miles, would require a visit to the mechanic every second week and would break down after 2 miles, or something like that).<br />
Pair programming is that concept taken to extremes: apparently programmers would be more productive if one is working while the other looks over its shoulder. It is pathetic that such a concept which wastes the amount of available workforce exists only in software development (tell to a car mechanic, a painter, a doctor, etc&#8230; that it should have someone behind its back consistently in order to do its job well and it will ask you to have your head examined).<br />
It is bad and it tells you that software engineering is a a very diverse field that has a pretty big management problem and that is willing to try every conceivable solution in order to put some efficiency in delivering products.</p>
<p>It also has a pretty big overhead and shows an impossibility in delegating a task to someone. The ideal software developer is working autonomously, has a fair understanding of the domain and a good grip on the technology involved in its day-to-day job. The ideal pair programmer is a developer which outside of its pair is like a fish out of water. You pick your ideal developer.</p>
<p>Some questions for pair-programming enthusiats: Pair programming shows a distrust in the persons paired up: when will you trust a person to work on its own? Does a software developer needs on-going tutoring in order to work? Isn`t it possible to teach that person how to write better code, to have some in-house workshops on coding in order to show some best practices? If you consider your workforce to be so deficient so that they need to be continously tutored don`t you think that you should probably do something about that? How do you prevent 2 developers working in pairs from re-enforcing the bad habits that they share?<br />
The usual argument to defend pair programming is the following: <strong>programmer A can do task X in three minutes and task Y in twenty-five minutes, while the times will be reversed for programmer B.  Put these two programmers together and they&#8217;ll be able to complete tasks X and tasks Y in three + three minutes. </strong>(This has been copied-and-pasted from Cedric Beust&#8217;s <a target="_blank" href="http://beust.com/weblog/">blog</a>).<strong><br />
</strong>As you can imagine this is a pretty bad arrangement: at best it just displays that you don`t know your workforce well and you end up assigning tasks to the wrong persons, at worst you end up hiding deficiencies in your workforce: one person`s deficiencies could be hidden by its pair and you could end up assuming that each person of the pair reflects that pair`s capabilities. A pretty bad assumption.</p>
<p>All in all, pair programming is another software development practice that smacks of despair. I end this post here under the constraint of time. As you can imagine there is a lot more to be said about this practice, but I don`t have the time.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/10/08/pair-programming/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Iterations vs. Waterfalls</title>
		<link>http://microintellia.com/blog/2007/10/04/iterations-vs-waterfalls/</link>
		<comments>http://microintellia.com/blog/2007/10/04/iterations-vs-waterfalls/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 13:48:27 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/10/04/iterations-vs-waterfalls/</guid>
		<description><![CDATA[I don&#8217;t have time to carefully write this so I&#8217;ll just give a few thoughts on this apparent contradiction:
Waterfall was the main way to produce software, actually to code it, because the requirements didn&#8217;t change. A marketing team was going out, analyzing the market, coming out with target user and its needs and was sending [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t have time to carefully write this so I&#8217;ll just give a few thoughts on this apparent contradiction:<br />
Waterfall was the main way to produce software, actually to code it, because the requirements didn&#8217;t change. A marketing team was going out, analyzing the market, coming out with target user and its needs and was sending this down to the software development department who would implement it. There was no need for iterations because nothing was going to change. However, if you think about it, iterative processes were probably used in the marketing department in order to define the target user (you needed to keep on refining the target user with each batch of data that came in).</p>
<p>Iterations are mostly needed for dealing with uncertainties and change. They avoid costly and risky investments. Being able to deal with uncertainties opened the door to a greater interaction between the software developers and their customers, in some cases the software developers working with their customers at the company department level (a B2C software developer would work with the procurement department of a customer, a document management software developer would work with the HR department of the same company, etc&#8230;).<br />
The main change in software development was the change in the way software is distributed, via the web with very low distribution costs. Once these distributions costs went down it made sense to create customized versions of your product and distribute it to a larger set of customers, rather than to the &#8220;target&#8221; customer. A shrink-wrapped software package could not be sold to 25 different types of customers each customer being able to demand its own needs.</p>
<p>After the distribution costs went down customization costs went down: you needed to customize an application easily and reliably. Abstraction played a big part in this.</p>
<p>Around the time the waterfall model started to crack at its seams and software development started to move towards iterations a transition from products (targeting only one type of customer) to services (targeting multiple and very different types of customers) appeared. Again, my opinion is that transition is due to the change in the way software is distributed and to the fact that you could customize it more easily than before.</p>
<p>My opinion is that there is not a fundamental contradiction between the waterfall model and the iterative models, they are 2 different ways of creating software which spun out of different environments.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> These practices are not actually mutually exclusive, they can be used by the same team on approximately the same project. A while ago when I was working for an ASP we had to re-write our B2B application, this decision was reached after a lot of study. We went over all our customers that were using our previous B2B app, we looked at all their requirements, all their needs, the way we implemented them and we created an abstraction of our application that was targetting 70-80% of the needs of our customers. This, along with the default implementation, took about a month and it falls pretty well within the waterfall model and the dreaded <a target="_blank" href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">Big Design Up Front</a>. Next, however, we changed the way we continued developing the application: we did small incremental changes as we interacted with our future customers and as we got more information about their needs. Creating the skeleton of the application could be done in the waterfall model: we had data to analyze (the data was our customer`s requirements), to model and to code. However, when dealing with our future customers we had no such data (we needed to extract it from the customers) so it made a lot of sense to switch to iterations.<br />
As I said above, I believe that iterations work well with uncertainty and change.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/10/04/iterations-vs-waterfalls/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rest in peace Pavarotti</title>
		<link>http://microintellia.com/blog/2007/09/07/rest-in-peace-pavarotti/</link>
		<comments>http://microintellia.com/blog/2007/09/07/rest-in-peace-pavarotti/#comments</comments>
		<pubDate>Fri, 07 Sep 2007 14:02:06 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/09/07/rest-in-peace-pavarotti/</guid>
		<description><![CDATA[The great tenor passed away on September 6 2007. A sad day&#8230;
]]></description>
			<content:encoded><![CDATA[<p>The great tenor passed away on September 6 2007. A sad day&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/09/07/rest-in-peace-pavarotti/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RMS on copyright protection</title>
		<link>http://microintellia.com/blog/2007/08/02/rms-on-copyright-protection/</link>
		<comments>http://microintellia.com/blog/2007/08/02/rms-on-copyright-protection/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 15:39:40 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/08/02/rms-on-copyright-protection/</guid>
		<description><![CDATA[I was reading the transcript that of a talk that RMS gave on copyright protection at U of Waterloo when I came across these 2 paragraphs:
THere are four essential freedoms that users should have: freedom zero is the freedom to run the program as you wish (there are programs that don&#8217;t even give you that [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading the <a href="http://slashdot.org/articles/07/07/20/055206.shtml" target="_blank">transcript</a> that of a talk that RMS gave on copyright protection at U of Waterloo when I came across these 2 paragraphs:</p>
<p><em>THere are four essential freedoms that users should have: freedom zero is the freedom to run the program as you wish (there are programs that don&#8217;t even give you that much freedom). Freedom 1 is the freedom to study the source code of the program and then change it to make it do what you wish, instead of what the developer chose to impose on you. Freedom 2 is the freedom to help your neighbor. That&#8217;s the freedom to distribute exact copies to others when you wish, up to and including republication. And freedom three is the freedom to contribute to your community. That&#8217;s the freedom to distribute copies of your modified versions, when you wish. Up to and including publication. With these four freedoms, the users are in control, both individually and collectively. </em></p>
<p><em>What about freedom two, the freedom to copy the object and hand out copies. Well, there are no copiers for physical objects, so that&#8217;s totally meaningless. In science fiction in some cases, people have imaginged the idea of duplicators for physical objects. Like you could imaging a car copier. Imagine that I - imagine I had a car, and I parked it somewhere. <strong>I wouldn&#8217;t mind if somebody walked up carrying his car copier and plugged one end into my car and out the drew a duplicate car - with a different lock, I hope - and then he could pick up his copier, unlock his car, and drive away, and I wouldn&#8217;t even notice because by car would be unchanged. Why not? However, as a realistic question, it doesn&#8217;t exist</strong>. And likewise for freedom three, the freedom to copy your modified versions and hand out copies. Well, to some extent you can modify a car, and people do, but there are no copiers to copy you modified car with. That&#8217;s not the way cars are made, anyway. They&#8217;re not made by copiers, nobody has a copier. So this question &#8220;should hardware be free&#8221; is a - is a silly wiseguy question.</em></p>
<p>RMS should probably know that you can copy cars and that <a href="http://www.businessweek.com/globalbiz/content/aug2007/gb20070828_812093.htm?campaign_id=rss_topEmailedStories" target="_blank">cars are copied</a> ferociously (more often than not in China which among other things has very weak laws protecting IP) and that is a pretty big problem (the knock-off industry makes billions of dollars every year copying everything from cars to Gucci sun-glasses to medecine). You obviously will not copy the car thru a device, but rather thru a business process and what you copu is not the car, but its design (another type of intelectual property that RMS doesn`t seem to care about). RMS seems pretty much out of tune with the real world, he seems stuck in a world long gone. I do understand that issues that the current connectivity (bittorrent and the like) poses to artists, publishers and etc&#8230; and I understand that DRM is pretty much a bad technology trying to set-up defenses against file sharing, but I don`t understand why some thesis pioneered at MIT in the 60`s should have any effect right now. RMS has its GNU, he should be happy about it and let the world turn. It does so anyway.</p>
<p>Open-source is currently being used today mostly to create resource-pools dedicated to commodity software which happens to be mostly infrastructure (operating systems, databases, ESBs, etc&#8230;), this is pretty much what open source has morphed into. It`s nothing near the ideals pioneered by some people in the 60`s (including RMS), more often than not it is all about corporate partnerships. Open source has stopped being led by ideological reasons (the famous free as in freedom) in order to be led by economic reasons (free as in beer).</p>
<p>I`m off to the holidays!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/08/02/rms-on-copyright-protection/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Scripting vs UI-based management consoles</title>
		<link>http://microintellia.com/blog/2007/07/31/scripting-vs-ui-based-management-consoles/</link>
		<comments>http://microintellia.com/blog/2007/07/31/scripting-vs-ui-based-management-consoles/#comments</comments>
		<pubDate>Tue, 31 Jul 2007 00:50:33 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/07/31/scripting-vs-ui-based-management-consoles/</guid>
		<description><![CDATA[You are probably familiar with various management consoles that various application servers provide you with in order to manage your application. The problems that these UI consoles have are the problems that any UI has once the number of features starts to grow: they simply run out of space (most of the time the space [...]]]></description>
			<content:encoded><![CDATA[<p>You are probably familiar with various management consoles that various application servers provide you with in order to manage your application. The problems that these UI consoles have are the problems that any UI has once the number of features starts to grow: they simply run out of space (most of the time the space available for displaying your app server console is a web page which is fixed in size). If you ever looked at Weblogic 10`s management console you probably noticed the 3-level menus that are trying to lock a developer onto the feature they need to change. Well, as I was saying in a <a target="_blank" href="/blog/2006/08/01/interacting-with-users/">previous post</a>, this approach doesn`t scale because you will be running out of space. I wonder when will Weblogic`s management console have 7-level menus given the speed at which features are getting added to app servers.</p>
<p>One other problem that the an UI management console puts forward is that it makes a developer (a person that usually is fluent in a few scripting languages) use a UI which is wasteful. It is wasteful because it wastes one of your most precious resources: the fact that your developer is a developer and that developers are familiar with scripts. UI solutions reduce your developer to the level of an ordinary user whose knowledge about an app server is reduced to the knowledge of various entities managed by your app server (servers, connection pools, datasources, applications, JMS queues, etc&#8230;) and the knowledge of clicking along. A developer would probably be more productive if it could take a look at its operational environment, determine various tasks which occur often and script up a solution to solving these tasks rather than clicking away. This is a lot better when you are perfoming composite tasks like adding a connection pool, exposing it thru a data source, adding this datasource to various servers and re-starting the servers to load the datasource. It makes a lot more sense to put up a script solution if you have to carry out these tasks across a cluster for the simple reason that you may forget to carry out a task for servers (or worse, for a series of servers).</p>
<p>Another problem with UI management consoles is that the error factor is higher: it is possible to click on the wrong button - `Do you really want me to shut down this server?` - and that it takes a long time to carry out a task. This it the problem with humans, they are slow and error-prone.</p>
<p>Now a bit about the languages used for creating management scripts. Given that most of the tasks that would be scripted are variations on the same theme (repetition occurs pretty often when you are managing servers) it would make sense to use a language in which you could define templates easily. An OO language (such as Ruby) would probably make a lot of sense. ant is good (and Weblogic lets you admin your app server thru ant tasks) but ant can only go so much.</p>
<p>One last advice that I would have would be to avoid duplication of scripts. I am saying this because Weblogic lets you create scripts for managing your server both in Python and in ant. You should avoid duplication and settle for one language.</p>
<p>Moving from an UI-based management console to managing your app servers thru scripts is a pretty dangerous task. If you are not careful and don`t plan this move well you may end up with a lot more problems. Think about managing your servers thru scripts as of programming your operational environment, the same problems that programming poses will arise <strong>in managing your <u>operational environment</u></strong>. Bloat-ware, feature-creep. code duplication, etc&#8230; may rise to haunt the way you manage your app servers if you don&#8217;t write your scripts carefully. You would be well advised to try to do your best to avoid such problems, because they are very hard to solve once they appear.<br />
What makes them `coding` your environment very hard to solve is that the stakes are a lot higher in this case than for your typical code blunders: <strong>your operational environment will depend on the way you `coded` it and the costs of refactoring these management scripts are huge</strong>: your entire cluster could go down if you are not too careful. A developer with a lot of experience would probably be needed to supervise this exercise.<br />
<a href="http://microintellia.com/blog/#">P.S.</a> It would probably not be a bad idea if in addition to providing a JMX interface to your application for managing your application, a JMX interface that can be displayed in an app server`s management console, you could also provide an ant task which would carry out the same operation on the application deployed on the app server remotely. I am not sure if this is actually possible (I think that one good solution would be the app server exposing the JMX interface thru an ant task) but it would be pretty nifty.</p>
<p><a href="http://microintellia.com/blog/#">P.P.S</a> I wrote this post because I had nothing better to do. Take it with a ton of salt.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/07/31/scripting-vs-ui-based-management-consoles/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java and dynamic languages</title>
		<link>http://microintellia.com/blog/2007/07/04/java-and-dynamic-languages/</link>
		<comments>http://microintellia.com/blog/2007/07/04/java-and-dynamic-languages/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 18:09:10 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/07/04/java-and-dynamic-languages/</guid>
		<description><![CDATA[I was watching this presentation by Rod Johnson on infoq when I came across the part when Rod Johnson started talking about using dynamic languages in a Java application. The main reason that he gave for using dynamic languages in a Java app was that due to pushing the core business logic into domain objects [...]]]></description>
			<content:encoded><![CDATA[<p>I was watching <a href="http://www.infoq.com/presentations/rod-johnson-are-we-there-yet" target="_blank">this presentation</a> by Rod Johnson on infoq when I came across the part when Rod Johnson started talking about using dynamic languages in a Java application. The main reason that he gave for using dynamic languages in a Java app was that due to pushing the core business logic into domain objects the service layer becomes very thin, &#8220;script-like&#8221; as he called it. Rod saw an advantage of using dynamic languages (DLs) in implementing the service layer as a series of scripts, I  interpret his take correctly.<br />
This is an interesting proposition. I find it a bit off-the-wall and at the same time very timid, which is telling about how DLs are currently treated in the Java world. There is a bit of fear about using DLs, stemming mainly from the lack of exposure to them, like working with any other thing that you do not know you are bound to make mistakes and the fear that getting too involved with DLs may cause some very costly mistakes is present. At the same time you fear being left behind while the rest of the computing environment embarks on these popular DLs, you may be missing out on the next great thing (BTW, the next great thing is very rare). This could sum up the attitude that Java developers have towards DLs: DLs are pretty interesting things, too bad I don&#8217;t know how to work with them.<br />
I decided to write this post in order to correct a misconception that most of the people writing about DLs have: that DLs are all about capabilities which are encapsulated in a language. I think that DLs are about their capabilities, but, just as importantly, about the workforce coding in such DLs and I find that scripting example put forward by Rod Johnson fits this statement.</p>
<p>One big problem that using a DL in a Java application is the exposure that the developers using it had to that DL. You will find that most developers will absorb a foreign language only so much, and will tend not to get too deep into it unless it applies heavily to their tasks. You will also find that getting to know well a DL requires quite a lot of effort, effort that most developers are not willing to put in. The correct use of a DL being related to the exposure to that DL it follows that you cannot really use a DL&#8217;s more sophisticated features and that you will also try to avoid developing complex constructs in a DL. The scripting example becomes very telling right now, because scripts are nimble little things which do a very small and simple task, I would say that this type of tasks can be coded by a regular Java developer in a language that it cannot master completely. I would even venture to say that because of high costs of adopting a DL DLs will never get beyond simple nimble things in the Java world. I am not so sure about coding the service layer in scripts though. Will the service layer dwindle in complexity to the point where you could script it up? I am not so sure, time will tell.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> The costs for adopting a DL are the costs of adopting any language, in particular a domain-specific language (DSL). These costs are roll-back costs (you cannot roll-back a language out of an application so easily), training costs (the work-force needs to be trained in this language) and human resources costs (if you happen to choose a language which is not considered cool anymore you may end up having recruitment problems, who wants to work on something perceived as a dinosaur?)</p>
<p>This would explain why developers have the same reaction to DSLs as they have to DLs: a bit of fear laced with excitement.</p>
<p><a href="http://microintellia.com/blog/#">P.S. 2</a> I wrote this post in a hurry, I think it shows thru.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> It would be interesting to see that now with scripting languages moving into JEE applications whether JEE applications will be used by developers using scripting languages. If Rod was right in his assumption that the service layer could be script-ed up it is conceivable that a Java app could be picked by a Ruby shop that would modify its service layer as it fits its needs.  I don&#8217;t see this happening because the Ruby people would have minimal control over the app in this case (in this scenario they would have control only over the service layer, even though in theory it is possible to plug Ruby business logic beans into the original Java app via Spring) and because it would require that the Ruby team has some exposure to a Java application deployment environment (Spring files, etc&#8230;). Again, it requires that a set of developers (Ruby developers in this case) has some exposure to the other language and environment (the Java application) with all the problems that this implies.<br />
<a href="http://microintellia.com/blog/#">Later Edit 2:</a> Today I read about an interesting case of scripting: <a href="http://www.infoq.com/news/2007/07/jruby-gui-apis" target="_blank">JRuby GUI APIs</a>. What I find interesting about coding GUI in Ruby is the fact that it lowers the barrier of entry to coding them to scripting, a coding style that is much closer to a graphic designer than your typical Swing event handlers. Who knows, maybe the future desktop designers will grok JRuby&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/07/04/java-and-dynamic-languages/feed/</wfw:commentRss>
		</item>
		<item>
		<title>When to use business-logic aspects?</title>
		<link>http://microintellia.com/blog/2007/06/28/when-to-use-business-logic-aspects/</link>
		<comments>http://microintellia.com/blog/2007/06/28/when-to-use-business-logic-aspects/#comments</comments>
		<pubDate>Thu, 28 Jun 2007 02:44:20 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[AOP]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/06/28/when-to-use-business-logic-aspects/</guid>
		<description><![CDATA[I was reading this post on infoq about applying AOP for implementing business logic transparently. It was a pretty good example (actually the author displayed a very interesting way of consolidating a series of different business concerns into a general advice using a Map of Command objects), but what caught my attention was a comment at the [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a href="http://www.infoq.com/articles/dynamic-routing-using-spring" target="_blank">post</a> on infoq about applying AOP for implementing business logic transparently. It was a pretty good example (actually the author displayed a very interesting way of consolidating a series of different business concerns into a general advice using a Map of Command objects), but what caught my attention was a comment at the end of the post:<br />
<span id="quote_7949"><em>It always surprises me to see how much code people actually place within the AOP advice creating an architectural dependency on AOP that makes it impossible to reuse in another context such as an explicit programmatic interface. I personally prefer to use AOP (or interceptors) as bridges or adaptors from one domain/layer/tier to another domain/layer/tier. I normally start with creating the underlying system divorced of AOP concerns and then add AOP into the mix to alleviate the coding effort and simplifying the programming model for typical extension use cases. I always ensure that it is possible to use an particular feature without the presence of a particular framework or instrumentation runtime.<br />
</em></span><br />
The reader had a pretty good point: you can use decorators<a href="http://microintellia.com/blog/#">*</a> for implementing this business logic. So when would you use AOP? I would use for implementing business logic concerns if they are cross-cutting concerns, if they apply widely across the code-base. In the above example the advice was a notification module that was sending an email when the user was registering. If you would have needed to send a notification when the user was purchasing an item, when an item was shipped to the user, etc&#8230; you would have a cross-cutting concern (a business logic concern) that needs to be applied transparently to the application. Another example when I would use AOP is for transient concerns, for concerns that should not modify the code base but that need to be implemented.<br />
Business logic advices come with management costs (you have a piece of business logic detached from your code-base, you have to manage that). Implementing interceptors thru decorators come with coding costs (you usually need to create a new class). One should look at these costs and determine which approach is more cost-effective. As always, use AOP only for binding components together, the business logic advice should contain no business logic at all, but simply logic for binding a business logic bean (the notification module in the above example) to a different bean. I am not sure if the example followed this approach, though.</p>
<p><a href="http://microintellia.com/blog/#">*</a> AOP can be thought of as decoratoring unleashed, an advice applied to a class is a decorator.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/06/28/when-to-use-business-logic-aspects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Le fin d&#8217;un blogue</title>
		<link>http://microintellia.com/blog/2007/06/21/la-mort-dun-blogue/</link>
		<comments>http://microintellia.com/blog/2007/06/21/la-mort-dun-blogue/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 17:54:10 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/06/21/la-mort-dun-blogue/</guid>
		<description><![CDATA[Une des blogues les plus connus dans le 514 vient de s&#8217;éteindre. C&#8217;est dommage, il etait un de mes favorits.
]]></description>
			<content:encoded><![CDATA[<p>Une des blogues les plus connus dans le 514 vient de s&#8217;<a href="http://piette.blogspot.com/2007/06/hell-of-ride.html">éteindre</a>. C&#8217;est dommage, il etait un de mes favorits.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/06/21/la-mort-dun-blogue/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REST and WS - part 4 (or when REST turns ideological)</title>
		<link>http://microintellia.com/blog/2007/06/21/rest-and-ws-part-4-or-when-rest-turns-ideological/</link>
		<comments>http://microintellia.com/blog/2007/06/21/rest-and-ws-part-4-or-when-rest-turns-ideological/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 00:29:59 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/06/21/rest-and-ws-part-4-or-when-rest-turns-ideological/</guid>
		<description><![CDATA[I was reading this post about writing complex applications REST-style and all seemed pretty well till I came across this business logic method wrapped up as a DELETE HTTP method:


/{acct_id}/open_orders/{order_id}
DELETE
orders
delete
cancelOrder


Mapping a CRUD method to a business method is a pretty bad thing, if anything the service which gets exposed REST-style should have very clear URL-to-business [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a target="_blank" href="http://bitworking.org/news/201/RESTify-DayTrader">post</a> about writing complex applications REST-style and all seemed pretty well till I came across this business logic method wrapped up as a DELETE HTTP method:</p>
<table border="1">
<tr>
<td>/{acct_id}/open_orders/{order_id}</td>
<td>DELETE</td>
<td>orders</td>
<td>delete</td>
<td>cancelOrder</td>
</tr>
</table>
<p>Mapping a CRUD method to a business method is a pretty bad thing, if anything the service which gets exposed REST-style should have very clear URL-to-business method mappings. It is pretty bad when you advertise one thing and when you do another. Using CRUD methods masquerading as business methods is pushing round pegs into square holes, if anything it obfuscates the contract that the REST-talking application has with the outside world.<br />
Another bad thing with using CRUD methods for implementing business logic operations is that it seems that you run out of options due to the poverty of the REST syntax coming from the limited number of HTTP operations that it maps to. From what I see you can only do 4 methods on an order GET,POST,PUT and DELETE. What should I do if I want to partially commit my order (send my order to a another trader that will fulfill it)? DELETE is taken, it cancels an order, what other method in the HTTP protocol should I use REST-style in order to signal the server that I need to partially commit an order?<br />
REST is pretty limited as far as I see it and I see it fit only for CRUD methods. You can tout all over the place that it scales to Internet-size but fact is 4 CRUD operations do not scale to complex interactions. You can do pretty much everything using those 4 operations by twisting your domain to fit your impoverished environment, but you can do the same thing in COBOL, Fortran, etc&#8230;</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> You could have probably implement the cancel order method REST-style by creating a new URL on which you would cancel an order thru a PUT operation like below:</p>
<table border="1">
<tr>
<td>/{acct_id}/<strong>cancel_orders</strong>/{order_id}</td>
<td><strong>PUT</strong></td>
<td>orders</td>
<td>create</td>
<td>cancelOrder</td>
</tr>
</table>
<p>But the problem still remains: you are trying to express a business contract using CRUD methods. Pushing round pegs into square holes&#8230;</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a>  When you remote an application the contract that this application exposes should be crystal clear. Having CRUD operations masquerade as business logic operations obfuscates this contract.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/06/21/rest-and-ws-part-4-or-when-rest-turns-ideological/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Econo-computing</title>
		<link>http://microintellia.com/blog/2007/06/20/econo-computing/</link>
		<comments>http://microintellia.com/blog/2007/06/20/econo-computing/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 14:11:47 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/06/20/econo-computing/</guid>
		<description><![CDATA[It looks like there are other people trying to use economic concepts for describing software development. Pretty cool&#8230;
]]></description>
			<content:encoded><![CDATA[<p>It <a target="_blank" href="http://martinfowler.com/bliki/DesignStaminaHypothesis.html">looks</a> <a target="_blank" href="http://martinfowler.com/bliki/TechnicalDebt.html">like</a> there are other people trying to use economic concepts for describing software development. Pretty cool&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/06/20/econo-computing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transparent development - one example</title>
		<link>http://microintellia.com/blog/2007/06/19/transparent-development-one-example/</link>
		<comments>http://microintellia.com/blog/2007/06/19/transparent-development-one-example/#comments</comments>
		<pubDate>Tue, 19 Jun 2007 23:29:45 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/06/19/transparent-development-one-example/</guid>
		<description><![CDATA[A while ago I wrote about transparent development - a way to develop software that implements new business logic in a code base while making minimal, if any, changes to the existing code. I wrote about this primarily because I am working with legacy systems and making a change in this systems usually carry a [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I wrote about transparent development - a way to develop software that implements new business logic in a code base while making minimal, if any, changes to the existing code. I wrote about this primarily because I am working with legacy systems and making a change in this systems usually carry a pretty big cost. As a side note, a while ago I also wrote about the lack of literature in dealing with legacy systems. Design patterns for wokring on a legacy application anyone?</p>
<p>Anyway, my previous post was pretty theoretical, if anything, so I decided to provide an example of transparent development. My intention is to identify best practices that allow a developer to implement a new piece of business logic while making very small changes to the original code.<br />
So this is the first post in this category (I hope more will follow). The example that I want to give is the following:<br />
Suppose that you have a sequence of steps that is being widely used and that you need to modify this sequence only for a very small concern, how would you go about it. This is the example:<br />
You have class <strong>AbstractTaxService</strong> that among other things implements the method <em>prepareTradeForTax</em>. This method is the sequence that I was talking about:<br />
public class AbstractTaxService{</p>
<blockquote><p>public method prepareTradeForTax(Trade trade){</p></blockquote>
<blockquote>
<blockquote><p>initTaxService()<br />
initTradeForTax()<br />
enrichTrade(trade)<br />
transformTradeToTaxFormat() // this will transform the trade in a format that the tax service understands</p></blockquote>
<p>}</p></blockquote>
<p>}<br />
<strong>AbstractTaxService</strong> has 3 sub-classes that use the method <em>prepareTradeForTax</em> and which expand on it: <strong>CommodityTaxService</strong> which taxes commodity trades, <strong>EquityTaxService</strong> which taxes equity trades and <strong>FITaxService</strong> which taxes fixed income trades. Each one uses the <em>prepareTradeForTax </em>method as below:<br />
public class CommodityTaxService{</p>
<blockquote><p>public method prepareForTax(Trade trade){</p>
<blockquote><p>super.prepareForTax(trade); // call the method in the super class<br />
notifyCommodityTradeSource(trade); // will notify the source of the commodity trade that a trade is about to get taxed</p></blockquote>
<p>}</p></blockquote>
<p>}<br />
public class EquityTaxService{</p>
<blockquote><p>public method prepareForTax(Trade trade){</p>
<blockquote><p>super.prepareForTax(trade); // call the method in the super class<br />
notifyEquityTradeSource(trade); // will notify the source of the equity trade that a trade is about to get taxed</p></blockquote>
<p>}</p></blockquote>
<p>}<br />
public class FITaxService{</p>
<blockquote><p>// doesn`t override the method</p></blockquote>
<p>}<br />
All is well, the system has been running for a few months when this requirement comes in:<br />
The FITaxService needs to call a  new method <em>enrichFITrade</em> before <em>transformTradeToTaxFormat</em> and after <em>enrichTrade</em> for a particular trade type. Oops. The sequence gets broken. The ugliest fix would be to copy and paste <strong>AbstractTaxService</strong> prepareForTax in FITaxService. Another fix would be to touch-up the original <strong>AbstractTaxService</strong> <em>prepareForTax</em> so that it calls only <em>initTaxService</em> and <em>initTradeForTax</em> and then change <strong>CommodityTaxService</strong>, <strong>EquityTaxService</strong> and <strong>FITaxService</strong> so that they will call the method <em>transformTradeToTaxFormat</em> in their versions of <em>prepareForTax</em>. But this is ugly, it requires massive changes and massive regression testing.</p>
<p>You would like to change nothing in the above configuration and yet somehow implement this new sequence in <strong>FITaxService</strong>. One transparent implementation would be the following:<br />
Sub-class <strong>AbstractTaxService</strong> with <strong>FlexibleAbstractTaxService</strong>, a class that implements a flexible sequence of steps for preparing the tax trade. Have <strong>FITaxService</strong> extend <strong>FlexibleAbstractTaxService</strong> and use it in order to implement the new sequence of steps:<br />
public class FlexibleAbstractTaxService extends AbstractTaxService{</p>
<blockquote><p>protected String[] taxPrepareSequence = null;<br />
public prepareForTax(Trade trade){</p>
<blockquote><p>if(taxPrepareSequence == null)<br />
super.prepareForTax(trade)<br />
else<br />
for(int i = 0; i < taxPrepareSequence.length; i++){</p>
<p>// go thru the sequence and execute methods using reflection</p>
<p>}</p></blockquote>
<p>}</p></blockquote>
<p>}<br />
The new <strong>FITaxService</strong> is re-coded as follows:<br />
public class FITaxService extends FlexibleAbstractTaxService {</p>
<blockquote><p>public prepareForTax(Trade trade){<br />
if(trade.isSpecial()){</p>
<blockquote dir="ltr" style="margin-right: 0px"><p>// prepare the sequence for handling this special trade</p>
<p>taxPrepareSequence = new String[]{`initTaxService`, `initTradeForTax`, `enrichTrade`, `enrichFITrade`, `transformTradeToTaxFormat`};</p></blockquote>
<p dir="ltr"> }</p>
</blockquote>
<blockquote><p>super.prepareForTax();</p>
<p>}</p></blockquote>
<p>}</p>
<p>This way not much has been changed and the new requirement has been implemented transparently.</p>
<p>Some caveats about using this method: it is pretty expensive since it creates a new class, a pretty expensive operation. It would be a good thing if this new class would be flexible enough to cover future requirements, if anything it should be built with this in mind. Also, care should be taken, since this approach creates new classes it could be considered prone to class mushrooming.<br />
The cost of this approach (creating a new class) should outweight the costs of other methods (building up a battery of regression tests in order to determine if the changes in multiple classes have not had a bad effect on their functionality) if this approach is to be taken.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> Lately I have started to look at sub-classes as though they ar decorators which you can use in order to implement behavior while minimizing the changes done to a code-base. These decorators carry a cost (sub-classing which requires a new class) that should be minimized.</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/06/19/transparent-development-one-example/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REST and WS - part 3</title>
		<link>http://microintellia.com/blog/2007/06/01/rest-and-ws-part-3/</link>
		<comments>http://microintellia.com/blog/2007/06/01/rest-and-ws-part-3/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 14:26:55 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/06/01/rest-and-ws-part-3/</guid>
		<description><![CDATA[I was reading this article on infoq about REST winning in front of WS. Rather than REST gaining ground I see this as a split in software development environments. The fact that Amazon, eBay, etc&#8230; are using REST doesn&#8217;t validate REST as a technology, it simply opens up Amazon&#8217;s IT infrastructure to a group of [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a target="_blank" href="http://www.infoq.com/news/2007/05/is-rest-winning">article</a> on infoq about REST winning in front of WS. Rather than REST gaining ground I see this as a split in software development environments. The fact that Amazon, eBay, etc&#8230; are using REST doesn&#8217;t validate REST as a technology, it simply opens up Amazon&#8217;s IT infrastructure to a group of people that cannot/don&#8217;t want to use WS. This group of people is made up of PHP coders, PERL hackers, possibly Ruby and Python developers. This group of people doesn&#8217;t use WS, they are not even present in the WS specification process, they tend to ignore it. I am not sure about the reasons for this attitude, it has to do a bit with lack of resources and a decentralized decision making environment (I am not sure that the PHP or Python community can be a part of the WS process, these communities are usually not part of standard bodies <a href="http://microintellia.com/blog/#">*</a>), a bit with the fact that the apps they are working on don`t need WS capabilities (I`d be surprised if your typical PHP bulletin board needs transparent security certificates exchange or long-running transactions) and probably a bit more with ideology. REST is remoting for small, LAMP, webby applications, WS is remoting for enterprise applications and their differences are the result of different needs and resources dedicated to these needs rather than some fundamental difference in architetural styles.<br />
So rather than seeing this shift in REST and WS usage as a validation or invalidation of one style or another I see it as as split in the development environments. WS will very likely be confined to JEE and C#, basically it will be used for enterprise development and communication within this environment. REST will be used for deployments facing heterogeneous clients since REST is adopted and accepted by pretty much all the hackers/coders out there (if a PHP guy can agree with a Python guy on something is that REST is good and WS is bad).<br />
So applications will be remoted differently based on the client to which you are exposing your application. If this split will do anything it will make the remoting of an application a process de-coupled from the application itself and coupled more to the remoting environment (REST/WS/RMI, etc&#8230;).</p>
<p>Remoting an application should be thought from now on as a transparent process which should be applied to an application transparently. This should have been done anyway, but the REST/WS split probably brings the point home a lot harder.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> There is a big architectural difference between REST and WS, namely REST deals mostly with exposing state and its associated operations (CRUD) while WS deals mostly with exposing business logic. If I am correct REST can be thought of as a way to remote the data-layer, while WS as a way to remote the business logic. With REST the business logic layer is to developed on the client side, while WS gives it up-front. I think this is a pretty serious limitation of REST, the fact that you have to re-code the business logic in different environments is an effort which is not to be underestimated. But with REST you have control over your business logic and the possibilities for mashing up a different client are greatly enhanced.<br />
WS can also remote the data layer, it would treat the data layer as another business concern that has to be exposed, so in this respect WS is more powerful than REST (it can implement REST-specific functionality if it wants to).<br />
Again, the split between REST and WS is a split in development environments due to various market forces playing out in the IT landscape and not a debate about the efficiency of one style vs the other.</p>
<p><a href="http://microintellia.com/blog/#">*</a> I wonder if the famous <em>get</em> method of the REST architecture is symbolic of the relationships in these communities, it appears as though the Perl/PHP/Python communities can agree only on the lowest-common denominator. How more common and generic can you get than <em>get</em>?</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/06/01/rest-and-ws-part-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Event driven architecture</title>
		<link>http://microintellia.com/blog/2007/05/29/event-driven-architecture/</link>
		<comments>http://microintellia.com/blog/2007/05/29/event-driven-architecture/#comments</comments>
		<pubDate>Tue, 29 May 2007 21:01:41 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/29/event-driven-architecture/</guid>
		<description><![CDATA[One interesting development is the appearance (re-appearance?) of EDAs and the traction they are gaining in the developers mind-share. I see the interest in EDA to be an extension of the interest in asynchronous processing, EDA is asynchronous processing taken to a higher level. It is interesting because it is a pretty novel technology which [...]]]></description>
			<content:encoded><![CDATA[<p>One interesting development is the appearance (re-appearance?) of EDAs and the traction they are gaining in the developers mind-share. I see the interest in EDA to be an extension of the interest in asynchronous processing, EDA is asynchronous processing taken to a higher level. It is interesting because it is a pretty novel technology which (as far as I know) has not been tested in large scale systems (large scale in terms of number of nodes which receive and process events). So far the examples which are given out on sites such as infoq are toys and I find this very telling for the level of adoption on this architectural style.<br />
Nevertheless, the concept is bubbling all over the place and the seeds for the next architectural atrocities and miserable failures are being sown right now: posts such as <a target="_blank" href="http://www.infoq.com/news/2007/05/event-patterns">this</a> are already advocating &#8220;event patterns&#8221;. Event patterns is a pretty pompous name for an architectural construct which appears to be in process of development right now. You need a bit of experience before starting to lay out some guidelines and a few EDA applications don&#8217;t give you this. Let&#8217;s wait a few more years and see something emerge. The famous GoF design patterns were written quite a few years after C++ became widely used, I&#8217;d say we should take the same approach for events.</p>
<p>So far I see events being used either as gateways into larger applications or the infrastructure for implementing simple, one-way, non-circular work-flows. In the infoq example the main hard problem resolved around circular flows: a parent sends a message to a child which sends it back to the parent which sends it again to the child. The solution advocated was pretty simplistic, if I remember the presenter suggested keeping track of the nodes a message has visited and do something in case it is visiting the same node twice, probably inserting the messages in an envelope which gets sent from node to node, hopefully in a transparent manner that would allow for different algorithm for detecting and resolving circular flows depending on the nature of the application using EDA.</p>
<p>Applications using event-driven-architectures are essentially message-passing applications and fall pretty easily within the distributed computing domain. Distributed computing problems are very hard problems and the interactions between distributed components are pretty hard to follow. I don&#8217;t think that we are currently in a position to use EDAs on a large scale because I don&#8217;t see the modeling tools and frameworks that could solve the hard problems invariably generated by a large number of nodes passing messages to one another (mind you, this need could be turned into a business case). However, most of the world would beg to differ: take a look at the example given <a target="_blank" href="http://www.ebizq.net/topics/bpm/features/8077.html?page=2">here</a>. It is pretty interesting to see a problem being solved by slapping the tag EDA on it. The article brings together a complex web of interactions, states EDA and assumes that this solves the problem.</p>
<p>Another problem that I see with EDA is the fact that you couple systems indirectly. With EDA you need the whole picture of the systems, you cannot really say that you will send a message to a system thru a web-service and you finished with it, it is possible that this system will get back to you in such a way as to create a circular flow. Given the fact that this flow spans different systems it could be very hard to implement algorithms that would detect the fact that a message has been sent multiple times because of a circular flow (such as in the infoq example. In the infoq example you could implement such a detection mechanism because you had control over the whole system). This scenario should be considered when implementing inter-system flows.</p>
<p>So I would conclude this post by saying that for the time being EDA is a technology which is at its beginnings and, as a result of it, which has a lot more fluff than stuff. It may evolve into something bigger in time, but it poses very hard problems once the number of nodes involved in a particular event chain increases. Also, as far as I am aware, there are not good modeling tools that can be used for applying EDA on a large scale.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> From <a target="_blank" href="http://www.regdeveloper.co.uk/2007/06/25/tibco_buys_spotfire/">this article</a> it sounds like TIBCO (a well-established distributed computing vendor) offers a solution called BusinessEvents for event processing. Judging from a podcast with some guy from TIBCO I would not be surprised if it turns out a pretty good product.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> With Complex Event Processing and Event Stream Processing it looks like the industry is moving towards processing event streams at a single point in a network rather than trying to manage the events at the level of the whole network. Maybe this is what is needed by the market. It is also part of the push towards asynchronous processing that we are witnessing. Maybe I was too harsh on it&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/29/event-driven-architecture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Complexity in customization and its effects on application support</title>
		<link>http://microintellia.com/blog/2007/05/25/complexity-in-customization-and-its-effects-on-application-support/</link>
		<comments>http://microintellia.com/blog/2007/05/25/complexity-in-customization-and-its-effects-on-application-support/#comments</comments>
		<pubDate>Fri, 25 May 2007 15:33:44 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/25/complexity-in-customization-and-its-effects-on-application-support/</guid>
		<description><![CDATA[Sometimes your application requires customization which is quite complex. This would be an example:
Suppose that you have a B2C application which is selling shoes. The business decides that in order to promote business in New York the app should detect users from NY and give a 15% rebate to these users. Also the app should [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes your application requires customization which is quite complex. This would be an example:<br />
Suppose that you have a B2C application which is selling shoes. The business decides that in order to promote business in New York the app should detect users from NY and give a 15% rebate to these users. Also the app should use a tiered-pricing schema for users from the Midwest and a 10% rebate to users from California. (I know that this is a pretty bad example but I have some requirements that would beat this in complexity quite easily. This example is actually pretty simple.)<br />
So far I have seen these approaches to implementing requirements similar to the one above:<br />
1) Create a whole set of relationships between the various entities of your application and use these relationships for implementing custom functionality. This has the downside that you are creating a big complex system that is pretty hard to follow and has all sort of weird code appearing all over the code base in order to service these customization requests.<br />
The above example would be implemented in the following way (I am assuming that the relationships are stored in a database):<br />
<em>a) Add a table that maps regions to price schema IDs.<br />
b) Extend the user table and assign it a region.<br />
c) Change the pricing module to take in a user, to get the user&#8217;s region and from the user&#8217;s region get the pricing schema.<br />
d) Change the pricing module to work off a pricing schema.<br />
</em></p>
<p>2) Do this transparently by creating custom implementations for the interfaces which define your application&#8217;s business logic. You can use inheritance for accessing shared behavior between a new custom implementation and an already existing class and configuration for setting up the custom implementation easily. Again, configuration can be shared if necessary. This approach has the advantage that is a lot leaner than the previous one and is easier to read.<br />
The above requirement would be implemented this way:<br />
<em>a) Change the pricing module to work off a pricing schema (this is similar to step <strong>d)</strong> above).<br />
b) Create a mapping in Spring which maps regions to pricing schemas.<br />
c) Create a mapping in Spring which thru scoping retrieves the user from the web app, retrieves its region (possibly thru geo-targetting) and populates the pricing module with the correct pricing schema.<br />
</em>As you can see the second approach is not intrusive at all, it doesn&#8217;t touch the code base at all. More importantly it doesn&#8217;t couple the pricing module to the user as it was the case with the first example.</p>
<p>One problem which appears with the 2 approaches is the one that arises when a support team (likely not close to the developers) is doing support for this application.<br />
In the first case the support team has to know all the entities which are tied to a particular failure in the application which can be very hard to do. As the complexity of the system and the number of short-cuts increase the support team will have a pretty hard time to determine what went wrong where.</p>
<p>In the second case the support team can have a more subtle problem: since the customization is done transparently it doesn&#8217;t really know what could possibly go wrong in the customization (was a new region added in Spring.xml and mapped to the appropriate pricing schema, was there something else). In the first case it could have gone thru the maze of relationships which make up the customization, in the second it cannot do much if the error occurred in the customized part of the application, because that part is hidden away from it. The only thing it may have access to is the configuration of these customizations as well as to the functional spec of the customization.<br />
It would not be a bad idea to think about what could go wrong with a custom implementation when you are creating it and create a trouble-shooter which could be available to the support team for identifying errors occurring within a customized implementation. This trouble-shooter would, ideally, be integrated seamlessly into the support process. In the above case the trouble shooter would have been exposing the mapping mechanism (which maps a user all the way to the pricing schema) to the support team, who could use it in order to determine if the mapping has problems (does a user from Alabama get assigned to Midwest pricing schema?) because what is hidden from it is this mapping. Once the support team determines that the mapping is done well it could look at possible problems with the corresponding pricing schema.</p>
<p>The idea here is that customization can be done explicitly (by using a complex system of relationships between various entities) or implicitly (transparently thru configuration). Either way, the support team should have access to it.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> It would be really neat if in the above example the user-to-pricing schema mappings would have been tested to the point where they would have been bullet-proof before putting in prod. Then the problems would have occurred in the various pricing schemas. A support person should have been enabled to determine quickly what pricing schema was used and resolve problems related to them.<br />
Mappings management, or bindings management as I called them in a <a target="_blank" href="/blog/2007/02/11/the-emergence-of-the-transparent-container/">previous post</a>, will gain importance as the relationships between various components will increase. These mappings will create a few problems on their own once they become too many&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/25/complexity-in-customization-and-its-effects-on-application-support/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AOP and unit-testing</title>
		<link>http://microintellia.com/blog/2007/05/22/aop-and-unit-testing/</link>
		<comments>http://microintellia.com/blog/2007/05/22/aop-and-unit-testing/#comments</comments>
		<pubDate>Tue, 22 May 2007 18:38:43 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[AOP]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/22/aop-and-unit-testing/</guid>
		<description><![CDATA[I think it is obvious, but I have not seen it mentioned anywhere: you need to test an application which has been AOP-ed (which has been built using AOP). Suppose that you wrote an advice that re-prices a shopping cart. You should unit-test the advice on its own, unit-test the application on its own, but [...]]]></description>
			<content:encoded><![CDATA[<p>I think it is obvious, but I have not seen it mentioned anywhere: you need to test an application which has been AOP-ed (which has been built using AOP). Suppose that you wrote an advice that re-prices a shopping cart. You should unit-test the advice on its own, unit-test the application on its own, but you should also unit-test the advice applied to the application (just to make sure that the advice has been applied properly and is well integrated into the application). The application which has been enhanced by aspects is a brand new thing (well, maybe not) which needs to be unit-tested as well (especially if the advice is modifying its state as the shopping cart re-pricing advice does).</p>
<p>I wonder if you could/should compose unit-tests (let&#8217;s say JUnit tests) similar to the way you compose applications. The new unit-test (the one that tests the application as it has been modified by the advice) could probably be derived from the 2 unit-tests, it would be interesting to see if you could compose the new unit-test with the same ease with which you compose the application. One problem with unit-testing an AOP-enhanced application that I see is the difference between the ease of use with which an advice can be applied to a code-base and the ease of use with which you can create a unit-test which can test the new application. Very likely the advice is applied in configuration while the AOP test is written in code, there is a pretty big difference in the time spent on creating the new application vs the time spent on creating the tests for the new application. I wonder if testing platforms should not be tweaked in order to allow for unit test re-composition.</p>
<p>It would be interesting to know why nobody is talking about this. Could it be because AOP is being used mainly for infrastructure issues which do no inject significant behavior into the application (I see unit-testing AOP-enhanced applications being very important for weaving business-logic advices into an application)? Could it be because of the difference in the costs of creating an AOP-enhanced application and testing it? Once again, time will tell&#8230;</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> This post is pretty much a collection of various thoughts that I have about AOP and unit testing. I realize that it is not very well structured, but I didn&#8217;t have the time to dwell too much on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/22/aop-and-unit-testing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The case for diff and merge in design tools</title>
		<link>http://microintellia.com/blog/2007/05/18/the-case-for-diff-and-merge-in-design-tools/</link>
		<comments>http://microintellia.com/blog/2007/05/18/the-case-for-diff-and-merge-in-design-tools/#comments</comments>
		<pubDate>Fri, 18 May 2007 17:51:30 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/18/the-case-for-diff-and-merge-in-design-tools/</guid>
		<description><![CDATA[The need for diff-ing and merging designs doesn&#8217;t necessarily appear during the design phase, it is possible to solve differences in design thru team-work such as discussing together any design changes.
The need for diff-ing and merging designs is more pressing later in the application life-cycle when design is used as documentation and when you need [...]]]></description>
			<content:encoded><![CDATA[<p>The need for diff-ing and merging designs doesn&#8217;t necessarily appear during the design phase, it is possible to solve differences in design thru team-work such as discussing together any design changes.<br />
The need for diff-ing and merging designs is more pressing later in the application life-cycle when design is used as documentation and when you need to change something documented in the design, let&#8217;s say a component. In order for the design to properly document the component the design may need to be changed as well. But it could happen that multiple people are working on the same component. These people have no problem CODING together on the same component, at the end of the day they would reconcile their code differences the usual way (by using CVS file comparisons for example). But they would have a problem CHANGING THE DESIGN at the same time, because if you cannot diff and merge a design you would have problems reconciling all the design changes.There are some work-arounds to this deficiency: one would be to assign a person in charge of maintaining the design up to changes in code, but this is not really pretty.<br />
When people complain about the problems of diff-ing and merging in design what I hear is pretty hilarious: it is stated the fact that since you work with images (those blocks on your UML diagrams) you would have to diff and merge images and this cannot be done ;-). Well, those images are actually representations of some concepts such as class relationships, class names, method names, etc&#8230; These concepts can be represented in an ASCII format which could be diff-ed and merged pretty easily.</p>
<p>I think that we should be able to diff and merge design documents such as UML diagrams. I would like to check out the Eclipse Modeling Framework and see how they save an ordinary UML diagram to disk (and I hope that they use an ASCII format and not a binary format). If an ASCII format is chosen for this it is possible to create a component that could diff and merge various UML blocks.<br />
Now I have to find the time to inspect this. Not going to happen for a while.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> I find it ludicrous that UML diagrams produced by one system (let`s say Microsoft Visio) cannot be consumed by another system (such as free-ware Poseidon). It`s like code written on JBuilder could not be opened on Eclipse. Pathetic. These walls should come one one way or another. The wide range of free UML editors are worth nothing if they cannot communicate with other UML editors.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/18/the-case-for-diff-and-merge-in-design-tools/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What used to drive IT change</title>
		<link>http://microintellia.com/blog/2007/05/15/what-used-to-drive-it-change/</link>
		<comments>http://microintellia.com/blog/2007/05/15/what-used-to-drive-it-change/#comments</comments>
		<pubDate>Tue, 15 May 2007 20:44:49 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/15/what-used-to-drive-it-change/</guid>
		<description><![CDATA[I was watching this rather boring infoq presentation on SOA when Gregor Hohpe, the guy giving the presentation, asked this question:
 &#8220;We went from client-server development to thin client and now to services. The CIO, the guy paying for your IT implementations should ask you: What is next?&#8221;
Gregor Hohpe went on, but it left behind [...]]]></description>
			<content:encoded><![CDATA[<p>I was watching <a target="_blank" href="http://www.infoq.com/news/2007/05/hohpe-soa-development">this</a> rather boring infoq presentation on SOA when Gregor Hohpe, the guy giving the presentation, asked this question:<br />
<em> &#8220;We went from client-server development to thin client and now to services. The CIO, the guy paying for your IT implementations should ask you: What is next?&#8221;</em><br />
Gregor Hohpe went on, but it left behind a pretty interesting question: why did we move from client-server to thin client and next to services? To be honest with you I don&#8217;t think the proper answer could possibly come from IT person, because I think that IT has been changed (at least till now) by the the economics of hardware rather than anything else.</p>
<p>I get the impression that client-server started to become main stream once the price for PCs started to drop and it became worth-while to start using these PCs rather than dumb-terminals. The alternative to rich-clients back then was ASCII-only dumb-terminals, it was obvious that the work-force would become a lot more productive if they switched to these rich-clients. I wonder why the rich-client was chosen rather than the thin client in the post-dumb-terminal IT environment. My impression is that this was done in order to minimize the traffic between the client and the server, at those speeds chatty applications were not possible.<br />
Once the PCs prices started to drop the next barrier was the network. This took a while to go down, but once reasonable network speeds could be achieved this opened the door to a new concept: that of the application stored in a central place and of thin clients whose functionality it making requests to this application. One advantage to this approach is that by consolidating the application in a central place it obviates the versioning hell lived thru during the previous period. This was first massively used for pushing new applications (such as Amazon.com, eBay.com, yahoo.com, etc&#8230;) thru the web to consumers. Another advantage to the thin client was that it lowered the barrier for accessing an application by not requiring the customer to do anything (no download, no clumsy set-up process, no clumsy removal process, etc&#8230;). One potential problem with the rich client is the PC&#8217;s real-estate: you can fit and efficiently manage only that many applications on your PC, this puts a barrier of entry on the applications that can be run on a PC (how many would have installed an Amazon-type book browsing application on their PCs in the 90&#8217;s?). With the thin client this barrier goes away. I would argue that the drop in telecommunications costs drove the thin-client model and the economics behind it.<br />
As telecommunications costs continued to drop the applications started becoming more and more chatty, leading to the point where the interactions behind them had to be managed efficiently. SOA comes to the rescue. End of story.</p>
<p>It appears that events in the CONSUMER&#8217;s market actually drove the ENTERPRISE IT environment. I guess the effects the consumer&#8217;s market has on the price of various computing devices (by effectively turning them into commodities) creates cost-savings which are recognized and used by  enterprise IT. It would be interesting to muse over what the future factors of change for IT in an environment that has already seen massive price decreases. With rock bottom prices both in hardware and in telecommunications the next thing to decrease in price is probably software itself (and the open-source community is busy working on that).</p>
<p>There are a lot of complains that all these migrations (which are true paradigms shifts) are costing the companies lots of money. I agree with this, but you should consider that they also save a lot because otherwise nobody would do it. My .02$.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> Another thing that I see happening right now is the re-emergence of the rich-client model. I see this as being correlated to the emergence of the mobile devices (another event in the CONSUMER electronics space) and their differences (reduced bandwidth and, more importantly, a very different interaction with the user) rather than recognizing that the rich-client model has any value.</p>
<p><a href="http://microintellia.com/blog/#">P.P.S.</a> I wrote this post in a hurry. It probably shows&#8230;</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> If my assumption that hardware price changes due to demand in the consumer electronics space drove enterprise IT is correct it would be interesting to see what would be the next drivers. Changes in the price of software is a possible driver. It would be possible that changes in IT would be done on &#8220;merit&#8221;: i.e. a certain paradigm would be implemented because it is a more efficient way to write software rather than because it is related to a drop in the price of a certain hardware platform.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/15/what-used-to-drive-it-change/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Protected: Weird feeling</title>
		<link>http://microintellia.com/blog/2007/05/15/weird-feeling/</link>
		<comments>http://microintellia.com/blog/2007/05/15/weird-feeling/#comments</comments>
		<pubDate>Tue, 15 May 2007 15:32:05 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/15/weird-feeling/</guid>
		<description><![CDATA[There is no excerpt because this is a protected post.]]></description>
			<content:encoded><![CDATA[<form action="http://microintellia.com/blog/wp-pass.php" method="post">
<p>This post is password protected. To view it please enter your password below:</p>
<p><label for="pwbox-110">Password:<br />
<input name="post_password" id="pwbox-110" type="password" size="20" /></label><br />
<input type="submit" name="Submit" value="Submit" /></p></form>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/15/weird-feeling/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Protected: How to enhance collaboration between 2 parallel content sources</title>
		<link>http://microintellia.com/blog/2007/05/08/cum-sa-transformi-2-canale-de-informatii-din-concurenti-in-colaboratori/</link>
		<comments>http://microintellia.com/blog/2007/05/08/cum-sa-transformi-2-canale-de-informatii-din-concurenti-in-colaboratori/#comments</comments>
		<pubDate>Tue, 08 May 2007 16:48:36 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/08/cum-sa-transformi-2-canale-de-informatii-din-concurenti-in-colaboratori/</guid>
		<description><![CDATA[There is no excerpt because this is a protected post.]]></description>
			<content:encoded><![CDATA[<form action="http://microintellia.com/blog/wp-pass.php" method="post">
<p>This post is password protected. To view it please enter your password below:</p>
<p><label for="pwbox-109">Password:<br />
<input name="post_password" id="pwbox-109" type="password" size="20" /></label><br />
<input type="submit" name="Submit" value="Submit" /></p></form>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/08/cum-sa-transformi-2-canale-de-informatii-din-concurenti-in-colaboratori/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The demise/change of the template design pattern?</title>
		<link>http://microintellia.com/blog/2007/05/07/the-demise-change-of-the-template-design-pattern/</link>
		<comments>http://microintellia.com/blog/2007/05/07/the-demise-change-of-the-template-design-pattern/#comments</comments>
		<pubDate>Mon, 07 May 2007 14:53:36 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/07/the-demise-change-of-the-template-design-pattern/</guid>
		<description><![CDATA[You are probably familiar with the template design pattern. It lets you define a life-cycle and declare functionality unknown at design time in abstract methods, effectively delegating this functionality to the sub-classes. While initially described in C++ terms in the famous Go4 book it is widely used in Java applications (Spring uses it heavily for [...]]]></description>
			<content:encoded><![CDATA[<p>You are probably familiar with the <a target="_blank" href="http://www.exciton.cs.rice.edu/JAvaResources/DesignPatterns/TemplatePattern.htm">template design pattern</a>. It lets you define a life-cycle and declare functionality unknown at design time in abstract methods, effectively delegating this functionality to the sub-classes. While initially described in C++ terms in the famous <a target="_blank" href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_sr_1/104-8815633-6895106?ie=UTF8&#038;s=books&#038;qid=1178548204&#038;sr=8-1">Go4 book</a> it is widely used in Java applications (Spring uses it heavily for managing connections of all sorts: JDBC, JMS, etc&#8230;)</p>
<p>In Java it is a pretty limiting pattern: due to the single inheritance rule you cannot have the sub-class of a template (let&#8217;s call it &#8220;templated&#8221; class) extend multiple super-classes. Sometimes this is pretty limiting, I find it. One work-around to this problem is to change the template class so that it is not abstract anymore and declare all the abstract methods in an interface (the &#8220;life-cycle&#8221; interface) which the template class is using as a member variable. Then the interface would be implemented by a &#8220;templated&#8221; class which doesn&#8217;t need to sub-class the template class, which gives the &#8220;templated&#8221; class more freedom. The template class will be populated at run-time with the appropriate interface implementation thru an IoC mechanism. I find that the life-cycle defined in the template class can be extended as well by defining a sub-class of the &#8220;life-cycle&#8221; interface which could extend its contract. This way you can define more flexible life-cycles. (You can do the same thing with the traditional template design pattern as well but I find it to be harder).<br />
I find that this arrangement pretty much does away with the template design pattern and makes your application more flexible by eliminating the need for sub-classing.</p>
<p>One interesting question would be why the above approach (the interface-flavored template) has not been used before and the template design patten has been used extensively? I have 2 answers to this:<br />
1) The template design pattern pretty much casts in stone your life-cycle. Once defined the life-cycle can be changed only at great costs, and some times the stability given by this inflexibility is desired.<br />
2) The drop in the cost of interface-to-implementation mapping with the introduction of IoC. Before IoC interface-to-implementation mappings were usually constructed with tons of factories (another rather inflexible design pattern) and with tons of overhead. With IoC the interface-to-implementation costs plummeted weakening the case for the template design pattern.</p>
<p>It would be interesting to see how the template design pattern will evolve. Ironically enough it is a design principle championed by the architects of the most popular IoC (Spring) so there is some backing for it. It gives some stability to the architecture by making its extension harder, this could be desired in some applications. The flexibility generated by the interface-flavored template comes with some management costs: you need to manage the relationships that will be spawned because of the use of this method.<br />
Time will tell&#8230;</p>
<p><a href="http://microintellia.com/blog/#">P.S</a>.: <em>One key difference between the &#8220;old-style&#8221; template and the interface-flavored template is the inheritance issue: in the old-style template you export the life-cycle thru <strong>inheriting from the template class</strong> (and you have only one chance at inheriting a class in Java) while in the interface-flavored one you export the life-cycle by <strong>defining it in an interface</strong> (which can be inherit from multiple sources). The &#8220;templated&#8221; class will not have a chance to inherit from another class in the old-style template, while it will be able to extend another one in the interface template. I think that because of this big difference the old-style template doesn&#8217;t scale well: its mechanism for exporting the life-cycle (sub-classing) cannot be re-used, I have not spent too much time thinking about it.<br />
Another difference between the 2 approaches is that the &#8216;original&#8217; template pattern puts together the lifecycle definition (the abstract methods) and the lifecycle execution (the code calling the abstract methods) in one place: the template class. The interface method splits this in 2 parts: the life-cycle definition is in the interface and the lifecycle execution is in a class using the lifecycle interface. Sometimes you may need the de-coupling given by the interface template pattern.<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/07/the-demise-change-of-the-template-design-pattern/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transparent development</title>
		<link>http://microintellia.com/blog/2007/05/02/transparent-development/</link>
		<comments>http://microintellia.com/blog/2007/05/02/transparent-development/#comments</comments>
		<pubDate>Wed, 02 May 2007 15:53:05 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/02/transparent-development/</guid>
		<description><![CDATA[While posting to this blog I have been using the term &#8220;transparent&#8221; a lot, transparent usually meaning making changes to a system without touching its internal mechanism. More often than not I posted about using AOP for transparent programming.
What about when you do not have the chance of using AOP for influencing a piece of [...]]]></description>
			<content:encoded><![CDATA[<p>While posting to this blog I have been using the term &#8220;transparent&#8221; a lot, transparent usually meaning making changes to a system without touching its internal mechanism. More often than not I posted about using AOP for transparent programming.<br />
What about when you do not have the chance of using AOP for influencing a piece of software? You would still like to implement the new functionality without changing its internal mechanisms because they are very expensive to change (regression testing being a top expense). Transparent development is all about that, is about looking at a piece of code, at how it is structured and at the relationships between various actors and then determining how to change it with minimal change. I find that treating various pieces of code (methods included) as black-boxes and building blocks helps. I use a cost-based algorithm for determining what pieces of code should be changed and what should be used as building blocks: if changing a piece of code requires significant regression testing then I assign it a high cost and use it as a building block. I use this method for dealing with code which is not documented and it works pretty well. It lets you go as deep as you can into the code without trying to reverse-engineer the hell out of it, it limits the reverse-engineering effort.<br />
Sub-classing also help to apply behavior transparently: you change the methods that you want changed, and delegate the nitty-gritty stuff that you don&#8217;t want to go into to the original class.</p>
<p><strong>The main value of a black-box is that it has a contract that has been tested and accepted by the user.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/02/transparent-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some cool things about working with multiple systems</title>
		<link>http://microintellia.com/blog/2007/05/01/some-cool-things-about-working-with-multiple-systems/</link>
		<comments>http://microintellia.com/blog/2007/05/01/some-cool-things-about-working-with-multiple-systems/#comments</comments>
		<pubDate>Tue, 01 May 2007 20:04:33 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/05/01/some-cool-things-about-working-with-multiple-systems/</guid>
		<description><![CDATA[Weblogic&#8217;s implementation of JMS allows for redelivery of the message on exceptions. Sometimes this helps, especially when interacting with outside systems (say that you have an MDB that should forward messages to an external system. If you cannot connect to the external system the exception thrown will put back the MDB message in the JMS [...]]]></description>
			<content:encoded><![CDATA[<p>Weblogic&#8217;s implementation of JMS allows for redelivery of the message on exceptions. Sometimes this helps, especially when interacting with outside systems (say that you have an MDB that should forward messages to an external system. If you cannot connect to the external system the exception thrown will put back the MDB message in the JMS queue and the message will try to be redelivered).</p>
<p>It is nice to be able to provide alternate views of the same entity easily. This can be done thru alternative types. One nice things about providing alternate views of the same entity is that you can reconcile systems more easily.</p>
<p>Sometimes you can use sub-classing for dealing with tightly coupled systems. System A is using system B as a data repository and A is getting data from B using B&#8217;s DTOs. Unfortunately for A, A doesn&#8217;t transform these DTOs into its internal representation of the same data. B is about to make a massive refactoring of its code and this includes the DTOs and relationships between them. In order to have A use the same DTOs as before B decided that the new DTOs will sub-class the old ones, this way A will not have to change all the code that is using those DTOs (and which is massive). The new DTOs will sub-class the old ones, implement the old relationships and the new ones. If you think about it it is pretty bad: you cannot sub-class ad-nauseum and sometimes you may get a collision between the old relationships and the new ones. But it does its job.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/05/01/some-cool-things-about-working-with-multiple-systems/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft on SOA</title>
		<link>http://microintellia.com/blog/2007/04/23/microsoft-on-soa/</link>
		<comments>http://microintellia.com/blog/2007/04/23/microsoft-on-soa/#comments</comments>
		<pubDate>Mon, 23 Apr 2007 15:47:21 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/23/microsoft-on-soa/</guid>
		<description><![CDATA[I was listening to this podcast on the MWD blog, a podcast with Kris Horrocks from Microsoft. I find it weird given the reputation that MS has in enterprise computing, but this is the first podcast with a vendor involved in SOA which stands out.
Some points that I extracted from it:
1) Microsoft seems pretty serious [...]]]></description>
			<content:encoded><![CDATA[<p>I was listening to <a target="_blank" href="http://www.mwdadvisors.com/blog/2007/04/mwd-fm-soa-interview-microsoft.html">this podcast</a> on the <a target="_blank" href="http://www.mwdadvisors.com/blog">MWD blog</a>, a podcast with Kris Horrocks from Microsoft. I find it weird given the reputation that MS has in enterprise computing, but this is the first podcast with a vendor involved in SOA which stands out.<br />
Some points that I extracted from it:<br />
1) Microsoft seems pretty serious about inter-operability.<br />
2) SOA is all about managing relationships between various IT environments (this was not explicit in the podcast, but I ended up with this impression). I have the impression that the drop in the cost of telecommunications spawned the interactions between IT departments within a company as well as in different companies. (This is a minor point though).<br />
3) I really liked the part (this was toward the end of the podcast) about having a management console which can be used for admin-ing different Microsoft products such as SQL Server or Biz Talk server. I got the impression of a management abstraction layer that gets put on top of an application so that you can plug this application into an operational environment easily. The admin tasks from Biztalk server must be different from the ones from SQL server (I&#8217;d be very surprised if Biztalk Server needs to handle roll-back segments, datafiles, etc&#8230;), but there are quite a few which are similar: transaction thru-put and a few other examples in the podcast seemed to make a lot of sense. I really liked this part, MS seems pretty serious about management. (As a side note, I would assume that they found a way to delegate management concerns that fall outside the scope of their management console to someone that could handle them.)</p>
<p>I get the impression that MS will actually make a pretty important contribution to SOA, and that it will be in management where it will occur. SOA could be the means thru which MS will break into enterprise computing.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/23/microsoft-on-soa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Business logic aspects</title>
		<link>http://microintellia.com/blog/2007/04/17/business-logic-aspects/</link>
		<comments>http://microintellia.com/blog/2007/04/17/business-logic-aspects/#comments</comments>
		<pubDate>Tue, 17 Apr 2007 21:28:03 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[AOP]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/17/business-logic-aspects/</guid>
		<description><![CDATA[A while ago I made the case for business logic aspects, arguing that in a sense AOP is similar to SOA: you basically compose together an application by weaving business logic aspects where necessary. The example I gave was that of a taxing aspect that gets applied transparently to various financial operations so that when [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I made <a target="_blank" href="/blog/2006/07/24/soa-and-aop">the case</a> for business logic aspects, arguing that in a sense AOP is similar to SOA: you basically compose together an application by weaving business logic aspects where necessary. The example I gave was that of a taxing aspect that gets applied transparently to various financial operations so that when carrying out a financial operation you also tax it.<br />
Pretty good in theory, and I still maintain the same opinion: if you can apply business logic concerns transparently thru AOP you should probably do it.<br />
However, when watching <a target="_blank" href="http://www.infoq.com/interviews/aop-design-ramnivas-laddad">this interview</a> and <a target="_blank" href="http://www.infoq.com/interviews/Adrian-Colyer">this interview</a> I realized that one big piece is missing from this picture: domain aspects modeling. The person in the first interview advocates using annotations for modeling aspects, approach that I don&#8217;t think scales pretty well. Aspect modeling is very crude for the time being (it is true that we are at the beginning of the adoption period for AOP so a lot of things are not in place) and this would imply that you cannot model complex aspects and complex interactions between aspects and advised classes. Pretty much all the business logic aspects I came across in different interviews are very crude and consist of very small operations, engaging the advised class in a very limited ways.<br />
I guess this is only how far you can go ahead today. Tomorrow will probably be different, the case for business logic aspects grows and at one point the emerging complexity will have to be managed one way or another.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a>  From what I read I see that annotations are widely used for creating pointcuts. This approach means that basically you are creating your pointcuts in Java code and not outside of it (in an AspectJ query or Spring config files) which is, to a certain degree, contrarian. I wonder if this is not related to the fact that currently you can manage your Java codebase a lot better than your spring.xml files or your AspectJ queries.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/17/business-logic-aspects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Yahoo Pipes - the revolution took place</title>
		<link>http://microintellia.com/blog/2007/04/16/yahoo-pipes-the-revolution-took-place/</link>
		<comments>http://microintellia.com/blog/2007/04/16/yahoo-pipes-the-revolution-took-place/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 21:20:43 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/16/yahoo-pipes-the-revolution-took-place/</guid>
		<description><![CDATA[I took a look at Yahoo Pipes and decided to write a small post about it. Don&#8217;t expect too much from it, as it is the case lately I don&#8217;t have the time to take a deep look at it.
I like the theme that Tim O&#8217;Reilly put on it in this post:
Jon expressed a vision [...]]]></description>
			<content:encoded><![CDATA[<p>I took a look at <a target="_blank" href="http://pipes.yahoo.com">Yahoo Pipes</a> and decided to write a small post about it. Don&#8217;t expect too much from it, as it is the case lately I don&#8217;t have the time to take a deep look at it.<br />
I like the theme that Tim O&#8217;Reilly put on it in <a target="_blank" href="http://radar.oreilly.com/archives/2007/02/pipes_and_filte.html">this post</a>:<br />
<em>Jon expressed a vision of web sites as data sources that could be re-used, and of a new programming paradigm that took the whole internet as its platform&#8230; Using the Pipes editor, you can fetch any data source via its RSS, Atom or other XML feed, extract the data you want, combine it with data from another source, apply various built-in filters (sort, unique (with the &#8220;ue&#8221; this time:-), count, truncate, union, join, as well as user-defined filters), and apply simple programming tools like for loops. In short, it&#8217;s a good start on the Unix shell for mashups.</em></p>
<p>I concur with it, it is true: thru the use of RSS data is being exposed in a standard way and this standard is used for putting together different data sources. You could argue that RSS broke down the barriers where were separating content in different sites and that Pipes is the software which lets you combine these datasources in very imaginative ways. Pretty good. Except that I don&#8217;t think it will achieve the penetration touted by most people.<br />
The biggest obstacle to making come true this vision of web sites as a series of datasources is the fact that Yahoo PIpes serves niche users and not breaking the barriers between various sites/datasources them. Mind you, breaking these barriers was not an easy task and keeping these barriers down relies heavily on unpaid abor (imagine what would happen to most of the Yahoo Pipes if people would stop pushing stories onto digg, book-marking items on del.icio.us, blogging about Lindsay Lohan, etc&#8230;). In a sense Yahoo Pipes lets you surf people&#8217;s past-times, but this is another story.</p>
<p>As I was saying, the problem is that there are way the needs to surf these datasources are very narrow. Taking a look at the numbers of times each pipe has been run would indicate that the pipes created so far are not that popular (low 5 digits are nothing today), which would indicate that they are not easily consumed. I assume that they are not easily consumed because these pipes are servicing very pointed needs, needs which are not shared by most people.<br />
Looking at Yahoo Pipes as if it is a market you end up with the impression that it is an illiquid market: you cannot map pipe consumers to pipe producers easily. The main way of mapping pipe consumers to pipe producers is to make each pipe consumer create its own pipes by using an editor (which I must confess I have not used), the pipe consumer becomes a pipe producers and the market becomes liquid. Well, this is not happening because your average Joe will not be able to construct a meaningful Pipe, partly because it doesn&#8217;t really know where to look for content, how to filter that content efficiently and partly because it has no desire to learn how to chop-up XML (even if Yahoo claims to have made it braindead-easy).</p>
<p>Your average Joe needs an agent that would do that for him, that would bridge the gap between a pipe consumer and a pipe producer. Well, that agent would very likely not do it for free. So how would you put together average Joe and the agent that would service its very narrow needs? In an <a target="_blank" href="/blog/2006/12/11/some-benefits-of-open-apis-and-mash-ups/">old post</a> I was musing about how to service niche communities by creating mashups that would use other sites (Amazon, eBay, Google Maps and now Yahoo Pipes). An example of a Yahoo Pipe that could target a niche efficiently could be putting up a <a target="_blank" href="http://pipes.yahoo.com/pipes/pipe.info?_id=1mrlkB232xGjJDdwXqIxGw">this Pipe</a> that lets you find an apartment near parks, public libraries, produce markets, etc&#8230; You could take this pipe and put it up on a real-estate agency&#8217;s site and provide that real estate agency&#8217;s customer with something worth-while. The customer could do exactly the same thing on Yahoo Pipes, but it doesn&#8217;t know how to. Well, the real estate agency could provide this on its site and provide a better experience. The real estate agency coupled with the web-site developer that puts up pipe on the real estate agency&#8217;s site is the agent that bridges the gap between the pipe consumer and the pipe producers. I see this as a way to make the Yahoo Pipes market liquid.<br />
Another way to make this market liquid would be create a market-place where pipe consumers would make requests for pipes along with prices and pipe producers would fulfill these requests and get paid, similar to Amazon&#8217;s <a target="_blank" href="http://www.mturk.com">MTurk</a>. To be honest, I&#8217;m not sure if this is feasible, but it is worth noting.</p>
<p>Yahoo Pipes would be an interesting service. The web has been turned into a huge database where anyone with a browser can find what it needs. The revolution happened. Nobody cares.</p>
<p><em>Later Edit: In a certain way an Yahoo Pipe is a piece of code, a piece of intelectual property if you wish. Yahoo Pipes forces pipe producers to give their IP away for free (as far as I see). I wonder if this is not a barrier to adoption as well. If I make a good pipe I&#8217;d like to see some benefit coming out of it.<br />
Another point concerning pipe creation is the large number of websites/datasources. Putting together an efficient pipe requires the pipe creator to know the data in these datasources pretty well, the barrier to pipe creation is not just chopping up data coming from different sources, but also picking up the appropriate sources for data. This is a far greater barrier to adoption as far as I see it because it shifts the effort of pipe creation from data transformation (trivial) to knowledge about data (not so trivial). My .02$</em></p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/16/yahoo-pipes-the-revolution-took-place/feed/</wfw:commentRss>
		</item>
		<item>
		<title>New Year&#8217;s day</title>
		<link>http://microintellia.com/blog/2007/04/13/new-years-day/</link>
		<comments>http://microintellia.com/blog/2007/04/13/new-years-day/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 17:22:58 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/13/new-years-day/</guid>
		<description><![CDATA[All is quiet on new years day,
A world in white gets underway.
]]></description>
			<content:encoded><![CDATA[<p>All is quiet on new years day,<br />
A world in white gets underway.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/13/new-years-day/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Caching remote EJB Homes</title>
		<link>http://microintellia.com/blog/2007/04/12/caching-remote-ejb-homes/</link>
		<comments>http://microintellia.com/blog/2007/04/12/caching-remote-ejb-homes/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 15:34:26 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/12/caching-remote-ejb-homes/</guid>
		<description><![CDATA[Remote EJB Homes should be cached because in order to instantiate one you need to create a context binding to the server hosting the remote EJB home. The context creation is a pretty heavy operation (involves among other things checking security certificates, etc&#8230;) so it should be minimized. The fact that you are dealing with [...]]]></description>
			<content:encoded><![CDATA[<p>Remote EJB Homes should be cached because in order to instantiate one you need to create a context binding to the server hosting the remote EJB home. The context creation is a pretty heavy operation (involves among other things checking security certificates, etc&#8230;) so it should be minimized. The fact that you are dealing with <strong>remote</strong> EJB Homes raises the possibility that the server hosting those homes can get restarted, etc&#8230; Your cached EJB home will be stale once this happens. This should be avoided, the cached EJB Home should be re-instantiated on such exceptions according to some fail-over policy.<br />
A possible interesting use for AOP.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/12/caching-remote-ejb-homes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some random thoughts on contract-first web-services</title>
		<link>http://microintellia.com/blog/2007/04/11/some-random-thoughts-on-contract-first-web-services/</link>
		<comments>http://microintellia.com/blog/2007/04/11/some-random-thoughts-on-contract-first-web-services/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 18:57:43 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/11/some-random-thoughts-on-contract-first-web-services/</guid>
		<description><![CDATA[I was reading this interview with Arjen Poutsma on Spring Web Services when I came across this paragraph:
One of the newest additions is the Spring Web Services subproject, which according to the Web site &#8220;is focused on creating document-driven Web services [and] aims to facilitate contract-first SOAP service development, allowing for the creation of flexible [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://www.infoq.com/articles/arjen-poutsma-spring-ws">this interview</a> with Arjen Poutsma on Spring Web Services when I came across this paragraph:<br />
<em>One of the newest additions is the Spring Web Services subproject, which according to the Web site &#8220;is focused on creating document-driven Web services [and] aims to facilitate contract-first SOAP service development, allowing for the creation of flexible web services using one of the many ways to manipulate XML payloads.&#8221;</em></p>
<p>This is pretty interesting. I am not sure if you have heard the case for contract-first WS, one argument is that the web-service is essentially an interface (since it exposes a contract to the outside world) and generating it from an EJB or a POJO (as it was the case a couple of years ago) would basically imply that you are deriving an interface (the WS) from a concrete implementation (the EJB or the POJO), which, as you probably agree, is brain-dead. <em>Later edit: This way of relating to remoting has some OOP ideological shades: you are basically forcing OOP concepts (deriving an implementation from an interface and not vice-versa) onto something that may not need to conform to these OOP concepts (inter-system communication in this case).</em><br />
However, I am not buying this 100% anymore. The reason that I am not buying this 100% is that WS is basically a remoting mechanism among a few others (REST being its main competitor)and the the emergence of different application assembly platforms (frameworks, applications, suites that let you compose an application out of components that are exposed). One popular application-assembly platform is AJAX (which I happen to believe has been hyped out of proportions). AJAX favors small envelopes and REST is probably a very good fit for it, so chances are that you will need to expose your app REST-style. But, who knows, you may need to expose it WS-style as well because one system only talks WS and it needs to talk to you so you would need to remote your app in WS as well. I would say that the fact that your application needs to talk to different systems in different ways means that remoting an application is a functionality best done transparently (I am stating the obvious). It also means that you cannot fore-see 100% the way your app will interact with other apps and the contract-first WS are probably limited to scenarios when you have complete control over the interaction between that application and the other systems (which doesn&#8217;t happen very often).</p>
<p>On a side note, remoting an application is essentially an exercise in communication, and the way you do remote an application reflects the various stake-holders and their degree of influence quite a lot. The use of WS is pretty much a picture of the way your organization manages its communication channels: contract-first WS would probably fit a top-down approach in which the communication between various IT assets is spec-ed out before-hand, while WS used for remoting an existing application would imply an approach in which the communication is delegated to the team supporting that application and that  is responsible for how it communicates with the outside world.<br />
Not that the 2 are mutually exclusive: you can have a contract-first WS (designed top-down by an SOA architect) piggy-back on an currently running WS which has been remoting an application for ages. Another reason why these approaches are not mutually exclusive is that they have different scopes: top-down interaction is coarse-grained (you can control only high-level issues from the ivory tower) while delegating some degree of control to the IT team supporting the application is fine-grained (they can expose finer access to the application). Depending on what you need from that application you will interact with it differently and thru different channels.<br />
SOA is a bit about control of the IT assets and it is partly a backlash against delegating control to the IT teams. A right balance should be found between what should be managed centrally and what should be delegated and to whom.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> I didn&#8217;t sleep well last night and it probably shows. Please leave a message if something is not clear (as it is probably the case).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/11/some-random-thoughts-on-contract-first-web-services/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Ubiquitous Language</title>
		<link>http://microintellia.com/blog/2007/04/05/the-ubiquitous-language/</link>
		<comments>http://microintellia.com/blog/2007/04/05/the-ubiquitous-language/#comments</comments>
		<pubDate>Thu, 05 Apr 2007 22:34:06 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/05/the-ubiquitous-language/</guid>
		<description><![CDATA[This is the language which develops when developers/architects talk to domain experts during requirements gathering, etc&#8230; It is used for creating a common vocabulary which can be used by the rest of the team so that knowledge flows more efficiently. Pretty good, except that I find pretty limiting, I get the impression that is anchors [...]]]></description>
			<content:encoded><![CDATA[<p>This is the language which develops when developers/architects talk to domain experts during requirements gathering, etc&#8230; It is used for creating a common vocabulary which can be used by the rest of the team so that knowledge flows more efficiently. Pretty good, except that I find pretty limiting, I get the impression that is anchors you to a particular set of domain experts rather than getting you insight into the domain. This language is basically a boil-down of the terms that you are using with the domain expert you are talking to. Problems appear, however, when you start talking to a different set of people about the same things and you find out that they are using different expressions for them.<br />
I am working in an environment where I interact with quite a few BUs, each of them using, you guessed it, their own language. One word can mean quite a few different things depending on who you talk to, and one thing can be expressed by quite a few different words, again, depending on who you talk to. You are constantly shifting from one meaning to another. I find it pretty cool, to be honest. I also find that deriving domain knowledge from conversations with business analysts is a very tiring exercise when compared to reading up on the domain. The first thing you should ask a domain expert is not &#8220;So how does this entity relate to this other entity?&#8221; but rather &#8220;Do you know a good book about the domain?&#8221;.</p>
<p>I find the Ubiquitous Language to be a very superficial way for acquiring and communicating domain knowledge. Getting trained in the domain itself by reading books is a far better proposition rather than jotting down words/expressions as you talk to a domain expert. Your conversations with domain experts will improve, this is for sure.</p>
<p><a href="#">Later Edit:</a> UB is not a way to acquire and communicate domain knowledge, but rather to define a domain. I find that UB, like other DDD artifacts such as bounded context, serves primarily to manage concepts and limit the costs of disseminating these concepts within a group.  These costs are confusion, mistaking one concept for another, falling behind in understanding the domain and the application, etc&#8230;<br />
I was a bit harsh when I first wrote this post&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/05/the-ubiquitous-language/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Functionality lock-in</title>
		<link>http://microintellia.com/blog/2007/04/02/functionality-lock-in/</link>
		<comments>http://microintellia.com/blog/2007/04/02/functionality-lock-in/#comments</comments>
		<pubDate>Mon, 02 Apr 2007 14:41:50 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/04/02/functionality-lock-in/</guid>
		<description><![CDATA[I was reading this post on manageability.org when I came across this quote:
So banking om my own experience, the primary reason I never spent the effort to upgrade was that a lot of my data was not independent of the modules used for viewing them. The three main culprits were the Wiki system, the polls [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a target="_blank" href="http://www.manageability.org/blog/stuff/manageability-revolutions">post</a> on <a href="http://www.manageability.org/">manageability.org</a> when I came across this quote:<br />
<em>So banking om my own experience, the primary reason I never spent the effort to upgrade was that a lot of my data was not independent of the modules used for viewing them. The three main culprits were the Wiki system, the polls and the comments.<br />
&#8230;<br />
The lesson learned here is clear, never adopt a system where access to your data is tightly coupled to the code that renders it. The failure of Object Oriented Databases and Proprietary Code Repositories give ample historical lessons as why such an approach leads to failure over time. The flexibility afforded by a generically accessible data will always outweigh the benefits of structured data store access.</em></p>
<p>I never thought about this, but you can get locked into a particular piece of functionality. Functionality is usually tied to a particular business process, so you are basically locking yourself into a business process. Business process are transient and in today&#8217;s world in which change is the word of the day that particular business process will probably change in time as well. The coupling between your application and that particular business process will determine how easily it can be re-factored in order to align itself with the transformed (or new) business process. Process de-composition (emerging buzzword ;-), watch it carefully) will probably play a big role in taking care of all this. One idea is to break the process (or functionality) into blocks at various levels (from high-level to low-level) and then re-assemble these blocks so that they end up delivering the required functionality. In order to do this efficiently you need domain knowledge.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/04/02/functionality-lock-in/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tagging vs. linking</title>
		<link>http://microintellia.com/blog/2007/03/29/tagging-vs-linking/</link>
		<comments>http://microintellia.com/blog/2007/03/29/tagging-vs-linking/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 02:52:19 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/29/tagging-vs-linking/</guid>
		<description><![CDATA[A while ago I wrote a post about tagging. I was arguing that even if tagging was the buzzword du-jour when it came to Web 2.0 (another big buzzword) it had its limitations. Today I decided to compare it against the other Web 2.0 stalwart: HTML links. I decided to see which technique is better [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I wrote a <a target="_blank" href="/blog/2007/01/30/tagging/">post</a> about tagging. I was arguing that even if tagging was the buzzword du-jour when it came to Web 2.0 (another big buzzword) it had its limitations. Today I decided to compare it against the other Web 2.0 stalwart: HTML links. I decided to see which technique is better at creating relations between web-pages. Well, tagging is up to quite an opponent and doesn&#8217;t really live up to the fight.</p>
<p>Tagging&#8217;s first problem is that it has a very low cost: pretty much everybody can assign a tag to every type of content, it will cost you just a few seconds. This low entry cost makes it prone to abuse and/or careless use (I think careless use is a lot more prone than abuse)<a href="http://microintellia.com/blog/#">*</a>. Linking, on the other side, is a very expensive operation: among other things it carries a pretty big risk (the risk of driving people away from your site) and is limited by the real estate of your page (you can fit only so many links on your page, this generates competition between links). This high cost of linking results in relationships of higher quality (when you pay a higher price you usually check the goods a lot more).</p>
<p>Another problem with tagging is that it enables very simple relationships between pages. Basically, all the pages tagged &#8220;California&#8221; are created equal. You may refine the &#8220;California&#8221; set into sub-sets (let&#8217;s say &#8220;Los Angeles&#8221;, &#8220;San Francisco&#8221; which can be refined themselves) but you don&#8217;t get very far, more often than not you end up with a pretty short and thick tree (the length of the tree is the number of common attributes and its width is the number of web-pages sharing these attributes). Linking, on the other side, results in very complex graphs which are a gold-mine to who knows how to exploit them (just think of how much money has Google made out of <a target="_blank" href="http://en.wikipedia.org/wiki/Pagerank">PageRank</a>). The relationships between pages is much more complex when you link them rather than when you tag them.<br />
<a href="http://microintellia.com/blog/#">*</a> I actually have a problem because of this low cost. I have been maintaining a collection of bookmarks on del.icio.us which is categorized by tagging for the last year or so. The low cost of tagging URLs has resulted in a lot of URLs being tagged incorrectly because I didn&#8217;t realize that over time these tags will add up pretty quickly. Right now I have quite a few tags that I&#8217;m trying to get rid of, but it&#8217;s not too easy. BTW, del.icio.us&#8217;s functionality is very limited.</p>
<p>And this concludes this post&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/29/tagging-vs-linking/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reverse engineering 101</title>
		<link>http://microintellia.com/blog/2007/03/27/reverse-engineering-101/</link>
		<comments>http://microintellia.com/blog/2007/03/27/reverse-engineering-101/#comments</comments>
		<pubDate>Tue, 27 Mar 2007 18:22:46 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/27/reverse-engineering-101/</guid>
		<description><![CDATA[Lately I have been involved in some extensive reverse-engineering, I needed to talk to a system and the guy who wrote it wasn&#8217;t there. What I learned is that it pays off to think of the other system as a series of blocks that you use in order to achieve what you need to. Thinking [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have been involved in some extensive reverse-engineering, I needed to talk to a system and the guy who wrote it wasn&#8217;t there. What I learned is that it pays off to think of the other system as a series of blocks that you use in order to achieve what you need to. Thinking about the system in terms of functionality rather than programming paradigms helps you navigate between a system&#8217;s components and make better choices about which component is liable to service what request. You should choose the granularity of your knowledge of the system and decide what you find interesting and what not. Actually, you should take a view as &#8220;high-level&#8221; as possible and try not to get caught in small items (which is not always possible).<br />
The good thing about this approach is that you are in control of it: you choose how deep to go in order to achieve your results. In some cases you may go as deep as an interface&#8217;s contract, in other cases you may need to go all the way to the database.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/27/reverse-engineering-101/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some JSF short-comings</title>
		<link>http://microintellia.com/blog/2007/03/26/some-jsf-short-comings/</link>
		<comments>http://microintellia.com/blog/2007/03/26/some-jsf-short-comings/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 20:06:20 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/26/some-jsf-short-comings/</guid>
		<description><![CDATA[I really needed one thing today: inheritance between managed beans. Well, I didn&#8217;t find out how to implement it. I basically needed one managed bean (let&#8217;s say PersonList which has a List persons) to share its persons with another managed bean MortgagePersonList which subclasses PersonList and uses the persons List put together by PersonList during [...]]]></description>
			<content:encoded><![CDATA[<p>I really needed one thing today: inheritance between managed beans. Well, I didn&#8217;t find out how to implement it. I basically needed one managed bean (let&#8217;s say <strong>PersonList</strong> which has a List <strong>persons</strong>) to share its persons with another managed bean <strong>Mortgage</strong><strong>PersonList</strong> which subclasses <strong>PersonList</strong> and uses the <strong>persons</strong> List put together by <strong>PersonList</strong> during processing.</p>
<p><em>Java code:</em><br />
public class <strong>PersonList</strong><strong>{</strong></p>
<p><strong> </strong><strong>protected List  <strong>persons</strong>;<br />
// some methods for manipulating persons (sounds pretty Orwellian, I know ;-))<br />
}<br />
public class <strong>Mortgage</strong><strong>PersonList</strong> extends <strong>PersonList</strong>{</strong></p>
<p><strong> </strong><strong>// re-submits their mortgages application<br />
public String  resubmitMortages();</strong></p>
<p>}</p>
<p><em>JSF code:</em><br />
<!-- set-up the PersonList managed bean --></p>
<p>&lt;!&#8211; set-up the PersonList managed bean &#8211;&gt;</p>
<p>&lt;managed-bean&gt;</p>
<p>&lt;managed-bean-name&gt;personList&lt;/managed-bean-name&gt;</p>
<p>&lt;managed-bean-class&gt;com.PersonList&lt;/managed-bean-class&gt;</p>
<p>&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;</p>
<p>&lt;/managed-bean&gt;</p>
<p>&lt;!&#8211; set-up the MortgagePersonList managed bean &#8211;&gt;</p>
<p>&lt;managed-bean&gt;</p>
<p>&lt;managed-bean-name&gt;mortgagePersonList&lt;/managed-bean-name&gt;</p>
<p>&lt;managed-bean-class&gt;com.MortgagePersonList&lt;/managed-bean-class&gt;</p>
<p>&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;</p>
<p>&lt;/managed-bean&gt;<br />
I was expecting that I could inherit one managed bean from another so that I could re-use the <strong>persons</strong> List transparently. No such luck. So I was left with saving the <strong>persons</strong> List in the Session in the <strong>PersonList</strong> bean and retrieving it from the Session in the <strong>Mortgage</strong><strong>PersonList</strong> object. I thought that I could use an environment-independent Session object, the only one that I could retrieve via <strong>FacesContext.getCurrentInstance().getExternalContext().getSession(false)</strong> was actually an Object which has to be cast down to <strong>HttpSession</strong>. It is pretty weird that the <a target="_blank" href="http://java.sun.com/javaee/javaserverfaces/1.0/docs/api/javax/faces/context/ExternalContext.html"><strong>ExternalContext</strong></a> is modeled similarly to <strong>HttpServletRequest</strong> (just look at <em>getRequestParameterMap</em>, <em>getRequestParameterNames</em>, <em>getRequestPathInfo, getRequestServletPath</em>), it speaks a bit about JSF&#8217;s environment independence. It would be interesting to know the reasons behind not developing environment independent sessions (<a target="_blank" href="http://java.sun.com/javaee/javaserverfaces/1.0/docs/api/javax/faces/context/ExternalContext.html#getSession(boolean)">getSession</a> should return an interface specifying the contract for a session and not an Object which can be cast down to a specific implementation like <strong>HttpSession</strong>), this could help when implementing dialogs.<br />
One other thing that I hate about JSF is the amount of informal specifications, you know the fact that if your managed bean controller is returning a String than you should map that String to a navigation case and so on. It is pathetic, it would have been much better if this functionality would have been specified in a more rigorous way like defining it in an interface. But it looks like Sun didn&#8217;t feel quite up to the task of spec-ing out the user interaction (this is what JSP should be all about).<br />
I really like the abstraction layer they created but it looks like it was fully finished. My 2 cents.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/26/some-jsf-short-comings/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pause</title>
		<link>http://microintellia.com/blog/2007/03/25/pause/</link>
		<comments>http://microintellia.com/blog/2007/03/25/pause/#comments</comments>
		<pubDate>Sun, 25 Mar 2007 16:47:41 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/25/pause/</guid>
		<description><![CDATA[I&#8217;ll take a break from writing over here. I&#8217;m pretty busy and I don&#8217;t get much sleep, all this adds up. I&#8217;ll get back to writing somewhat later, when I&#8217;ll have more time.
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll take a break from writing over here. I&#8217;m pretty busy and I don&#8217;t get much sleep, all this adds up. I&#8217;ll get back to writing somewhat later, when I&#8217;ll have more time.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/25/pause/feed/</wfw:commentRss>
		</item>
		<item>
		<title>In case you want a different take on music industry&#8217;s problems</title>
		<link>http://microintellia.com/blog/2007/03/23/in-case-you-want-a-different-take-on-music-industrys-problems/</link>
		<comments>http://microintellia.com/blog/2007/03/23/in-case-you-want-a-different-take-on-music-industrys-problems/#comments</comments>
		<pubDate>Fri, 23 Mar 2007 20:32:47 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/23/in-case-you-want-a-different-take-on-music-industrys-problems/</guid>
		<description><![CDATA[&#8230; then you may want to read this, this, and this. They are pretty entertaining and miles away from the Web2.0, YouTube vs. Hollywood, Media 2.0, Content 2.0 stuff that keeps stuffing your feed readers. Some nice thought experiments, nothing more&#8230;
]]></description>
			<content:encoded><![CDATA[<p>&#8230; then you may want to read <a target="_blank" href="http://www.economist.com/blogs/freeexchange/2007/03/music_wants_to_be_free.cfm">this</a>, <a target="_blank" href="http://www.economist.com/blogs/freeexchange/2007/03/cui_bono_1.cfm">this</a>, and <a target="_blank" href="http://www.roughlydrafted.com/RD/RDM.Tech.Q1.07/708F20CD-E67D-45C7-AF95-3E1A6AC07C37.html">this</a>. They are pretty entertaining and miles away from the Web2.0, YouTube vs. Hollywood, Media 2.0, Content 2.0 stuff that keeps stuffing your feed readers. Some nice thought experiments, nothing more&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/23/in-case-you-want-a-different-take-on-music-industrys-problems/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spam</title>
		<link>http://microintellia.com/blog/2007/03/16/spam/</link>
		<comments>http://microintellia.com/blog/2007/03/16/spam/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 14:08:32 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/16/spam/</guid>
		<description><![CDATA[I can&#8217;t believe how much spam I&#8217;m getting lately, hundreds of spam messages daily. I try my best to scan it for valid comments, but there is a chance that some will slip by.
Sorry about it&#8230;
]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t believe how much spam I&#8217;m getting lately, hundreds of spam messages daily. I try my best to scan it for valid comments, but there is a chance that some will slip by.<br />
Sorry about it&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/16/spam/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Competition in transaction semantics</title>
		<link>http://microintellia.com/blog/2007/03/13/competition-in-transaction-semantics/</link>
		<comments>http://microintellia.com/blog/2007/03/13/competition-in-transaction-semantics/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 15:59:14 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/13/competition-in-transaction-semantics/</guid>
		<description><![CDATA[I was reading this post by Rod Johnson on the Interface 21 blog about Oracle Application Server and Spring when I came across this quote:
Because Spring provides a rich, portable transaction abstraction, it does the work under the covers of driving JTA and other APIs, so your code doesn&#8217;t need to know anything about the [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a target="_blank" href="http://blog.interface21.com/main/2007/02/27/oracle-contributing-oracle-application-server-integration-code-to-spring-framework/">post</a> by Rod Johnson on the Interface 21 blog about Oracle Application Server and Spring when I came across this quote:<br />
<em>Because Spring provides a rich, portable transaction abstraction, it does the work under the covers of driving JTA and other APIs, so your code doesn&#8217;t need to know anything about the underlying infrastructure, and thus can take advantage of any proprietary APIs that give more control or greater efficiency. Spring supports both declarative and programmatic transactions, so you can layer transaction management onto POJOs that don&#8217;t know anything about it; or, if transaction management is part of your business logic, you can use a more elegant API that offers more features than JTA (<a href="http://microintellia.com/blog/#">*</a>), isn&#8217;t tied to JNDI, and is much less verbose to work with.</em></p>
<p>Wow. Does this mean that Spring&#8217;s transaction semantics are starting to compete with JEE&#8217;s transaction semantics for mind-share, and ultimately, market share? In what DSL (<a href="http://microintellia.com/blog/#">**</a>) should you model your transactions: the old way by declaring them in ejb-jar.xml or Spring&#8217;s way by declaring them in spring-conf.xml? Is there a danger that one of these languages will become obsolete? Is there a danger that the current transaction semantics in Spring could be forked in order to better utilize a specific app-server&#8217;s capabilities? Is there a danger that these new transaction semantics be irreconcilable with the ones in the next Spring version?</p>
<p>In an earlier <a target="_blank" href="/blog/2007/03/06/the-transparent-container-and-lisp/">post</a> I likened the transparent container&#8217;s capabilities to LISP&#8217;s, particularly when it comes to defining new languages (<a href="http://microintellia.com/blog/#">**</a>). Well, the transparent container may inherit one bad thing from LISP: language mush-rooming. LISP diverged into so many dialects that it became eventually impossible to use as a common platform. More and more DSLs could be created for various use cases, which will range from the very specific to the very generic. I think this is probably where the effort will lie in the future, in managing all these DSLs, in separating specificity from generic behavior in an efficient manner. The future announces itself to be pretty messy&#8230;</p>
<p><a href="http://microintellia.com/blog/#">*</a> It is an interesting exercise to muse on Spring&#8217;s lead in TX APIs. If the features they advertise are needed - and I think they are needed and, even more, they are tested by the market - you would expect the JTA people to include them in their spec, after all the spec would be missing good functionality which should be included. If the JEE body will not include these features it will pretty much admit to being irrelevant in this particular area and would be handing the baton to the Spring people. Or maybe the JEE body doesn&#8217;t see these features as being generic enough or not having broad appeal. Who knows&#8230;</p>
<p><a href="http://microintellia.com/blog/#">**</a> Spring 2.0 was released with this nifty feature: <a target="_blank" href="http://www.springframework.org/docs/reference/xsd-config.html">XML namespaces</a>. This opens the door to defining your own specialized languages (let&#8217;s call it a Domain Specific Language, DSL) tailored to your needs and plugging them into Spring&#8217;s runtime.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/13/competition-in-transaction-semantics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A new play from Microsoft</title>
		<link>http://microintellia.com/blog/2007/03/09/a-new-play-from-microsoft/</link>
		<comments>http://microintellia.com/blog/2007/03/09/a-new-play-from-microsoft/#comments</comments>
		<pubDate>Fri, 09 Mar 2007 16:01:57 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/09/a-new-play-from-microsoft/</guid>
		<description><![CDATA[I was reading this article in Business Week on a particular XML format (XBRL) for tagging financial information to various operations within a company so that it can be reported better. At first I wondered how this format will play out in the real world. Its main strong point is that it is a standard [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://www.businessweek.com/technology/content/feb2005/tc2005028_9348_tc203.htm?campaign_id=rss_topEmailedStories">this article</a> in Business Week on a particular XML format (<font face="arial,helvetica,univers" class="text">XBRL</font>) for tagging financial information to various operations within a company so that it can be reported better. At first I wondered how this format will play out in the real world. Its main strong point is that it is a standard with some powerful backers behind it (the SEC is thinking about using it) which would make it well-suited for inter-firm communication. I wonder how it will play in the communication between various BUs within a company. It is not really transparent to attach functionality to an operation, you would rather delegate that functionality to a different system dedicated to it. Applying this new functionality (&#8221;reporting&#8221;) transparently would mean that an operation would get &#8220;reported&#8221; by an &#8220;reporting&#8221; system that would let it flow thru without any changes to it.<br />
I don&#8217;t think that the approach of attaching some information to an operation in order to implement some functionality (reporting) scales well either: adding envelope 1 for functionality 1 and envelope 2 for functionality 2 and envelope 3 for functionality 3 at every processing point would generate a pretty thick envelope which at one point would dwarf the content itself.<br />
Versioning could also pose some problems: if one systems tags information using the 2.1 version of the <font face="arial,helvetica,univers" class="text">XBRL, another with the version 1.0 and you send it to an external party that is using version 3.0 and is not backward compatible you would probably have to reconcile all these tags to use the appropriate version, etc&#8230; Pretty ugly stuff&#8230;</font></p>
<p><font face="arial,helvetica,univers" class="text">Anyway, what really interested me in this article was that this was a new format in which Microsoft was involved. These guys seem to be doing pretty much everything to break out of the Windows/Office cage on which their company was built. You see MS pretty much all over the map when it comes to standards, you start wondering what they are doing in all these bodies. I would assume it is part of their strategy of breaking into the corporate world  by being involved in how corporations communicate one with another. You could argue that if you control the communication channels between various systems you could actually sell MS-enabled endpoints to service these communication channels in order to gain some foothold in the corporate IT environment, but this is just speculation.<br />
Couple the involvement in all these bodies with the fact that they seem somewhat serious about opening their organization to the outside world (in a very controlled manner as always), you could easily see Microsoft morphing into a brand new company.<br />
It would be interesting to watch it unfold. </font></p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/09/a-new-play-from-microsoft/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The transparent container and LISP</title>
		<link>http://microintellia.com/blog/2007/03/06/the-transparent-container-and-lisp/</link>
		<comments>http://microintellia.com/blog/2007/03/06/the-transparent-container-and-lisp/#comments</comments>
		<pubDate>Tue, 06 Mar 2007 15:03:35 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/2007/03/06/the-transparent-container-and-lisp/</guid>
		<description><![CDATA[A while ago I wrote a post about a particular type of container that I called the transparent container (*), a container which basically binds various pieces of functionality to each other transparently.
Anyway, I was thinking today that this container exhibits features pretty close to LISP: easy binding between components, the ability to create languages [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I wrote a <a target="_blank" href="/blog/2007/02/11/the-emergence-of-the-transparent-container/">post</a> about a particular type of container that I called the transparent container (<a href="http://microintellia.com/blog/#">*</a>), a container which basically binds various pieces of functionality to each other transparently.<br />
Anyway, I was thinking today that this container exhibits features pretty close to LISP: easy binding between components, the ability to create languages pretty easily, dynamic typing to an extent, etc&#8230; I can hear a lot of people starting to complain that this is basically a new instance of reinventing the wheel, that we should all start developing in LISP in order to become more productive, etc&#8230; I think they are wrong, because there is one huge difference between this transparent container and LISP: the fact that you can isolate development between this LISP-style programming (programming in the container itself) and the regular Java programming (developing the beans that are bound together by the container developers). Which means that you can split your work-force much more efficiently according to what they do best: domain experts along with the architects would develop the application by binding it in the container, while the &#8216;regular&#8217; (if you wish) developers would code the Java beans.<br />
One strong point of the transparent container would be management: it lets you divide your tasks a lot more easily than LISP. In LISP you do not have a boundary which splits complexity, pretty much everybody is working in the same environment. If you don&#8217;t &#8216;get&#8217; LISP you are pretty much an outsider, and getting LISP is pretty rare from what I remember in university. This container brings forward some of the powers of LISP and makes them available to a small team that is comfortable with this environment, it is a lot more flexible than the all-or-nothing proposition that LISP gives you.</p>
<p><a href="http://microintellia.com/blog/#">*</a> For however has any questions about the name, I picked it out of a hat. I need a name for it so I&#8217;ll call it this way. I could call it Spring, especially since Spring is the only container coming close to it, but I decided to go for an independent name.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/03/06/the-transparent-container-and-lisp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SOA - it&#8217;s more about service management</title>
		<link>http://microintellia.com/blog/2007/02/24/soa-its-more-about-service-management/</link>
		<comments>http://microintellia.com/blog/2007/02/24/soa-its-more-about-service-management/#comments</comments>
		<pubDate>Sat, 24 Feb 2007 20:15:46 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=76</guid>
		<description><![CDATA[I was reading this article on infoQ about service registries. I was struck by the end paragraph:
I periodically get to attend meetings where someone has a vision which involves a single registry/repository to rule them all. There follows a list of all the great metadata which this single truth will &#8220;own&#8221;. Usually a can&#8217;t hear [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://www.infoq.com/news/2007/02/service-registry">this article</a> on infoQ about service registries. I was struck by the end paragraph:<br />
<em>I periodically get to attend meetings where someone has a vision which involves a single registry/repository to rule them all. There follows a list of all the great metadata which this single truth will &#8220;own&#8221;. Usually a can&#8217;t hear what they&#8217;re saying due to the sound of &#8220;Darth Vader&#8217;s Theme&#8221; trumpeting in my lugholes. Empire building.. Empire building ..</em><br />
This is a pretty fine note about an uber-centralized organization, one that is controlling its entire IT environment from a single command and control center. Which is probably not very efficient because not all services are enterprise-wide and we should not have everything available to everybody (available means available after security checks). Enterprise-wide services - the tax service (*), for example - should be part of this uber-repository, but fine grained services should not. Services particular to a BU or series of BU should not make it into this uber-repository either, but rather in repositories dedicated to them and their partners.<br />
More and more I get the impression that SOA is a lot less about Service Architecture than it is about Service Management. Governance, registries, policy management, etc&#8230;, these are simply the means to an end. The current mind-set seems to be that the best way to manage these services is by centralizing them in order to break the IT silos which each BU has created over the years as part of its operations. You need centralized control in order to identify redundant IT functionality and in order to agree on what sub-set of that functionality will be available to all the parties, I agree with this. But I also think that you should recognize the core competencies of each BU and delegate it the ownership of the IT service enabling that core competency. These IT services would be considered BU-specific and should be treated differently from enterprise-wide services (**).</p>
<p><a href="http://microintellia.com/blog/#">*</a> The tax service: When talking about an enterprise-wide service I usually give the example of a tax service that computes the taxes in a financial institution. Pretty much every transaction executed by all the systems of that financial institution in all the BUs needs to be taxed which raises the need for a taxation enterprise-wide service.</p>
<p><a href="http://microintellia.com/blog/#">**</a>  A BU-specific service may evolve into an enterprise-wide service if the demand for its functionality make it necessary. One important difference between an enterprise-wide service and a BU-specific service is that the enterprise-wide service evolves pretty slowly, every change requiring agreement from a large number of actors.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> Service management is essentially a study into the interactions between various various BUs in a large organization. These interactions will then be displayed in the interactions between the BUs&#8217; IT environments.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/02/24/soa-its-more-about-service-management/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Just felt like saying</title>
		<link>http://microintellia.com/blog/2007/02/20/just-felt-like-saying/</link>
		<comments>http://microintellia.com/blog/2007/02/20/just-felt-like-saying/#comments</comments>
		<pubDate>Tue, 20 Feb 2007 16:57:30 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=75</guid>
		<description><![CDATA[Who would&#8217;ve thought it up someone like you
Just as they brought me round
Now that they brought you down
Roundabout and roundabout
Who wants a life anyway?
Another heart has made the grade
Forget it, forget it, forget it
I don&#8217;t understand how the last card is played
But somehow the vital connection is made
]]></description>
			<content:encoded><![CDATA[<p>Who would&#8217;ve thought it up someone like you<br />
Just as they brought me round<br />
Now that they brought you down<br />
Roundabout and roundabout<br />
Who wants a life anyway?</p>
<p>Another heart has made the grade<br />
Forget it, forget it, forget it<br />
I don&#8217;t understand how the last card is played<br />
But somehow the vital connection is made</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/02/20/just-felt-like-saying/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The emergence of the transparent container</title>
		<link>http://microintellia.com/blog/2007/02/11/the-emergence-of-the-transparent-container/</link>
		<comments>http://microintellia.com/blog/2007/02/11/the-emergence-of-the-transparent-container/#comments</comments>
		<pubDate>Sun, 11 Feb 2007 13:41:09 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=70</guid>
		<description><![CDATA[I planned to write this post after a series of posts about unusual uses of the Spring framework. I have written so far only one post and I have 2 more started. I don&#8217;t have enough time to finish them (I have a small backlog of posts that I started, some 6 months ago) so [...]]]></description>
			<content:encoded><![CDATA[<p>I planned to write this post after a series of posts about unusual uses of the Spring framework. I have written so far only one post and I have 2 more started. I don&#8217;t have enough time to finish them (I have a small backlog of posts that I started, some 6 months ago) so I thought I just write this one.<br />
My posts are focused on transparent coding: how you would take your current application and apply various business concerns to it transparently without disrupting its normal state. It is a great programming technique which lets you inject new behavior into your application at small costs. It lets you make a small investment and back out of it quickly if this investment turns sour. I look at the transparent container as a binding management tool: it displays you the components of you application and lets you bind one component to another, swap one component for another, bind an advice to a series of methods, etc&#8230; It happens that some of the above features are the features of an IoC container but there is much more to this than plain inversion of control.<br />
If I see any problems with this transparent coding (I&#8217;ll use this name for lack of a better one) is that there are not that many modelling tools out there because it is a fairly new and unexplored phenomenon. Another problem that I see with it is that the behavior is injected transparently via configuration files. This approach has quite a few management problems, stemming mainly from problems in collaboration (imagine an piece of functionality whose spring.xml files are edited by a few dozen developers). The approach usually taken for this which is to specify these concerns declaratively in a Spring configuration file doesn&#8217;t scale as the number of concerns increases, it serves only as a purpose of displaying a new technique. However, Spring could be used as the basis of a platform that would manage all these concerns.<br />
As a sidenote: I see that Spring has got into allowing code for configuration, basically right now you have the option of configuring you application via code rather than simply thru XML descriptors. At the first sight this would simply mean that application configuration has gotten so complex that it requires code for doing it. I think that it also means that the bindings between various components in an application (bindings previously implemented in configuration) have got so complex that they require code for managing them. The configuration file is simply a way to manage these bindings, right now these bindings are becoming overly complex and managing them takes a lot more than configuration. I would say this version of configuring-thru-code (which is actually binding-management thru code) could be where the most interesting Spring development would occur. Code-based configuration would allow for more complex interactions between various components.</p>
<p>I would give this example to display the benefits of code-based &#8220;configuration&#8221;: let&#8217;s say that you have a work-flow engine which models work-flows as a series of tasks, a work-flow engine that currently uses Spring for configuring the work-flows, for defining the flow sequences, etc&#8230; You become pretty successful and you sell your engine to a company that uses it for managing dozens of work-flows made up of dozens of tasks.<br />
Now, your customer would like to have some business analysts create new work-flows on the fly (let&#8217;s say for simulating a business process), in other words they would need to create, test, discard, record dozens of work-flows looking for, let&#8217;s say, the business process with the lowest cost. It is obvious that the configuration file approach (declaring the relationships in spring.xml) is not going to do it because what is required over here is actually implementing a whole work-flow testing process. Now, your work-flow engine revolves around configuring work-flows, so one approach would be to develop or buy an app for testing workflows (any workflow, not necessarily from your application) that would be used by the business analysts looking for the lowest-cost flow and then plug this application into your work-flow configuration via Spring&#8217;s new code-based configuration.<br />
The code-based configuration would actually act as a bridge between the work-flow testing system and the work-flow engine itself.<br />
The whole theme of this example is that you are given the option to manage the configuration of your application how you want to (in the above example you wold manage the configuration of your work-flows by piggy-backing on a work-flow testing app), once this configuration cannot be met by the usual spring.xml file. This approach should be taken only when the complexity of the configuration raises to the point where it warrants this investment.</p>
<p>One last point about the transparent container called spring. It has been argued very well that Spring is non-intrusive in the application code. Well, it is intrusive, not in code, but in your application management process. If you are using spring for bindings management you are so dependent on it, you may not be able to continue functioning about it. But about this, maybe some other time.</p>
<p>The transparent container is a container that manages bindings between components and let&#8217;s you do it in the manner that you consider best suited to your needs: thru config files, code, etc&#8230; This manner is transparent to the component themselves.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> I think that managing components relationships in Spring thru code is where the next cool things will occur in the Spring framework.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit 2:</a> While I have not tried managing complex relationships in Spring thru code I think that this should be an easy process with a low entry-barrier. If this process requires a deep understanding of the Spring framework I&#8217;m afraid that it will never be used on the scale it could and it should.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/02/11/the-emergence-of-the-transparent-container/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Handling large data sets in SQL</title>
		<link>http://microintellia.com/blog/2007/02/10/handling-large-data-sets-in-sql/</link>
		<comments>http://microintellia.com/blog/2007/02/10/handling-large-data-sets-in-sql/#comments</comments>
		<pubDate>Sat, 10 Feb 2007 03:55:30 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=72</guid>
		<description><![CDATA[For the past week I have been working on an SQL script that was updating a few dozens millions of records in a table. It was very interesting and it was my first occasion at handling data sets so large. I first suggested Tom Kyte&#8217;s famous approach to updating very large tables, but given the [...]]]></description>
			<content:encoded><![CDATA[<p>For the past week I have been working on an SQL script that was updating a few dozens millions of records in a table. It was very interesting and it was my first occasion at handling data sets so large. I first suggested Tom Kyte&#8217;s <a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330" target="_blank">famous approach</a> to updating very large tables, but given the fact that the team never tried something like this and that the table was so large they decided to play safe and do the job with regular update statements.<br />
What did I learn while working on this?<br />
1) Update in small chunks otherwise your logs will blow-up your partition. You have to find a way to split your data in chunks that you know will not explode your rollback segments.<br />
2) Use indexes very carefully!!!! In my case I needed to build some hash temporary tables in order to hit some indexes, and in order to build those tables efficiently I needed to figure out how to hit other indexes. The path carved thru the data was pretty interesting&#8230;<br />
3) Always determine the execution plan before carrying out the query in order to see what indexes you are hitting. A &#8217;set showplan on, set noexec on&#8217; should do the job on Sybase.<br />
4) Know your data. Among other things it will help you find the appropriate indexes. It will also help you choose between different queries, check out <a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:104409700346588112" target="_blank">this</a> for an example of 2 different queries which return the same result but are tuned for different data sets.<br />
5) This is not really related to SQL, but I thought I should say it: Don&#8217;t bother to optimize your data structures in Java unless you really have to. Don&#8217;t spend hours debating whether you should use a TreeMap vs a HashMap for a Map that will hold at best a few hundred items, do this when you are handling large data sets. The reason for this is that optimizing a data structure for access is so dependent on data (on how it is dispersed, on what you are querying, on how this data will grow, etc&#8230;) that you don&#8217;t have enough input for a small data set.<br />
6) Efficient data access is tied to the data itself very strongly.<br />
7) Prepare for this. I have been reading for the past months <a href="htp://asktom.oracle.com" target="_blank">asKTom</a>, <a href="http://jonathanlewis.wordpress.com/" target="_blank">Jonathan Lewis&#8217;s blog</a> and <a href="http://tkyte.blogspot.com/" target="_blank">Tom Kyte&#8217;s blog</a>. These are good resources for starting.</p>
<p>Gotta go!!</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> While reading this post I started thinking about the duality of data vs functionality. Most developers spend most of their time dealing with functionality, I think they are missing out on a few interesting things. Another thought would be that if you have a problem regarding data the best person to talk about it would probably be a DBA, it probably has seen data more data than you can handle in a wide variety of formats. Just a thought.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/02/10/handling-large-data-sets-in-sql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Language re-use</title>
		<link>http://microintellia.com/blog/2007/02/06/language-re-use/</link>
		<comments>http://microintellia.com/blog/2007/02/06/language-re-use/#comments</comments>
		<pubDate>Tue, 06 Feb 2007 19:08:31 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=71</guid>
		<description><![CDATA[I was reading this article about some guy implementing some JSR that I don&#8217;t really care about. What I really liked about this article is this quote:
Until java has first class support for properties, some syntax will need to be adopted. EL was created for needs similar to beans binding and is a natural fit. [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://www.infoq.com/news/2007/02/jsr-295-update">this article</a> about some guy implementing some JSR that I don&#8217;t really care about. What I really liked about this article is this quote:<br />
<em>Until java has first class support for properties, some syntax will need to be adopted. EL was created for needs similar to beans binding and is a natural fit. No point in inventing a new duplicate syntax.</em><br />
You are probably familiar with the concept of re-using classes, packages, frameworks, etc&#8230;, but are you familiar with the concept of re-using languages? Pretty neat&#8230;<br />
This reminds me of another guy who worked on a natural language processor: he had to &#8216;integrate&#8217; some linguists into the application, basically the linguists had to create some rules according to which text was supposed to be parsed. The linguists needed a very flexible environment for expressing those rules, something very similar to a computer language. So my friend looked around and decided that the linguists will learn regular expressions and create their rules in regular expressions. He basically re-used a language too. Pretty neat again.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/02/06/language-re-use/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Customizing applications transparently thru interceptions</title>
		<link>http://microintellia.com/blog/2007/02/04/customizing-applications-transparently-thru-interceptions/</link>
		<comments>http://microintellia.com/blog/2007/02/04/customizing-applications-transparently-thru-interceptions/#comments</comments>
		<pubDate>Sun, 04 Feb 2007 21:13:28 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=68</guid>
		<description><![CDATA[In this post I will be considering applying business logic transparently thru interception for some specific scenarios and discuss the pros and cons of such an approach.
Let&#8217;s say that you have a content-management system (CMS) and a forum application, the CMS being written in Java. The CMS is used for managing an online paper and [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I will be considering applying business logic transparently thru interception for some specific scenarios and discuss the pros and cons of such an approach.<br />
Let&#8217;s say that you have a content-management system (CMS) and a forum application, the CMS being written in Java. The CMS is used for managing an online paper and the forum is used for managing a community of users interested in your content.<br />
This is the original CMS model:<br />
public interface PublishingBean{</p>
<blockquote><p>// this is the method that publishes an item<br />
public void publishItem(Item item) throws PublishingException;</p></blockquote>
<p>}<br />
public class DefaultPublishingBean implements PublishingBean{</p>
<blockquote><p>public void publishItem(Item item) throws PublishingException{</p>
<blockquote><p>// format the item<br />
formatItem(item);// save it hard-disk<br />
saveItem(item);</p>
<p>// syndicate it<br />
populateRSSFeed(item);</p></blockquote>
<p>}</p>
<p>// some formatting: adding menus, putting up banners, etc&#8230;<br />
protected void formatItem(Item) throws PublishingException{<br />
// format the item<br />
}</p></blockquote>
<p>}<br />
DefaultPublishingBean is registered in Spring to implement the publishing bean:<br />
&lt;bean id=&#8221;publishingBean&#8221; class=&#8221;DefaultPublishingBean&#8221;/&gt;</p>
<p>Now let&#8217;s say that you want to integrate the CMS with the forum. The integration will be very simple, at the end of each item you may or may not put a link which would create or update a thread on the forum related to that item. Part of this integration is a new publishing bean which contains logic interacting with the forum:<br />
public class ForumPublishingBean implements PublishingBean extends DefaultPublishingBean{</p>
<blockquote><p>// this method prepares the bean so that it doesn&#8217;t display the link to the forum<br />
public void donotDisplayForumLink (boolean bool){<br />
// set a flag<br />
}// this method prepares the bean so that it links to the forum in &#8216;moderated&#8217; mode<br />
public void displayModeratedForumLink(boolean bool){<br />
// set a flag<br />
}</p>
<p>protected void formatItem(Item) throws PublishingException{<br />
// if &#8216;do not display forum link&#8217; mode is on then do not display the item</p>
<p>// if &#8216;display moderated forum link&#8217; mode is on then put-up then display a moderated link</p>
<p>// else display the link at the bottom of the item.<br />
}</p></blockquote>
<p>}<br />
ForumPublishingBean just needs to re-format the item, it delegates saving to disk, syndication, etc&#8230; to the super-class because this functionality didn&#8217;t change.<br />
Right now the ForumPublishingBean replaces DefaultPublishingBean for publishing beans by the means of this bean definition:<br />
&lt;bean id=&#8221;publishingBean&#8221; class=&#8221;ForumPublishingBean&#8221;/&gt;</p>
<p>OK, this was the set-up, now we are ready to start on the topic of this post. Everything is running OK, editors are happy,the community keeps talking on the forum when, all of a sudden, you hire Ann Coulter and Charles Kas an editor ;-), both in the &#8216;Politics&#8217; section of your newspaper.<br />
The result of hiring Ann is that a flame war starts raging on the forum any time Ann posts an article. The business starts getting fidgety and decide that Ann&#8217;s articles should not have the link towards the forum, this would limit the flames. This is business requirement #1: that Ann&#8217;s, and only Ann&#8217;s, articles should not provide a link towards the forum.<br />
Next, Charles is not the flamethrower that Ann is, but he is not small potatoes either, as a result a lot of his items are getting flamed on the forum. The business decides that Charles&#8217;s articles should link to the forum in &#8216;moderated&#8217; mode. This is business requirement #2.<br />
Next, let&#8217;s leave politics aside for a while ;-), Vista is about to launch and the technology section of the paper is getting flamed on the forum by both Linux and MS die-hards. The business decides that for a while every article containing the words Vista should have moderated links to the forum and it doesn&#8217;t know when this rule will expire. This is business requirement #3.</p>
<p>So you have 3 requirements, quite different one from the other, very limited in scope and which should not pollute in any way either the CMS or the forum&#8217;s code base. Moreover, you are not sure in what direction these requirements will evolve, they are pretty specific. Do these requirements actually mean that you need to integrate the authors into the forum-CMS integration? Or do they mean that some sections, &#8216;Politics&#8217; in this case, need moderation? It is pretty early to draw any assumptions from these business requirements because they are very poor.<br />
One way to implement these business requirements without making any broader assumptions is to intercept the calls to the Publishing Bean and inject this very specific business logic. This could be done with 3 around advices as shown below:</p>
<p>import org.aopalliance.intercept.MethodInterceptor;<br />
import org.aopalliance.intercept.MethodInvocation;<br />
// this interceptor will check if the author of the Item that is getting published<br />
// should have its forum link removed and remove its forum link<br />
public class class BlockForumLinkByAuthorInterceptor implements MethodInterceptor{</p>
<blockquote><p>private List blockedAuthors = new ArrayList();<br />
public void setBlockedAuthors(List blockedAuthors){..}public Object invoke(MethodInvocation invocation){</p>
<blockquote><p>// get the cmsItem that is getting published<br />
Item cmsItem = (Item)invocation.getArguments()[0];<br />
if(blockedAuthors.contains(cmsItem.getAuthor())){</p>
<blockquote><p>ForumPublishingBean publishBean = (ForumPublishingBean)invocation.getThis();<br />
// block this author&#8217;s forum link<br />
publishBean.donotDisplayForumLink(true);// publish the item<br />
publishBean.publish(cmsItem);</p></blockquote>
<p>}else{</p>
<blockquote><p>// go ahead with the original method<br />
invocation.proceed();</p></blockquote>
<p>}</p></blockquote>
<p>}</p></blockquote>
<p>}</p>
<p>// this interceptor will check if the author of the Item that is getting published<br />
// should have its forum link moderated and moderate it<br />
public class class ModerateForumLinkByAuthorInterceptor implements MethodInterceptor{</p>
<blockquote><p>private List moderatedAuthors = new ArrayList();<br />
public void setModeratedAuthors(List authors){..}public Object invoke(MethodInvocation invocation){</p>
<blockquote><p>// get the cmsItem that is getting published<br />
Item cmsItem = (Item)invocation.getArguments()[0];<br />
if(moderatedAuthors.contains(cmsItem.getAuthor())){</p>
<blockquote><p>ForumPublishingBean publishBean = (ForumPublishingBean)invocation.getThis();<br />
// moderate this author&#8217;s forum link<br />
publishBean.displayModeratedForumLink(true);// publish the item<br />
publishBean.publish(cmsItem);</p></blockquote>
<p>}else{</p>
<blockquote><p>// go ahead with the original method<br />
invocation.proceed();</p></blockquote>
<p>}</p></blockquote>
<p>}</p></blockquote>
<p>}</p>
<p>// this interceptor will check if the section of the Item that is getting published<br />
// should have its forum link moderated and moderate its forum link<br />
public class class ModerateForumLinkByKeywordsInterceptor implements MethodInterceptor{</p>
<blockquote><p>private List moderatedKeywords = new ArrayList();<br />
public void setModeratedKeywords(List moderatedKeywords){..}public Object invoke(MethodInvocation invocation){</p>
<blockquote><p>boolean moderateFlag = false;<br />
// get the cmsItem that is getting published<br />
Item cmsItem = (Item)invocation.getArguments()[0];<br />
foreach(moderatedKeyword in moderatedKeywords){</p>
<blockquote><p>if(cmsItem.getText().indexOf(moderatedKeyword) != -1){<br />
moderateFlag = true;<br />
}</p></blockquote>
<p>}<br />
if(moderateFlag){</p>
<blockquote><p>ForumPublishingBean publishBean = (ForumPublishingBean)invocation.getThis();<br />
// moderate this story&#8217;s forum link<br />
publishBean.displayModeratedForumLink(true);</p></blockquote>
<p>// publish the item<br />
publishBean.publish(cmsItem);<br />
}else{</p>
<blockquote><p>// go ahead with the original method<br />
invocation.proceed();</p></blockquote>
<p>}</p></blockquote>
<p>}</p></blockquote>
<p>}<br />
The above examples are woven into the application via this XML configuration:<br />
&nbsp;&nbsp;&nbsp;&lt;!&#8211; The previous bean becomes the target of the advices above &#8211;&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id=&#8221;publishingBeanTarget&#8221; class=&#8221;ForumPublishingBean&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!&#8211; Register the 3 advices &#8211;&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id=&#8221;blockForumLinkByAuthorInterceptor&#8221; class=&#8221;BlockForumLinkByAuthorInterceptor&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&#8221;blockedAuthors&#8221; value=&#8221;Ann Coulter&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id=&#8221;moderateForumLinkByAuthorInterceptor&#8221; class=&#8221;ModerateForumLinkByAuthorInterceptor&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&#8221;moderatedAuthors&#8221; value=&#8221;Charles Krauthammer&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id=&#8221;moderateForumLinkByKeywordsInterceptor&#8221; class=&#8221;ModerateForumLinkByKeywordsInterceptor&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&#8221;moderatedKeywords&#8221; value=&#8221;Vista&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!&#8211; Set-up the proxy which replaces the original ForumPublishingBean &#8211;&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id=&#8221;publishingBean&#8221; class=&#8221;com,springframework.aop.framework.ProxyFactoryBean&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&#8221;proxyInterfaces&#8221; value=&#8221;ForumPublishingBean&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&#8221;interceptorNames&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;blockForumLinkByAuthorInterceptor&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;moderateForumLinkByAuthorInterceptor&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;moderateForumLinkByKeywordsInterceptor&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&#8221;target&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!&#8211; point this proxy to the original ForumPublishingBean &#8211;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref=&#8221;publishingBeanTarget&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;</p>
<p>And this is pretty much it. The code above was using around advices, depending on the use-case you could have used other types of advices. Well, so we have implemented these very specific business rules transparently and without any intrusion into the application&#8217;s original code, which is not too bad. Now comes the hard part: when should you take this approach? (You know, the hard question is not how, but rather why ;-))</p>
<p>I think this approach should be taken when you are given some special business rules which you cannot generalize. In the above example it was pretty hard to determine what was driving the editing of the forum links: the author&#8217;s type, the words used in the CMS Item, etc&#8230; In a sense this approach buys you time during which you can watch the demand for a particular business requirement grow or stagnate and then decide whether to make an investement in handling it or not. In our example the interceptors that moderates forum links by author lets you see if this behavior is needed before modeling and implementing it: if you have 20 authors that need to be moderated then it probably pays off to model the moderation process, if you have only one it doesn&#8217;t make sense to invest time in it.</p>
<p>You could also take this approach when you don&#8217;t see the benefit of setting up a whole infrastructure in order to implement this business rules, when for example it doesn&#8217;t make sense to change the user management module in order to change the behavior of 2 or 3 users. In my experience I had a few cases where I needed to change a whole user module because one user was not supposed to click on a button, I wish I could have simply intercepted his calls and inject this very specific behavior.</p>
<p>You could also use this approach if you need to implement a simple business requirement that is set to expire soon. In our case we decided to moderate every CMS item that contains the word Vista in it. This business rule will probably be dropped in a few months once the excitement over Vista wears off. It doesn&#8217;t make sense to make a significant investment of code into something that will expire so soon, if you can get by with a small hack you may consider it. The beauty of this example is that you can shed this hack very easily when the need for it expires .</p>
<p>You should note that this example doesn&#8217;t scale very well and that it uses values hard-coded in configuration files. If this causes problems in your application, then probably you should not follow this example. Getting into scale problems is actually an indication of the fact that this interception framework is not servicing your needs anymore and that you should probably do something different about implementing this requirement.</p>
<p>One potential source of problems is the mushrooming of these business-related interceptors. Mushrooming code usually points to bad design, mushrooming interceptors points pretty much to the same thing. You should watch out if these interceptors are getting out of whack and once a certain threshold is met find a way to consolidate them, probably by making some generalizations about their roles.</p>
<p>One interesting thing about these interceptors is that they are not cross-cutting concerns, rather they are very specific about their target. I initially thought about using the title &#8216;Customizing applications transparently thru AOP&#8217; but then I realized that I am not talking about aspects (which are cross-cutting concerns), but about very specific joinpoints.<br />
Another interesting thing is that these are business-related interceptors and not infrastructure interceptors.</p>
<p>Well, this concludes this post. I wanted to have more time to talk about this, but I do not have the time. Feel free to drop some comments, I find this type of development pretty interesting.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> I chose Ann Coulter and Charles Krauthammer because I needed an example of a business concern very limited in scope yet very important to the business. I didn&#8217;t have time to cook-up a better example so I just thought this one out. It is a bit off the wall, but again, I simply didn&#8217;t have the time. I chose some controversial authors at random in order to set-up a very specific business rule.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit</a> As far as I am concerned I think the this approach is just another way of getting your development cycle closer to the business needs. This approach avoids building a whole infrastructure for very small business requirements and rather it lets you watch these business requirements grow before making an IT investment in them.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/02/04/customizing-applications-transparently-thru-interceptions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tagging</title>
		<link>http://microintellia.com/blog/2007/01/30/tagging/</link>
		<comments>http://microintellia.com/blog/2007/01/30/tagging/#comments</comments>
		<pubDate>Tue, 30 Jan 2007 20:30:05 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=66</guid>
		<description><![CDATA[Tagging is pretty much synonimous with Web 2.0 and collaboration. It seems to pop-up all-over the place: you tag movies, posts, your bookmarks on del.icio.us, etc&#8230; I think it is pretty popular because it requires minimal input from the user: just give us 2, 3 words about this page and we will take it from [...]]]></description>
			<content:encoded><![CDATA[<p>Tagging is pretty much synonimous with Web 2.0 and collaboration. It seems to pop-up all-over the place: you tag movies, posts, your bookmarks on del.icio.us, etc&#8230; I think it is pretty popular because it requires minimal input from the user: just give us 2, 3 words about this page and we will take it from here. In today&#8217;s fast-paced world you cannot ask a user to provide significant input, it simply doesn&#8217;t have the time. You also do not have the resources to process this significant input, because processing it would require human readers, rather than software and these readers cost a lot. Another reason why tagging is popular is that it is also good for categorizing because it is a way of categorizing an item AFTER you have consumed it and not BEFORE, as a result you could argue that it splits items into bins a lot better than setting up rigid categories up-front.</p>
<p>But this flexibility has an ugly reverse: the low signal-to-noise ratio which comes from many people using the same tags for tagging very different items. There are 40,000 words in the English language which you could use for tags and a probably a dozen million web-pages which are tagged in del.icio.us (del.icio.us hit 1 million users sometime ago, I assume each of them has at least 10 tagged items). Do you think that tagging can scale meaningfully at this level? You will try to apply various algorithms in order to differentiate the items being tagged (number of tags, frequency, time, etc&#8230;) but at the end of the day you will end up with very large datasets which need to be processed MANUALLY.</p>
<p>Which brings me to the next problem: the huge cost with false-positives: in order to register a false-positive (a page that has been tagged incorrectly and that doesn&#8217;t service your needs) you need to consume the information, to read it, and this takes usually a lot of time.<br />
I gave up long time ago to retrieve good information by navigating my del.icio.us tags and trying to find common things with other people, the amount of information that I have to READ (which is a very expensive process) in order to find something worthwhile is ridiculous. I find that it is a lot more effective to keep reading from good sources of information in order to get an understanding of a new field rather than data-mine del.icio.us for my needs. It takes more time, but it is a lot less expensive.</p>
<p>One last problem with tagging is that it is a level playing field: a developer with 2 years of experience ranks on the same level as a someone who worked in, let&#8217;s say, transaction management for the last 15 years. If both of them tag different pages with the tag &#8216;transaction-management&#8217; which one do you think is the page that better reflects the tag? Actually, let me re-phrase that: which page reflects the tag better for who? The pages tagged by the transaction-management specialist will probably be useful for someone working with high-level transactions and working on transaction propagation, while the pages tagged by the junior developer will be useful for another junior developer starting to learn about ACID. You could say that tagging works best in a homogenous environment where everybody expects pretty similar results from the same tag.</p>
<p>Tagging has been with us for a while, but so far it is used for pretty simple associations. I&#8217;m still waiting for the &#8220;wow&#8221; moment&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/01/30/tagging/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REST and WS - part 2</title>
		<link>http://microintellia.com/blog/2007/01/27/rest-and-ws-part-2/</link>
		<comments>http://microintellia.com/blog/2007/01/27/rest-and-ws-part-2/#comments</comments>
		<pubDate>Sat, 27 Jan 2007 21:14:34 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=65</guid>
		<description><![CDATA[I wrote a while ago a post about the differences between REST and WS. I&#8217;d like to re-visit this issue today.
I like REST conceptually, but I find it too crude. It revolves around 3 or 4 very simple operations which, its proponents claim, scale at the size of the Internet. Well, you can do pretty [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a while ago a post about the differences between REST and WS. I&#8217;d like to re-visit this issue today.<br />
I like REST conceptually, but I find it too crude. It revolves around 3 or 4 very simple operations which, its proponents claim, scale at the size of the Internet. Well, you can do pretty much everything with these simple operations, it is the value which is added to these simple operations (how you mix them up) that really matters. The packages coming out of these simple operations should scale, not the operations themselves. It is disingenious to claim that you can do everything with these operations, you can do exactly the same thing if you code in binary, but I have not seen many people advocating this for a while (even though they probably were quite a few when the compilers appeared ;-)).</p>
<p>The lack of standardization in REST has some subtle side-effects, one of them being, of course, the fact that you have to work extra hours because in REST you have to code by hand the interaction with a different party. In WS you can look up the webservice, invoke a code generator and immediately generate the connection to that WS, in about 15 seconds you are ready to communicate with the other party. In REST you usually get a spec highliting the URLs which serve as entry points into the other system from which you derive the communication schema and you will go off to implement it. I am sure that quite a few REST developers out there have built their own generators for building the connection with a REST-enabled endpoint, but not everyone is proficient in such tasks. WS seriously beats REST when it comes to ease of use.</p>
<p>I like from REST the fact that the URLs can act as a level of indirection which in turn makes customization a lot easier. Small example: user A and user B use the same URLs from the same REST service, but user A has a platinum account while user B has the bronze account. Well, the application could serve more/better data to user A (more search results for example) thru the same URL by looking up the user&#8217;s account and making up all sort of decisions. In WS you cannot do this right now, you do not have the concept of a session yet (even if WS-Conversation is being spec-ed out) and the most implementations map a class or session bean to an end point and not the other way around (you need the endpoint mapped to a process easily and not vice-versa in order for that endpoint to become a level of indirection). The good thing about WS is that when this conversational feature will get implemented it will get implemented transparently.<br />
One bad thing about WS is the fact that it seems to have set its mind on spec-ing out every conceivable form of communication. The spec is starting to mushroom and is being stretched in any conceivable direction in order to cover every God-forsaken issue. This is obviously a problem, but I think the market will solve it. It is a pretty simple case of supply and demand: if an issue has a big demand (in other words is considered important by the majority of OASIS members) OASIS (the supply side) will produce a quality spec covering it and the app server vendors will implement this spec. If the demand for such an issue is low, then it will not get as much attention from OASIS and it will either be put on the back-burner or a low-quality spec (reflecting the lack of resources dedicated to it and the poverty of use-cases due to little input) will be produced.<br />
As far as the vendors are concerned they will concentrate on what is business-relevant and drop the rest of the protocols, simply because they will  not have the resources to implement every spec that comes out of OASIS. It doesn&#8217;t make sense to implement things your customers don&#8217;t need only because they happen to be on a piece of paper that some committe wrote (it would make a lot more sense to have third-parties implement the most obscure parts of the WS spec and have the application server vendors plug these implementations into their app servers, but this is a side thought). I think that the vendors will focus on what is mostly needed (WS-Transaction being a good example) and then delegate the rest of the spec either to a third party, which could be open source projects under the OASIS umbrella, or the recycle bin ;-). I hope that the vendor community will take this market-based approach to the WS specs comig out of OASIS, it is a very flexible and efficient approach, and not get moored in a sea of meaningless and purposeless specs.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> Well, you probably got used to this by now, but this post was also written in a hurry. I&#8217;m sorry, can&#8217;t do much about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/01/27/rest-and-ws-part-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>New category</title>
		<link>http://microintellia.com/blog/2007/01/08/new-category/</link>
		<comments>http://microintellia.com/blog/2007/01/08/new-category/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 23:37:49 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=61</guid>
		<description><![CDATA[I created a new category &#8220;Econo-computing&#8221; which addresses issues in the computing field seen from an economics point of view. I am not sure what will go in this category, but I find this field interesting and I will continue to explore it.
]]></description>
			<content:encoded><![CDATA[<p>I created a new category &#8220;Econo-computing&#8221; which addresses issues in the computing field seen from an economics point of view. I am not sure what will go in this category, but I find this field interesting and I will continue to explore it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/01/08/new-category/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Supply and demand in a computing environment</title>
		<link>http://microintellia.com/blog/2007/01/08/supply-and-demand-in-a-computing-environment/</link>
		<comments>http://microintellia.com/blog/2007/01/08/supply-and-demand-in-a-computing-environment/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 23:36:35 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=60</guid>
		<description><![CDATA[I was talking in a previous post about how the demand for interceptions in an application was not met properly by the supply until AOP came about and created a scalable process that could handle interceptions efficiently. I am thinking that you could generalize this case and state that this mis-match between the demand for [...]]]></description>
			<content:encoded><![CDATA[<p>I was talking in a previous <a target="_blank" href="/blog/2007/01/08/interceptors-and-scalability/">post</a> about how the demand for interceptions in an application was not met properly by the supply until AOP came about and created a scalable process that could handle interceptions efficiently. I am thinking that you could generalize this case and state that this mis-match between the demand for a behavior or feature and the supply for that behavior or feature betrays an ineffiency in the computing environment (language + IDEs + frameworks + containers + etc&#8230;) that tried to address the issue. In the example above implementing interceptions following strict OOP concepts was certainly possible, but it was unfeasible.<br />
In a market environment high demand that cannot be met by supply usually translates into a high price. In the above example the high price would have been the cost of developing and, even more, maintaining, the system in which interceptions were implemented in pure OOP fashion. In the example of <a target="_blank" href="/blog/2006/08/16/c-programming-is-not-oop/">OOP done in C</a>  the cost would have been the cost of coordinating a team of programmers and the cost of turning a programmer into a human compiler.</p>
<p>Mismatches between demand and supply in a computing environment sometimes appear as the inability to scale. If in the interceptions example the inability to scale resulted in mushrooming of sub-classes which would basically re-implement the original methods with some interception logic around them, in the example of <a target="_blank" href="/blog/2006/08/16/c-programming-is-not-oop/">OOP done in C</a> the inability to scale was the inability to have a large team of developers follow some coding rules that would have resulted an OOP-style coding. These 2 examples could not scale, or in other words as the demand (for interceptions) was increasing, the supply (the OOP environment in which these interceptions were coded) could not keep up. Inability to scale a behavior is basically a facet of a mis-match between demand and supply for a particular feature.<br />
It would be interesting to see how you could address these mismatches. Looking at how the interceptions and C++ problems were addressed it would appear that it requires some large investment of some kind. This investment, which usually takes the form of a framework which addresses the problem, is strategic to a certain extent, since it will basically keep your costs down for a certain period of time.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> I know that I am stretching some concepts over here, but quite frankly I don&#8217;t care. I&#8217;ll be continuing to explore this field as I find it pretty interesting.<br />
<a href="http://microintellia.com/blog/#">P.P.S.</a> I wrote this post also in a hurry, I may come back to it. I gotta go right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/01/08/supply-and-demand-in-a-computing-environment/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interceptors and scalability</title>
		<link>http://microintellia.com/blog/2007/01/08/interceptors-and-scalability/</link>
		<comments>http://microintellia.com/blog/2007/01/08/interceptors-and-scalability/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 16:20:51 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=59</guid>
		<description><![CDATA[I was thinking about the roots of AOP, about what makes it different from others programming paradigms, about what defines it and it came down to interceptions. AOP is pretty much about intercepting method calls and doing something before or after. This interception mechanism grew into a full-fledged language in the case of AspectJ or [...]]]></description>
			<content:encoded><![CDATA[<p>I was thinking about the roots of AOP, about what makes it different from others programming paradigms, about what defines it and it came down to interceptions. AOP is pretty much about intercepting method calls and doing something before or after. This interception mechanism grew into a full-fledged language in the case of AspectJ or into a full-fledged binding mechanism in the case of Spring AOP.<br />
Intercepting method calls was doable in plain OOP but it was pretty hard to do. You could, for example, extend a class and override a method with method that would intercept the original call, do something around it and then call the original method. You could do this, but this could not scale. You could not do this for dozens of methods and you could not turn an interceptor on or off as your application would need. In comes AOP which takes this interception mechanism and builds a whole environment around it so that you can apply interceptions as you need. Both AOP environments I mentioned (AspectJ and Spring AOP) scale very well so that it can match the demand of interceptions with the supply, either thru a programming language, as in the case of AspectJ, or declaratively, as in the case of Spring AOP.<br />
So I would say that AOP is the main way to implement interception-based programming in an OOP environment.</p>
<p>P.S. I wrote this post in a hurry, and unfortunately I could not expand on some aspects <img src='http://microintellia.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> of this (the supply and demand of interceptions was something I wanted to explore more in detail). I would probably re-visit this post later.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2007/01/08/interceptors-and-scalability/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Clean code, meaningful names, black-boxes, glass-boxes</title>
		<link>http://microintellia.com/blog/2006/12/14/clean-code-meaningful-names-black-boxes-glass-boxes/</link>
		<comments>http://microintellia.com/blog/2006/12/14/clean-code-meaningful-names-black-boxes-glass-boxes/#comments</comments>
		<pubDate>Thu, 14 Dec 2006 16:56:45 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=56</guid>
		<description><![CDATA[I was thinking about the good practice of using names for classes and methods which describe what they implement and I came to the conclusion that one benefic side effect of this practice is that it promotes to a certain extent the principle of black-boxes. Meaningful names and clean code discourage a developer from peeking [...]]]></description>
			<content:encoded><![CDATA[<p>I was thinking about the good practice of using names for classes and methods which describe what they implement and I came to the conclusion that one benefic side effect of this practice is that it promotes to a certain extent the principle of black-boxes. Meaningful names and clean code discourage a developer from peeking into the black-box (a method on a class for example) to see what it actually does. Methods that only do what their name states (such as <strong>authorizeCreditCard</strong> which just authorizes a credit card and doesn&#8217;t also commits the purchase order) also enforce the black-box mechanism. Transparent development could be regarded as one way to avoid cluttering business logic classes with outside concerns (such as security, transactionality, etc&#8230;).<br />
I find that it helps to have meaningful names closer to the business process, in a sense they should be readable by business people. A class which CAN be read by a business person has a bigger chance to be aligned with the process it implements. When the class and method names used in the code start deviating from names used by business analysts it is a good indication that you should re-factor it in order to align it better with the business process.<br />
When dealing with real black-boxes (i.e. interfaces) meaninful names are actually mandatory, bad names will end up obfuscating the process that these interfaces abstract.</p>
<p><a href="http://microintellia.com/blog/#">P.S.</a> I know I should have dropped this post in the &#8216;Stating the obvious&#8217; category, but I don&#8217;t have such a category ;-).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/12/14/clean-code-meaningful-names-black-boxes-glass-boxes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interacting with a large number of people</title>
		<link>http://microintellia.com/blog/2006/12/13/interacting-with-a-large-number-of-people/</link>
		<comments>http://microintellia.com/blog/2006/12/13/interacting-with-a-large-number-of-people/#comments</comments>
		<pubDate>Wed, 13 Dec 2006 01:51:28 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=55</guid>
		<description><![CDATA[Large organizations come with large number of people. As you work in such an organization you will interact with many people and it is important that you interact with them efficiently.
Email is the form of communication that you will use the most for interacting with other people. One good thing about email is the fact [...]]]></description>
			<content:encoded><![CDATA[<p>Large organizations come with large number of people. As you work in such an organization you will interact with many people and it is important that you interact with them efficiently.<br />
Email is the form of communication that you will use the most for interacting with other people. One good thing about email is the fact that it remains on record, once you have received an email you can archive it for further reference. It is important that the archiving process is efficient, you should be able to retrieve a particular message fast if you need to.<br />
Once you start in a project you should determine how to split the messages you receive from your co-workers and put them in multiple bins with meaningful names. You should be able to drop the same message in multiple bins, each bin is essentially an index which should be populated with this message if it fits the purpose. Outlook is a product which is far superior to Lotus Notes from this point of view (at least as far as I see it).<br />
The number of bins should be kept under control, you don&#8217;t want to mushroom them. The bin should be regarded as an index which allows you to retrieve information fast, rather than a collection of loosely-related items.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/12/13/interacting-with-a-large-number-of-people/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some benefits of open APIs and mash-ups</title>
		<link>http://microintellia.com/blog/2006/12/11/some-benefits-of-open-apis-and-mash-ups/</link>
		<comments>http://microintellia.com/blog/2006/12/11/some-benefits-of-open-apis-and-mash-ups/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 16:45:04 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=54</guid>
		<description><![CDATA[I was talking to Derek about what would open APIs mean for the big corporations providing them. In particular we were talking about the last paragraph in this Jon Udell post:
I don&#8217;t think ads are the endgame for Gmail. The real monetizable asset will be the APIs that we&#8217;re all going to help them create, [...]]]></description>
			<content:encoded><![CDATA[<p>I was talking to <a href="http://microintellia.com/blog/derekdiary.blogsome.com" target="_blank">Derek</a> about what would open APIs mean for the big corporations providing them. In particular we were talking about the last paragraph in this Jon Udell <a href="http://weblog.infoworld.com/udell/2006/02/08.html" target="_blank">post</a>:<br />
<em>I don&#8217;t think ads are the endgame for Gmail. The real monetizable asset will be the APIs that we&#8217;re all going to help them create, and the value-adding services that Google will be able to build on top of them.</em><br />
Well, I don&#8217;t thing that the value adding services will add that much value if the come from Google. One value-adding service currently being developed would be a mash-up of GMail, GOffice and GSpreadsheet (or whatever their names are) which would try to port the behavior of MS Office on-line. Quite frankly, I don&#8217;t think that they will get really far, apart from associating some document types with some applications. What would be actually cool would be to take this GApps and create very customized applications which would target a particular business process (as I was suggesting <a href="/blog/2006/08/10/object-linking-and-embedding/" target="_blank">here</a>). The value would be in this mash-up, rather than in the free applications which compose it. But this cannot be done by Google, because they don&#8217;t scale in diversity (they don&#8217;t scale in terms of developer and customer-relations hours to dedicate to customize their own apps) to target this incredibly fragmented market. Google, at best, can provide templates for various business processes across various business lines, templates which would be used by small entrepreneurs (which could pay a fee for using such a template) and customized ferociusly. Google could turn into a huge repository of business processes templates, but I would be surprised if they do it because the revenues this business would generate would pale in comparison to their search engine&#8217;s revenues. They would not be even a drop in the bucket. It would make sense for a small-timer to do this, it would pay off.</p>
<p>Anyway, I am diverging. To get back to what I had in mind: one benefit of open APIs that stands out is reaching niche communities very effectively: Let&#8217;s take the group of &#8220;Chihuaua owners in the Hamptons&#8221; (wouldn&#8217;t you like to reach this group ;-)). Someone could pretty easily whip-up a site targetting them which would collect books from Amazon related to chihuauas, which could compare prices for the same book across Barnes&amp;Nobles, Amazon, Chapters, use Google Maps for locating veterinary doctors, search ebay for latest chihuaua items, put together a discussion group on Google Groups, etc&#8230; All these APIs are pretty much open and free, what is needed is an entrepreneur that would realize that demand exist for putting all these services together (supposing again that this demand exist) and then sell very targeted solutions to these very small groups. Everybody would profit: the small entrepreneur has a business, ebay gets a cut on the items they sell, the ebay seller sells a product, Amazon sells another book they may not have sold, and Hamptons&#8217;s Chiuauas are spoiled rotten ;-). I think in the long run it is this very small entrepreneurs that would take the greatest advantage of these free APIs rather than the giants because they cannot create these applications which are very refined. To a certain extent you could say that the giants &#8220;do not scale in diversity&#8221; and that they &#8220;outsource&#8221; peddling their wares (books on Amazon, auctions on eBay, etc&#8230;) to niche groups or niche businesses to small-timers. In a very broad sense using small entrepreneurs which with your APIs target niche markets is similar to outsourcing your access to a very fragmented market.<br />
In the <a href="/blog/2006/08/10/object-linking-and-embedding/" target="_blank">example above</a> I was using the community of head-hunters which could benefit from these mash-ups, there are dozens of other business lines that could benefit from these applications delivered with a surgical precision.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/12/11/some-benefits-of-open-apis-and-mash-ups/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interceptors for manipulating a live data-feed</title>
		<link>http://microintellia.com/blog/2006/12/05/interceptors-for-manipulating-a-live-data-feed/</link>
		<comments>http://microintellia.com/blog/2006/12/05/interceptors-for-manipulating-a-live-data-feed/#comments</comments>
		<pubDate>Tue, 05 Dec 2006 16:22:13 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=53</guid>
		<description><![CDATA[I did one cool thing today: I wrote an interceptor that manipulates a data set in order to create various tests. It is interesting, the interceptor was retrieving data from a live data-feed and changing it according to various patterns which were further tested. I really like the fact that I could take this data-feed [...]]]></description>
			<content:encoded><![CDATA[<p>I did one cool thing today: I wrote an interceptor that manipulates a data set in order to create various tests. It is interesting, the interceptor was retrieving data from a live data-feed and changing it according to various patterns which were further tested. I really like the fact that I could take this data-feed and customize it across my test needs rather than getting the guy at the end of the feed to send data in the patterns that I neeed for testing. The interceptor was created in a plug-and-play fashion so that various test patterns could be created and tested easily. One cool thing about it was that I could replicate a scenario which was really time-dependent.<br />
Neat.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/12/05/interceptors-for-manipulating-a-live-data-feed/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A short-coming of tech books</title>
		<link>http://microintellia.com/blog/2006/11/29/a-short-coming-of-tech-books/</link>
		<comments>http://microintellia.com/blog/2006/11/29/a-short-coming-of-tech-books/#comments</comments>
		<pubDate>Wed, 29 Nov 2006 16:29:04 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=52</guid>
		<description><![CDATA[I&#8217;ve been reading a few tech books lately and all of them are concerned with OO concepts, how to apply various solutions to various problems, how to create an agile/loosely-coupled/flexible/etc&#8230; architecture, how to interact with domain experts, etc&#8230;
What is sorely missing is literature on how to deal with a software product which has already been [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading a few tech books lately and all of them are concerned with OO concepts, how to apply various solutions to various problems, how to create an agile/loosely-coupled/flexible/etc&#8230; architecture, how to interact with domain experts, etc&#8230;<br />
What is sorely missing is literature on how to deal with a software product which has already been built. All the above issues are to be used when starting with a clean slate, something that doesn&#8217;t happen all the time. Starting with a clean slate is the best that a software developer can hope for, more often than not the developer will get parachuted in a no man&#8217;s land of duplicate code, outdated documentation, conflicting requirements, etc&#8230;<br />
I understand that putting together a &#8216;perfect project&#8217; is crucial to avoiding trouble down the road, but I find the current tech books to be a bit disingenious in the sense that they start from the best development scenario, that is they start before one line of code has been written.</p>
<p>I think someone should write a &#8216;Software Development: stories from the trenches&#8217; book, it is badly needed.  I would buy one.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/11/29/a-short-coming-of-tech-books/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An interesting side-effect of AJAX</title>
		<link>http://microintellia.com/blog/2006/11/23/an-interesting-effect-that-ajax-has-on-development/</link>
		<comments>http://microintellia.com/blog/2006/11/23/an-interesting-effect-that-ajax-has-on-development/#comments</comments>
		<pubDate>Thu, 23 Nov 2006 17:03:16 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=50</guid>
		<description><![CDATA[I was reading this interview on infoq with Gavin King  when I came across this paragraph:
&#8220;Second (change in SEAM) is the new concurrency model. With the death of the old paradigm of coarse-grained synchronous request/response, the assumption that concurrent requests in the same session are very rare is totally turned on its head. It&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading this <a target="_blank" href="http://www.infoq.com/news/2006/11/seam-11-Gavin-King-interview">interview</a> on <a target="_blank" href="http://www.infoq.com">infoq</a> with Gavin King  when I came across this paragraph:<br />
&#8220;Second (change in SEAM) is the new concurrency model. With the death of the old paradigm of coarse-grained synchronous request/response, the assumption that concurrent requests in the same session are very rare is totally turned on its head. It&#8217;s now absolutely essential to have strong constructs for managing session-level concurrency.&#8221;</p>
<p>It looks like one major change that AJAX brought to development is concurrent access to state that was previously regarded in general as non-concurrent . It is interesting to see how the access to data in a concurrent fashion will be implemented. SEAM suggests that you should do this on the server, as according to this quote: &#8220;If you want to build an Ajaxified JSF application using ICEfaces or Ajax4JSF, you will run into all kinds of performance and concurrency problems if you don&#8217;t use Seam.&#8221;<br />
Another way to implement concurrent access to shared state would be in the client: all the AJAX calls will be routed thru a manager that would determine (based on some configuration, etc&#8230;) which calls are to be serialized and which are to be executed immediately. BUT, AJAX is an asynchronous protocol, so you cannot serialize these calls at the client level because you do not know the order in which they will be executed on the server&#8230; <a href="http://microintellia.com/blog/#">*</a><br />
So, it looks like we will have to deal with shared state more and more. The fact that this shared state is usually distributed and replicated (for handling fail-over, for example) makes it even more interesting. It would be interesting to see how this unfolds&#8230;<br />
<a href="http://microintellia.com/blog/#">Later edit</a>: I think you could serialize method calls that use AJAX calls in the browser by running them in a browser-based container that waits for a response from ther server to an AJAX call before making the next call. I don&#8217;t think I expressed it correctly though and I don&#8217;t have time to dwell on it&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/11/23/an-interesting-effect-that-ajax-has-on-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Issues with legacy systems</title>
		<link>http://microintellia.com/blog/2006/11/22/issues-with-legacy-systems/</link>
		<comments>http://microintellia.com/blog/2006/11/22/issues-with-legacy-systems/#comments</comments>
		<pubDate>Wed, 22 Nov 2006 19:02:08 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=44</guid>
		<description><![CDATA[It is possible that a legacy system on its way to being decommisioned will try to push legacy behavior to a new system. One example could be a new tax services that has to get input from an old system handling commodity trades. The new tax system has its interface for communicating with the outside [...]]]></description>
			<content:encoded><![CDATA[<p>It is possible that a legacy system on its way to being decommisioned will try to push legacy behavior to a new system. One example could be a new tax services that has to get input from an old system handling commodity trades. The new tax system has its interface for communicating with the outside world, but the old commodity service is sending tax information using its proprietary format. More than that, the commodity system requires some behavior to be implemented on the system it communicates with: the old &#8220;if the 4-th char in the message is a &#8216;C&#8217; then do this, else do that&#8221;. It is pretty clear that this is pretty bad, after all you are trying to scrap the &#8220;if the 4-th char &#8230;&#8221; and replace it with a new set of rules that will be relevant for as long as possible. *</p>
<p>There are a few ways to deal with this type of requests. The first thing to do is to refuse outright trying to deal with this legacy behavior, after all in 5, 10 years the new system will have plenty of legacy behavior on its own. Pushing forward legacy behavior is not a good strategy either, you are basically putting more work at each new wave of system renewal.</p>
<p>Sometimes this is not possible, for example, it is possible that no development is done on the old system within a reasonable time-frame.<br />
One way to interact with this system is to isolate the legacy behavior that will get discarded away from the core of the applications and make it available to this system in some form or another. Abstraction would help very well in this regard, if the business process your application is implementing is well abstracted then you could create a customized implementation that contains the legacy behavior, implementation which could be discarded when the legacy system gets decommissioned for real. If you are working in a flow-based environment you could create a partition of your engine dedicated to legacy workflows and code your legacy behavior in a workflow deployed in this partition. Customized communication channels which talk to the legacy system pushing legacy behavior onto you should help as well for isolating behavior that is prone to become obsolete.</p>
<p><a href="http://microintellia.com/blog/#">*</a>On a side note: decommissioning a system should actually be the side effect of decommissioning a set of business rules (and not vice-versa).</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/11/22/issues-with-legacy-systems/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Applying business logic transparently</title>
		<link>http://microintellia.com/blog/2006/11/17/applying-business-logic-transparently/</link>
		<comments>http://microintellia.com/blog/2006/11/17/applying-business-logic-transparently/#comments</comments>
		<pubDate>Fri, 17 Nov 2006 15:32:17 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=48</guid>
		<description><![CDATA[We are all familiar with the concept of applying various concerns transparently to an application. These concerns are, more often than not, infrastructure concerns such as: concurrency, data-caching, security, running a component in a particular transactional context, etc&#8230; A component should not know whether the data it works with comes straight from the DB or [...]]]></description>
			<content:encoded><![CDATA[<p>We are all familiar with the concept of applying various concerns transparently to an application. These concerns are, more often than not, infrastructure concerns such as: concurrency, data-caching, security, running a component in a particular transactional context, etc&#8230; A component should not know whether the data it works with comes straight from the DB or from a cache, it should also not know how it is secured within the application. The component should be agnostic of the operational environment.<br />
I think we can apply the same mind-set to business logic. An object describing a FX trade should not care about how it is taxed or how it interacts with various legal entities, these business-logic concerns (such as taxation) should be applied transparently to this object in the appropriate places. To a large extent I am stating the obvious: behavior that is external to a component should be developed outside this component. I see, however, a relationship between applying infrastructure concerns transparently and applying business logic concerns transparently and I see also the failures to do so which end up in components that are bloated and very tightly coupled. I see this relationship, but I find myself unable to express it, I can say only that a good separation of concerns can be achieved if we try to think of various business logic components as components that have to be applied transparently onto a running application.<br />
One last point: a (key) difference between infrastructure concerns and business logic concerns is that the former are way better delimitated: security is so different from data-caching that it is impossible (actually, we should not use this word, everything, even the most horrific architecture, is very much possible, check <a target="_blank" href="http://tkyte.blogspot.com/2006/11/worst-practices.html">this</a> out if you don&#8217;t think so) to build a component that handles these 2 concerns at the same time. Business logic concerns on the other hand are a lot more fuzzy and harder to delimitate.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/11/17/applying-business-logic-transparently/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SOA and N-tier architectures</title>
		<link>http://microintellia.com/blog/2006/10/31/soa-and-n-tier-architectures/</link>
		<comments>http://microintellia.com/blog/2006/10/31/soa-and-n-tier-architectures/#comments</comments>
		<pubDate>Tue, 31 Oct 2006 22:30:41 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=43</guid>
		<description><![CDATA[Later Edit: I would take what is written below with a grain of salt. It is not N-tier architectures which gave birth to SOA, but rather the drop in communication costs which made feasible connecting various applications which previously could not be connected. At about the same time EJBs were released and coincidentally they became [...]]]></description>
			<content:encoded><![CDATA[<p><a href="#">Later Edit:</a> I would take what is written below with a grain of salt. It is not N-tier architectures which gave birth to SOA, but rather the drop in communication costs which made feasible connecting various applications which previously could not be connected. At about the same time EJBs were released and coincidentally they became the main way to connect applications. As time moved on the EJB complexity started to become the main cost of communication (once bandwidth became cheap the costs of communication moved up the stack onto the protocols used for communication) and competitors to EJBs (Spring, REST, etc&#8230;) started to appear and claim marketshare. As the costs of communication between nodes went down (first the physical costs, then the costs of connecting to the applications thru a thick stack) more and more applications started to get inter-connected and issues such as overlapping responsabilities between applications, release management in a distributed environment, etc&#8230; started to become the main costs of communication. SOA governance (a set of policies for interactions between applications and enforcement mechanisms for these policies) is the main attempt at solving these problems and at pushing these costs down.<br />
The term N-tier architecture used below is a bit stretched: while most of N-tier applications consists of 3 tiers (presentation, business logic, data storage), I used the N-tier architecture term for an architectural style in which functionalities are assigned to a tier and each tier is hosted and developed on a dedicated application, a tier being more or less close to a node.</p>
<p>And now the original post: </p>
<p>The more I read about SOA the more I get the feeling that it grew out of N-tier architectures and that one its boosters was the so maligned EJBs.</p>
<p>When you are looking at an N-tier architecture you will probably notice the communication between various nodes providing various services to each other: this node gives you data on commodities, another one on users, another one on tax transactions, etc&#8230;  The result of such an architecture is a proliferation of services on various nodes, services which have to be managed one way or another. In comes SOA to the rescue which manages the relationships between the services provided by various nodes thru governance (it is a lot more complex that this, but let&#8217;s keep things simple). It is the distributed nature of the N-tier architecture that created all these conversations between nodes, conversations which were then turned into services, services which started being managed with an SOA mind-set.<br />
I think I am right when I say that SOA comes from distributed computing and that once the interaction between various computing nodes reaches a certain threshold it becomes mandatory to manage this interaction. If I was to look at the various distributed computing platforms I would pick EJBs as the ones which were dominant in the last 4-5 years, the ones with the greatest mind and market share. The built-in distributed nature of the EJBs has been frequently denounced as resource-hungry, backward, one-size-fits-all design. It would be ironic if this very nature played a part in the birth of the SOA paradigm, a paradigm that promises to start a whole new era in IT development.<br />
What would be interesting to watch is if the various design patterns that the EJBs have spawned (business delegate, service locator, data transfer object, etc&#8230;) and that were sometimes denounced as band-aids to EJBs&#8217; horrific problems  will appear in one form or another in the IT environment which enables SOA. After all, the above designs patterns are mostly concerned with distributed computing.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> Communication between various systems existed long before EJBs, this is for sure. However, the EJBs increased the communication between various systems due to their distributed nature.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/10/31/soa-and-n-tier-architectures/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Economics applied to software design</title>
		<link>http://microintellia.com/blog/2006/10/18/economics-applied-to-software-design/</link>
		<comments>http://microintellia.com/blog/2006/10/18/economics-applied-to-software-design/#comments</comments>
		<pubDate>Wed, 18 Oct 2006 19:52:14 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=41</guid>
		<description><![CDATA[I have picked up economics as a hobby. It is a very interesting field and I think it pertains significantly to software development since it deals primarily with the efficient allocation of scarce resources.
Anyway, I started looking at various applications thru an economists&#8217; glasses. Let&#8217;s take a look at various P2P applications. Peers on a [...]]]></description>
			<content:encoded><![CDATA[<p>I have picked up economics as a hobby. It is a very interesting field and I think it pertains significantly to software development since it deals primarily with the efficient allocation of scarce resources.<br />
Anyway, I started looking at various applications thru an economists&#8217; glasses. Let&#8217;s take a look at various P2P applications. Peers on a P2P network have a weird economic status: they are both consumers and producers (distributors?) of the same good, namely content, a peer downloads content from another peer and then publishes the same content on the P2P network. Well, this is pretty interesting, but what I found more interesting was the differentiation between various P2P networks. BitTorrent emerged as the dominant P2P network primarily because its P2P client distributes the content (the product in our example) as soon as it gets it. The rest of the P2P networks do not do this, they wait for the whole file to be downloaded before making it available to the rest of the network. When you treat a BitTorrent peer as a producer/distributor you see that it makes its product (the content shared by the P2P network) available much sooner than a peer on a competitor&#8217;s network, you can say that a BitTorrent peer has a greatly reduced time-to-market than a peer on a competing P2P network. And we all know that companies with reduced time-to-market usually beat the competition ;-), this would explain both BitTorrent&#8217;s incredible success as well as the rush to copy its economic model (namely having the peer share content as it receives it rather than at the end of the file reception which translates into a reduced time-to-market)  by the competing P2P networks.</p>
<p>Another software design aspect which I tried to treat from an economist&#8217;s perspective is the managed environment (EJB containers, IoC containers, AOP-enabled environments, etc&#8230;). In the managed environment the developer is focusing exclusively on the business logic that has to be implemented while outside actors manage transparently issues such as concurrency, security, transactions, etc&#8230; Such a managed environment ressembles a vertically integrated organization which outsources its tasks (<strong>out-tasking</strong> is a pretty popular word these days, did you know that ;-)?) to a specialized work-force. Such an environment adapts itself to a changing environment more easily because it is the sum of some loosely coupled entities rather than a rigid entity whose elements are hard-coupled one to another. The modules that make up an application running in a managed environment would be very similar to the resources making up a multi-national: the modules/resources can be loaded/hired or let go according to the application/multi-national&#8217;s needs as these needs come or go. The result is a leaner application that responds to changes in the business environment more easily (again similar to a multi-national). The application would be a composition of various modules carried out by different actors, just like a multi-national is increasingly a composition of various tasks carried out by different actors. I&#8217;m not sure if I am seriously going off-road&#8230;</p>
<p>Anyway, I find mixing software design and economic theory fascinating and I will try to continue to treat various software design issues from an economic perspective. Comments welcome!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/10/18/economics-applied-to-software-design/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hacking 2.0</title>
		<link>http://microintellia.com/blog/2006/10/15/hacking-20/</link>
		<comments>http://microintellia.com/blog/2006/10/15/hacking-20/#comments</comments>
		<pubDate>Sun, 15 Oct 2006 16:45:10 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=40</guid>
		<description><![CDATA[I&#8217;m looking at how the business processes become more and more complicated and I get a feeling of deja-vu. Business processes are becoming more and more complex, they are increasingly inter-related, they are created by persons not trained in security and more often than not they are done by ear. A business process resembles more [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m looking at how the business processes become more and more complicated and I get a feeling of deja-vu. Business processes are becoming more and more complex, they are increasingly inter-related, they are created by persons not trained in security and more often than not they are done by ear. A business process resembles more and more a piece of software in the 70&#8217;s before electronic pirates started looking in it for exploits.  Currently a business process is created for primarily for carrying out an economic activity, there is not much thought  given to the possibility that someone could exploit it. One more thing which brings this 70&#8217;s flavor to it would be the legal vacuum in which business processes dabble (is someone guilty if it registers with an organization and that organization lets its user role access to an asset it should not have access to?).<br />
The question that I am asking myself is: is it possible to &#8220;hack&#8221;<a href="http://microintellia.com/blog/#">*</a> a business process, that is, to find weaknesses in it and exploit them? Is it possible to twist it to ends not considered when the process was originally conceived?I think this question is an early question, the current low level of complexity of business processes doesn&#8217;t allow much room for extensive re-engineering of the original process. So far the re-engineering of a business process is more often than not an innoucous mash-up and not a hidden attack against various assets. I searched the web for information on <a target="_blank" href="http://www.google.com/search?hl=en&#038;q=business+process+hacking&#038;btnG=Search&#038;meta=">business process hacking</a> and I didn&#8217;t find much, an attack against <a target="_blank" href="http://www.boalt.org/biplog/archive/000615.html">ChoicePoint</a> and another one against Lexis Nexis. It could be that (just as computer hackers in the 70&#8217;s) these hackers are flying below the radar and not attracting much attention.<br />
I don&#8217;t think we will see business process hacking on a massive scale for a while, but it remains a possibilit which should be seriously considered when designing a process.</p>
<p><a href="http://microintellia.com/blog/#">*</a> In this posting I will use the term &#8220;hack&#8221; as with the meaning of gaining unauthorized access to various capabilities (not necessarily computer systems) due to the new complexity found in business processes. I am not including here the larger and more accepted term of tinkering with a &#8220;black-box&#8221; in order to gain understanding of its internal workings.<br />
<a href="http://microintellia.com/blog/#"><br />
Later Edit</a>: From <a target="_blank" href="http://www.regdeveloper.co.uk/2006/11/01/policy_primer/page2.html">this article</a> (read to the end) it looks like process re-engineering is slowly emerging as a threat of disruption of normal business activity.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/10/15/hacking-20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spring config as code</title>
		<link>http://microintellia.com/blog/2006/10/08/spring-config-as-code/</link>
		<comments>http://microintellia.com/blog/2006/10/08/spring-config-as-code/#comments</comments>
		<pubDate>Sun, 08 Oct 2006 16:31:30 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=35</guid>
		<description><![CDATA[I was reading (belatedly) Crazy Bob&#8217;s rant about Spring. It is an interesting point, the fact that your configuration settings become code because they do what code is meant to do, that is, they implement a desired behavior. Yes, the lines between configuration and code blur, just look at the number and size of various [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading (belatedly) <a target="_blank" href="http://crazybob.org">Crazy Bob</a>&#8217;s rant about <a target="_blank" href="http://crazybob.org/2006/01/i-dont-get-spring.html">Spring</a>. It is an interesting point, the fact that your configuration settings become code because they do what code is meant to do, that is, they implement a desired behavior. Yes, the lines between configuration and code blur, just look at the number and size of various XML descriptors which are popping up everywhere. So, I would say the Bob was right about the fact that your Spring XML descriptor is code.<br />
However, he was definitively wrong about Spring configuration file being intrusive. Yes, you need such a file for your application to be bootstrapped correctly, but you do not need to abide by Spring&#8217;s XML descriptor. The Spring XML descriptor is a window onto a particular binding mechanism, there is nothing that requires you to use this particular file. You can set-up your configuration syntax, write a parser around it, plug this parser into the IoC for application bootstrap and have Spring use your own bootstrapper with your own semantics. It is not going to happen over-night, you will probably need an in-depth knowledge of Spring, but if you are concerned about developing in an intrusive environment you may want to look at it. (One danger of going this route is that your syntax will diverge from Spring&#8217;s syntax and new additions to the framework&#8217;s syntax (such as AOP) will have to be re-developed according to your environment. In the case of an IoC container using a different syntax is very similar to forking a project and has pretty much the same synchronisation problems.)<br />
Another option would be to create your syntax, have a translator which converts your XML descriptor into an Spring XML descriptor and have your application run on the Spring descriptor your translator would produce. You are running the same dangers as before since you are basically forking a language.<br />
Or you could take a look at the <a target="_blank" href="http://www.springframework.org/docs/reference/xsd-config.html">XML namespaces</a> that have been added to Spring 2.0 which include <a target="_blank" href="http://www.springframework.org/docs/reference/extensible-xml.html">extended XML authoring</a> and have all your problems resolved (you can find a small tutorial <a target="_blank" href="http://blog.interface21.com/main/2006/08/28/creating-a-spring-20-namespace-use-springs-abstractbeandefintionparser-hierarchy">here</a>). I really like the fact that the Spring community decided to do away with the only thing in the framework which cold have been regarded as intrusive and to do it in style ;-). Again, the Spring XML descriptor was just a window onto a binding mechanism which could have been replaced/enhanced with another window at various costs. It was not intrusive, it just carried a lot of weight. Well, this weight disappeared. Nice move.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/10/08/spring-config-as-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A large array of rich clients</title>
		<link>http://microintellia.com/blog/2006/10/03/a-large-array-of-rich-clients/</link>
		<comments>http://microintellia.com/blog/2006/10/03/a-large-array-of-rich-clients/#comments</comments>
		<pubDate>Tue, 03 Oct 2006 20:31:57 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=38</guid>
		<description><![CDATA[The latest buzz in IT is &#8220;rich clients&#8221;. Well, apart from SOA. And AJAX ;-).
It is interesting to see how some people consider this as the emergence of a new paradigm (even though client-server development was hot only a decade or so ago) and consider that this new paradigm would change significantly the IT landscape.
While [...]]]></description>
			<content:encoded><![CDATA[<p>The latest buzz in IT is &#8220;rich clients&#8221;. Well, apart from SOA. And AJAX ;-).<br />
It is interesting to see how some people consider this as the emergence of a new paradigm (even though client-server development was hot only a decade or so ago) and consider that this new paradigm would change significantly the IT landscape.<br />
While this development will certainly change IT I don&#8217;t think you will see a lot of functionality getting developed on the rich client. What plays against implementing functionality on the rich clients apart from the UI layer is their wide range and the need to avoid duplication across potentially very different environments. Suppose that you have your standard B2C application. Suppose that you need to support both a customer that wants this application to run in a browser and another that wants to have it run inside a Flash component. You may very well have a customer wanting to run this application on a mobile device. In order to avoid code duplication across these very different environments you would have to minimize whatever code runs on the client. Chances are that you will leave only UI code on the client (this is the very minimum) and move everything else to the server. Chances are you will standardize the communication between the rich clients and the server containing the business logic. The large number of rich client types and the need to maximize the return on your investment (code in this example) will push most of the development on the server.<br />
Opening your APIs to the outside world Amazon-style leads to a client agnostic environment, which in turn leads to the possibility of creating many clients across various platforms. Since the funtionality residing on the client has been shrunk down to UI it follows, roughly, that client development is becoming cheap and this renders the option of deploying your application across various rich client types more possible.</p>
<p>One the side issue of web development vs the rich client development:<br />
I still hear developers scoffing at the HTML + Javascript combination while lauding Swing and its environment. Their primary irk at HTML is that it is pretty hard to code in JS all these dropdowns and these menus that interact one with another. They are missing 2 important points: One - there are quite a lot of JS libraries out there that do this for you (for free or for a small sum of money), and two - HTML freed the developer from working on the UI. I have not seen yet a Swing editor that lets a graphic designer work on a desktop app&#8217;s screen the way Dreamweaver lets it work on a page. HTML empowered the division of labor in a regular IT shop. If you think of it, a developer is not supposed to dabble in ergonomics, user interaction, usability and other concepts that pertain to UI development and that are second-nature to a graphic designer, it is the graphic designer that should be in control of them. What these developers actually needed but seemed unable to express was an event-driven development environment in which they could apply their expertise instead of struggling with clunky JS. Well, JSF just gave them that.<br />
The benefits of HTML work along 2 axis: the division of labor and the usability of the tool used for manipulating the UI. This is one reason for which I think that rich clients are a bit over-rated, because most of the development environments for the new rich clients don&#8217;t come close to providing these benefits. AJAX (especially GWT) puts the developer back in UI development and provide it with a spartan interface. One tool standing out would be Flash. I&#8217;m not familiar with UI for mobile phones, I dabbled a bit in J2ME. I hope that these rich clients will not throw the developers back in UI development, but it sure looks like it. This is pathetic.<br />
I didn&#8217;t sleep too well last night and it obviosly shows. Too bad&#8230;<br />
<a href="http://microintellia.com/blog/#">Later edit:</a> From <a target="_blank" href="http://www.regdeveloper.co.uk/2006/11/10/eclipse_five_years/">this article</a> it looks like the Eclipse RCP project aims to abstract the various rich clients platforms so that you could port the client easily across various platforms. If the Eclipse RCP manages to make the client portability easier it would obviate one of my points (about the need to move as much logic as possible to the server in order to accomodate a heterogenous client environment). I wish the Eclipse RCP a lot of success, especially in abstracting the mobile devices UI interfaces, those Midlets are begging to be let go.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/10/03/a-large-array-of-rich-clients/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mobile transition</title>
		<link>http://microintellia.com/blog/2006/10/03/mobile-transition/</link>
		<comments>http://microintellia.com/blog/2006/10/03/mobile-transition/#comments</comments>
		<pubDate>Tue, 03 Oct 2006 13:56:06 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=39</guid>
		<description><![CDATA[I was reading this article. Interesting development&#8230; It looks like the mobile devices are starting to have the computational resources (CPU, memory, disk space) that make the creation of complex software for them a reality. However, there is one huge obstacle for the development of complex software for mobile devices: the small dimensions of the [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a target="_blank" href="http://www.experientia.com/blog/utum-usability/">this article</a>. Interesting development&#8230; It looks like the mobile devices are starting to have the computational resources (CPU, memory, disk space) that make the creation of complex software for them a reality. However, there is one huge obstacle for the development of complex software for mobile devices: the small dimensions of the screen and (for a while) the lack of ergonomics needed to exploit this screen efficiently. Usability will take on a new meaning when you have to interact with an user thru a 2 inch by 2 inch window&#8230;<br />
One more interesting thing about the increasing computational power of mobile devices. The re-appearance of the rich-client architecture coincided with the appearance of the smart phone. It would be interesting to see that once the smart phone will be able to host a &#8220;thin&#8221; client (i.e. a browser which requires a 6 Meg download ;-)) if the rich client architecture will go back to sleep and everything will be thin-client again.<br />
Interesting to watch&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/10/03/mobile-transition/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The assembly line</title>
		<link>http://microintellia.com/blog/2006/09/19/the-assembly-line/</link>
		<comments>http://microintellia.com/blog/2006/09/19/the-assembly-line/#comments</comments>
		<pubDate>Tue, 19 Sep 2006 21:22:43 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=34</guid>
		<description><![CDATA[A while ago I worked on a project that was laid-out as an assembly line: it had an entry point which did some work after which it sent a message out to a queue. This queue was taking the message, did some work, transformed it and send it out to another queue. And so on&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I worked on a project that was laid-out as an assembly line: it had an entry point which did some work after which it sent a message out to a queue. This queue was taking the message, did some work, transformed it and send it out to another queue. And so on&#8230; At the end something was produced that was stored in a DB. It was the first time I saw this architecture and I found it interesting. It is essentially message-passing done in a sequential order, in this particular project there was no branching, no task could pass a message to multiple dependent tasks. It is obvious that the architecture could support branching, but there was no need for it in this particular project.<br />
In this posting the term &#8220;task&#8221; will represent a task that is deployed on a node in a cluster.<br />
I grew interested in this architecture because of the similarity it has with an assembly line. I am interested in economic concepts applied to software development and such similarities attract my attention. So, rather than talk in this post about message passing programming (you can find some good literature on the web) I&#8217;ll take a look at the effects of this architecture from a managerial point of view and I will compare this architecture to the same architecture running in a single JVM. You can set-up an interaction similar to an assembly line in one JVM by passing messages between various business logic beans. From the computer science point of view the main difference between the 2 architectures is the treatment of state. If the process that is carried out on this assembly line requires that state is kept across the whole process then a distributed assembly line is probably not the best choice. If you do go ahead with this architecture then you will have to find a way to propagate this state from task to task across a cluster.</p>
<p>So what would be side-effects of this architecture?<br />
The first and most important side-effect is that the failure of a task doesn&#8217;t block the process, the rest of the items that have to be processed go on. Error reporting becomes more fine-grained, but also more difuse. You don&#8217;t have to scan a log that records every step of the process in order to get to the task&#8217;s stack trace because the node on which you have the log is dedicated to that particular task. One problem is that the error which is reported is particular to that task, you do not get the benefit of seeing the whole process dumped in a stack trace. In order to determine what went wrong you have to back-track from the current task to the previous task and in order to capture the whole information pertaining to that process instance. Trying to do this along a process spread across a cluster is not the easiest thing&#8230; In order to make this more easier you would have to propagate information considered helpful from task to task in order to report errors more meaningfully.<br />
We would also have fine grained scalability. Once the process has been split into tasks and the communication between these tasks implemented you can scale each task independently of another. The result is that a computationally-intensive task cand be carried out over a larger part of the cluster than one that doesn&#8217;t require so many resources. The bad thing about fine grained scalability is that sometimes you need coarse-grained scalability. For example, let&#8217;s say that your organization plans to increase the usage of this process by a factor of 4, it is moving from processing 1000 items to 4000 items. You would basically have to scale the computational resources for every task 4 times and then test the new cluster. For a process with a large number of tasks it could be tedious.</p>
<p>Another bad side-effect is the difficulty with which you version such an architecture. If your process spreads across a whole cluster you may have to replicate the whole cluster and make sure that all the relationships between tasks are maintained in the new version. If you have a high tolerance to pain you may try to mix-and-match tasks from different versions: for example task 15 from version 4 would be related to task 16 from version 3 while waiting messaged from task 14 deployed in version 2, 4 and 5.</p>
<p>One good point about this architecture which is being brought up is the fact that you could reuse a task. Well, this doesn&#8217;t really apply because code-reuse is related to the specificity of a task: the more specific is a task, the less the potential for reuse.</p>
<p>To conclude this posting I would say that this architecture is a pretty good architecture when a process consists of a series of transformations, it decomposes the process meaningfully. Most of the side-effects are related to the length of the process, so it would help to keep the number of tasks under control. In order to better manage your process you may find that you may have to propagate additional information from task to task apart from the tasks require for carrying out their work.<br />
If you have any other thoughts on this particular architecture or you have worked with such processes please drop a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/09/19/the-assembly-line/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Über architects and über developers</title>
		<link>http://microintellia.com/blog/2006/09/15/uber-architects-and-uber-developers/</link>
		<comments>http://microintellia.com/blog/2006/09/15/uber-architects-and-uber-developers/#comments</comments>
		<pubDate>Fri, 15 Sep 2006 21:53:02 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=33</guid>
		<description><![CDATA[Sometime ago I was going thru the codebase of a project in order to become more accustomed with it when I detected a code-smell: an interface used for error handling had 2 very similar methods: one for producing a list of issues and another one for taking a list of issues and producing another list [...]]]></description>
			<content:encoded><![CDATA[<p>Sometime ago I was going thru the codebase of a project in order to become more accustomed with it when I detected a code-smell: an interface used for error handling had 2 very similar methods: one for producing a list of issues and another one for taking a list of issues and producing another list of issues from it. The methods were so similar to the point of being identical, and an inspection of the class tree derived from this interface confirmed my suppositions: the second method was basically appending the issues from the first method to the input list.</p>
<p>Obviously, this is a pretty bad error. The result was, among other things, a lot of copy and paste, a lot of redundant code and a lot of gotchas. This was pretty bad. I don&#8217;t know why, but the first thing that got into my mind was that this thing should be scrapped, which was obviously a very bad thing. Solely the fact that that code has gone from a half of dozen rounds of testing and has been deployed in production for a year made this code very valuable, because re-testing a new code-base implementing the same functionality would have been prohibitive. The correct way to look at it was not as at a pile of garbage, but rather as at some building blocks that could be used further. New contracts should have been developed for better alignment with the process which was getting implementing and the existing code blocks should have been adapted to these new contracts.</p>
<p>I was once listening to a JEE expert talking about a failed JEE project. He was talking with the lead architect and pointed out a flaw in their architecture. The architect decided to neglect the flaw and go ahead because time was running out. The end-result, according to the JEE expert, was that 12 months later the work of 40 developers was scrapped because of that flaw. I refuse to believe this. I cannot believe that the work done by those developers for one year could not be salvaged. I don&#8217;t know. I have seen projects going the way of the do-do bird but at the end various pieces could be salaged from the mess they were in. For example, a catalog module of an e-commerce application that never went live could be abstracted and plugged into another application (say, an application managing photo portofolios). Sometimes the application is way less than the sum of its parts&#8230;</p>
<p>Regarding the team in which you are working: odds are pretty good that you will not get a Rod Jonson to architect your application and that your team will be composed from pretty ordinary developers. Well, they are the people with whom you will develop your applications. Chances are they will make mistakes, chances are you will make mistakes, what is important is to deliver what you have to deliver. You have to find value in what has been developed and exploit that value as much as possible. (Looking at what has been developed from a functional perspective helps). Chances are whatever you are working on will change later and become obsolete. You have to deal with this change, and waking up one day to declare a whole code-base obsolete is not the right way to go about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/09/15/uber-architects-and-uber-developers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REST and SOAP</title>
		<link>http://microintellia.com/blog/2006/08/31/rest-and-soap/</link>
		<comments>http://microintellia.com/blog/2006/08/31/rest-and-soap/#comments</comments>
		<pubDate>Thu, 31 Aug 2006 21:15:10 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=4</guid>
		<description><![CDATA[I have started reading on REST-type architectures (I recommend this intro in particular). It is an interesting exercise to compare them to SOAP, one of the main differences being the amount of information a client has to know about the remote system it is interacting with. With SOAP the client must know the whole API [...]]]></description>
			<content:encoded><![CDATA[<p>I have started reading on REST-type architectures (I recommend this <a href="http://www.xfront.com/REST.html">intro</a> in particular). It is an interesting exercise to compare them to SOAP, one of the main differences being the amount of information a client has to know about the remote system it is interacting with. With SOAP the client must know the whole API stack in order to be able to carry out a series of actions while a REST client gets passed the resource for its next actions as it progresses. To go back to the example in the above intro: as the REST client searches the catalog it is given URIs which can be used for carrying out certain actions (viewing an article, adding it to cart, etc…). A REST client just needs to agree on the semantics of the data (how do you specify the URI for viewing an article or adding it to the shopping cart) with the server and then it just needs to call those URIs when it needs a particular action taken.<br />
In contrast, a SOAP client needs to know the whole server API before engaging in a conversation with the server. It needs to know what method to call and what types to use in order to retrieve a product, get product information, add it to shopping cart, etc… It needs all these before else it doesn’t know what to do.<br />
The REST architecture is very similar to the world wide web: a human being browses a page, sees some links, if they are interesting it follows them, etc… The SOAP architecture is, to a certain extent, similar to a human being using Microsoft Office: if you do not know the bazillion buttons and dropdowns MS Office comes with you cannot use it. In order to use MS Office you need to know its user guide, similar to having to know the API of a SOAP server in order to use it.<br />
I like REST, conceptually for now, because it gives me the same feeling as when I was studying distributed computing in university: you have a node, you specify its relationships with other nodes, you set it up it in the network and before you know a whole web of relations comes alive. In REST you have to think in local terms (to what other nodes am I connected now that I am on this node and what can I do now?), while with SOAP you have to think in global terms (I know the whole application, I have this data, what do I do with it now?).<br />
That being said, I am wondering how will REST architecture scale when the number of connections between nodes will increase. Let’s say that I have the product node and for now I have to other nodes (or URIs in REST-speak) attached to it: ordering the product and viewing it. What if I need to add 15 more actions to this node, will that affect the size of the message I am sending the client and effectively consume a lot of resources? What if these actions are not that different one from another, how will the clients be able to make a decision about where to proceed next?<br />
Another point I’d like to make is the fact that when programming to a REST-architecture you are intimately tied to it. You cannot download the API, put a layer of abstraction on top of it and plug it into your application as you would do in a SOAP scenario. With REST you get a node, you parse it for its relationships to the rest of the application (and you have to make this all the time because the REST server may decide to change the URIs of those relationships) and then you are ready to do something. In SOAP the relationships are expressed in the API, in REST they are discovered every time you process a remote node. You are dependent on the remote server a lot more than in a SOAP scenario. Interacting with REST-servers may result in tight-coupled systems*.<br />
One last thing (related to the above) would be the fact the REST is so different from SOAP to the point that a customer wishing to communicate with a REST-based system may have to alter its application entirely (not only the layer it uses for communicating with the rest of the world). REST doesn’t let people get their feet wet, you are either in it or totally outside of it. This could hamper mass adoption.<br />
I am waiting to see how this unfolds. Given the fact that most corporations grok SOAP I would be surprised if this technology will make a beach-head in the enterprise space. But you never know… I, for one, wouldn’t mind getting that feeling I got in university again…</p>
<p><a href="http://microintellia.com/blog/#">Later edit</a>: A REST application is probably best used for distributed computing where various nodes talk to one another. In this scenario the concept of a REST client and a REST server doesn’t exist, basically the REST client is emerged in the network the REST server(s) are running. You cannot have an external (at least I don’t think so) REST client, the REST client is similar to a spider that goes from node to node carrying out certain actions at each node and finishes by becoming part of the network. I think it is for this reason that trying to connect an external system to a REST-network fails, because the external system is to intimately tied to the REST network that it finishes by becoming part of it.<br />
Comments welcome!!</p>
<p><a href="http://microintellia.com/blog/#">Later edit</a>: You can abstract the interaction with a REST-server and plug it in your application, except that it is awkward mainly because REST-ful behavior is very different from your standard interaction with a library that you know before-hand.<br />
* I am not sure about this, please drop a comment if you want to talk about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/31/rest-and-soap/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The emergence of the managed environment</title>
		<link>http://microintellia.com/blog/2006/08/30/the-emergence-of-the-managed-environment/</link>
		<comments>http://microintellia.com/blog/2006/08/30/the-emergence-of-the-managed-environment/#comments</comments>
		<pubDate>Wed, 30 Aug 2006 14:45:01 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=5</guid>
		<description><![CDATA[You wouldn&#8217;t have guessed that this post is about EJBs, right? I wrote a rather critical post about EJBs, but I&#8217;d like to take a second look at them.I was looking at EJBs from a historical point of view and I realized that the EJBs are probably the first managed environment. Their intention was noble: [...]]]></description>
			<content:encoded><![CDATA[<p>You wouldn&rsquo;t have guessed that this post is about EJBs, right? I wrote a rather critical <a href="http://cristi.blogsome.com/2006/06/06/going-thru-the-ejb-spec">post</a> about EJBs, but I&rsquo;d like to take a second look at them.<br />I was looking at EJBs from a historical point of view and I realized that the EJBs are probably the first managed environment. Their intention was noble: to free the developer of any operational concerns and focus exclusively on the business logic. The developer was not supposed to worry about securing an application, about propagating credentials in a cluster, the environment was supposed to do this. The developer was not supposed to code for concurrency, the environment was going to do this. The developer was not supposed to deal with resource management, the environment would have done this for it. The developer was not supposed to code TX behaviour, but rather declare it and let the environment enforce it and propagate it in a cluster. The developer was not supposed to connect to a DB manually, but rather delegate this to the environment. The aim was really high, the functionality that this managed environment was supposed to implement was not trivial. On top of this, the spec defined this managed environment to be a distributed managed environment. Very high goals&hellip;<br />The result was disappointing: in order to embed your component in this managed environment you had to code to a series of interfaces and design policies which had to become second nature to a developer, in other words the environment was very intrusive. Embedding your component in the environment also came with a very large overhead: for some beans no less than 6-7 files were required in order to be able to turn an ordinary class into an EJB. Working with entity beans was particularly hard on anyone who had to use collections in the early days of EJBs: I remember scanning the log of the application and waiting forever for the app server to load 20 entities. This managed environment also came with some perverse side effects, the most known of which was the vendor lock-in: transporting an application from one app server to another was an undertaking that very few organizations had the resources to carry out. </p>
<p>Now, if we look at it from a &ldquo;historical&rdquo; point of view, the above doesn&rsquo;t seem so bad for a first try. One cool thing about EJBs that resonates well with me is the fact that EJBs promoted the use of interfaces. One very good use of this would have been the abstraction of a business process behind interfaces, unfortunately this didn&rsquo;t take off, most of the implementations were going the other way around, from concrete class to interface, XDoclet-style.<br />The &ldquo;mistakes&rdquo; that this operational environment made would be that it was advertised as &ldquo;enterprise&rdquo; and that it was too inclusive. Trying to address every issue important in enterprise computing on your first shot is prone to failure. The fact that this was done in a &ldquo;democratic&rdquo; fashion with each industry vendor pitching in his customers&rsquo; needs didn&rsquo;t make defining the spec easier.</p>
<p>Some people look at EJBs as an abject failure. I look at it as the first step on the road to something new, a first step loaded with mistakes as all first steps are. Currently everything is running in a container, in a managed environment if you wish, which you get to define and tinker with if you wish. The lessons learned by working with EJBs provided valuable when the current successful containers were designed. It&rsquo;s an evolution if anything else.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/30/the-emergence-of-the-managed-environment/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Communication thru UML</title>
		<link>http://microintellia.com/blog/2006/08/29/communication-thru-uml/</link>
		<comments>http://microintellia.com/blog/2006/08/29/communication-thru-uml/#comments</comments>
		<pubDate>Tue, 29 Aug 2006 18:33:53 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=6</guid>
		<description><![CDATA[I am reading Martin Fowler&#8217;s UML Distilled and I am going over his introduction to use cases. So far it looks like use cases are one point where domain experts and developers come together and is the main interaction between them. Basically, the domain experts communicate the behaviour of the system to the system architect [...]]]></description>
			<content:encoded><![CDATA[<p>I am reading Martin Fowler&rsquo;s <strong>UML Distilled</strong> and I am going over his introduction to use cases. So far it looks like use cases are one point where domain experts and developers come together and is the main interaction between them. Basically, the domain experts communicate the behaviour of the system to the system architect which can extract from it an essence which can further be abstracted into collaboration diagrams, class diagrams, etc&hellip; A conceptual domain model is built and supposedly from this domain model you can start drawing collaboration diagrams and the rest. <br /> This doesn&rsquo;t get even close to the complexity of the business logic. It is just so simplistic. One other &ldquo;great&rdquo; way to &ldquo;model&rdquo; a business was to treat nouns as classes and verbs as methods. I don&rsquo;t know why, but to me it sounds like medieval witch-craft. This packaging of information so that it fits inside a developer&rsquo;s head is atrocious. It probably works with <em>someone that has some knowledge of the business</em>, but it doesn&rsquo;t work with someone that is just entering the business. It is simplistic to assume that the ramp-up time for getting into a domain can be obviated by some collaboration diagrams. You have to know what you model, and you have to know it very well before starting to design.</p>
<p>Let&rsquo;s take an architect that spent the last 10 years architecting video games. It probably has its head filled with design patterns, UML diagrams, tricks, frameworks, etc&hellip; that enable it to do his job very well. Suppose that the same person is given the task of designing an application in the insurance industry. After collecting a mountain of use cases will it be able to see points of change in the application he&rsquo;s building, will it be able to abstract the business process that it is implementing so that the application changes easily as the business process changes itself? I&rsquo;d be surprised. That architect will go thru its collection of use cases and come up with a platform independent model and from it design the whole application. And he will probably fail to capture quite a few assumptions that the domain expert takes for granted and create a system that deviates from the original intent. It would have to adapt itself to the domain and then start to make some assumption about it in order to model it better. <!--[if !supportLineBreakNewLine]--><br /> <!--[endif]--></p>
<p>UML can be used as a tool for communication between the business analysts and developers, but we should not expect too much from this tool. I think that the potential for errors and the noise is pretty big for this communication channel. Once things start to get complex these diagrams will not be able to translate efficiently the process described by the domain owners to the system architect. Instead of relying on various meetings with the business analysts, the architect should be able to understand the process, should be able to ask question meaningful to the business owners about the process that it is implementing and then it should start modeling it. It would help a lot if the business analysts would have some sort of a manual that distils the business and that the system architect can read before engaging with them.<br /> I, for one, treat use cases and collaboration diagrams mostly as documentation needed for bringing a developer on board, rather than a way to pull information out of a domain. </p>
<p> As a final note I would say that the ability to adapt to a new environment is becoming a requirement for a developer. In order to be able for a developer to function efficiently across a wide array of industries that developer should learn how to adapt to a new business environment, and pretty easily. A developer should scratch beyond the surface of a industry in order to make meaningful decisions. </p>
<p>P.S. I&rsquo;ll give an example from my experience.<br /> I was designing an e-commerce application that had to support multiple customers and had to be industry-agnostic. What was the functionality that was most prone to change from one customer to another and which had to be abstracted first? Navigation? Layout? No. It was/is the prices. Every customer has its internal pricing structure (tiered, contract-based, rebates, etc&hellip;) that has to be reflected in the application. I learned it the hard-way, and it is a valuable lesson. When I designed a B2B application the first interface that I wrote was the interface for handling prices because this was one piece of functionality that I knew the customer cared about and that was prone to change. Do you think that this need ever transpired from the various interactions I had with the customers and various use cases I walked thru? No. The prices were the functionality that were the most prone to change and there was nothing out there to tell me that, most customers would assume that their price schema is what everyone is using. It was the interaction with quite a few customers that showed me that what is really prone to change is the pricing module.<br /> P.P.S. In the above application the next thing that had to be abstracted was the interaction with their back-office systems, but it is a lot more obvious that it has to be abstracted.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/29/communication-thru-uml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Open Source Trademarks</title>
		<link>http://microintellia.com/blog/2006/08/25/open-source-trademarks/</link>
		<comments>http://microintellia.com/blog/2006/08/25/open-source-trademarks/#comments</comments>
		<pubDate>Fri, 25 Aug 2006 14:34:04 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=7</guid>
		<description><![CDATA[One of the revenue models for open source (OS) companies is the selling of support services and documentation. JBoss is widely known for pioneering the model of making money off support rather than off selling a product. The question that is posed is how do they protect this revenue stream? You can set-up a shop [...]]]></description>
			<content:encoded><![CDATA[<p>One of the revenue models for open source (OS) companies is the selling of support services and documentation. JBoss is widely known for pioneering the model of making money off support rather than off selling a product. The question that is posed is how do they protect this revenue stream? You can set-up a shop somewhere in Eastern Europe, staff it up with committers to that particular open source project in order to gain credibility, set-up a workforce that masters the product and costs 3 to 4 times less than their Western counterparts and start selling support services. Chances are that you will be able to leap ahead of the original open source company because of the pricing power you yield due to lower costs.<br />
So, how do the OS companies protect themselves from this threat? One great protection is thru the use of trademarks. Take a look at <a href="http://www.redhat.com/about/corporate/trademark/">Red Hat</a>, <a href="http://www.mysql.com/company/legal/trademark.html">MySQL</a>, and <a href="http://news.zdnet.com/2100-3513_22-5893015.html">JBoss</a>. Boy, do they protect their brand. MySQL goes as far as to prevent the use of its trademark on documentation. An IT shop selling support services for MySQL (for example) could be taken to court by MySQL because they are using the MySQL trademark (when they are advertising &#8220;Buy great MySQL support from us&#8221;) without consent from the MySQL group. An IT shop planning to compete with them on support should make sure it flies under the radar and doesn’t make a significant dent in the original OS company’s revenues. The moment it gains traction in the market and starts having an effect they should prepare to meet the original OS company’s legal team. Chances are they will not be able to sell their services in a country/region that takes intellectual property seriously.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> Who would have thought <a href="http://www.theserverside.com/blogs/thread.tss?thread_id=44792" target="_blank">this</a> is possible? You know what I think? That the APIs are a commodity, what is not a commodity is the knowledge to use them, knowledge which is very important given the size and power of these APIs. It looks like RedHat is protecting that knowledge from becoming a commodity pretty well, but the manner in which they are doing it smacks of despair. You would have thought that the almighty &#8220;professional open source&#8221; model would not rely on hunting down individuals who piggyback on an OS product to make some money, but it looks like RedHat is looking at locking down that revenue stream.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/25/open-source-trademarks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using Google</title>
		<link>http://microintellia.com/blog/2006/08/25/using-google/</link>
		<comments>http://microintellia.com/blog/2006/08/25/using-google/#comments</comments>
		<pubDate>Fri, 25 Aug 2006 13:42:35 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=8</guid>
		<description><![CDATA[These days I have done something that I have not done for the last year: I searched on Google. Yep, I didn&#8217;t do a search on Google for quite a while. The reasons that kept me away from Google was first the Google desktop which behaves more like a trojan than anything else and then [...]]]></description>
			<content:encoded><![CDATA[<p>These days I have done something that I have not done for the last year: I searched on Google. Yep, I didn&#8217;t do a search on Google for quite a while. The reasons that kept me away from Google was first the Google desktop which behaves more like a <a href="http://www.theregister.co.uk/2006/02/15/privacy_anonymity/">trojan</a> than anything else and then its relationship with the Chinese government. Its hunger for information didn&#8217;t score many points with me neither: Google is a vacuum cleaner which absorbs every piece of information it can get its hands on. The huge (at the time) mailbox size of GMail reflects, to a certain extent, its hunger for information. Give the users a huge mailbox and load the mail program with features that make the users <strong>reluctant to delete email</strong> (such as tracking conversations) and they will keep most of their data with you&#8230; Its never expiring cookie says the same thing: &quot;We want information and we will whatever is needed to get it&quot;.<br />To go back to Google search, I didn&#8217;t use Google search because I didn&#8217;t have to. The environment in which I was working before didn&#8217;t require me to search the web, most of the information I needed I could access very quickly, either thru information systems or thru people.<br />Well, that changed. I changed jobs and in the new environment I found myself tackling an application server problem. With little documentation and no tech-support I had to go back to Google. I spent 3 hours on Google trying to find some documentation with no results. It&#8217;s not the fact the Google didn&#8217;t help me find what I needed that prompted me to write this post. Is the fact that I grew to view web-search as a last choice for information retrieval. For the last year I have put up a library on del.icio.us where I go if I need to find something. I have subscribed to various feeds which provide me with very good information that I index according to my needs. I have come back to it when I needed to get some research about outsourcing from Western Europe, I didn&#8217;t have to go to Google and start from scratch and sift thru mountains of garbage in order to find what I need. The effort of putting up a small library, of interacting with human beings interested in the same fields as you is a good long-term investment.<br />I am slowly coming to the conclusion that dependence on web-search reflects a poor environment (in my case poor documentation and no tech support). What I needed should have been covered way better by my application server provider, I should not have to go Google and struggle to find a significant keyword that would have provided me with the answer. My application server provider should have found a way to channel all the information that their users have to me. They failed and the only thing I could fall back was searching on Google. (I am wondering how many tech departments out there outsource to Google the indexing their information rather than putting up a decent system that their users can rely on.)<br />Using a search engine may mean, to a certain extent, the assumption of instant gratification: &quot;I don&#8217;t really want to put the effort in acquiring this information, I&#8217;ll just ask Google for it&quot;. Don&#8217;t be surprised if Google will not find it for you. It may also mean a poor environment where your source of information is a search engine that is not an authority in the field you are interested in.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/25/using-google/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Service Data Objects</title>
		<link>http://microintellia.com/blog/2006/08/20/service-data-objects/</link>
		<comments>http://microintellia.com/blog/2006/08/20/service-data-objects/#comments</comments>
		<pubDate>Sun, 20 Aug 2006 22:35:15 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=11</guid>
		<description><![CDATA[I have been reading the specs for the Service Data Objects (here and  here) a bit puzzled. The scope of the spec is daunting: &#8220;You need to know only one API, the SDO API, which lets you work with data from multiple data sources, including relational databases, entity EJB components, XML pages, Web services, [...]]]></description>
			<content:encoded><![CDATA[<p>I have been reading the specs for the Service Data Objects (<a href="http://dev2dev.bea.com/pub/a/2005/11/sdo.html">here</a> and  <a href="http://www-128.ibm.com/developerworks/java/library/j-sdo/">here</a>) a bit puzzled. The scope of the spec is daunting: &#8220;You need to know only one API, the SDO API, which lets you work with data from multiple data sources, including relational databases, entity EJB components, XML pages, Web services, the Java Connector Architecture, JavaServer Pages pages, and more.&#8221; One <a href="http://cristi.blogsome.com/wp-admin/images/oneRing.jpeg">API</a> to rule them all. All laughing aside I really do not understand the effort: don’t we already have JCA, JDO and JPA? Who needs another persistence API? Who needs this persistence API to be platform-agnostic, so that your JEE app can use a .Net app as data repository?<br />
The only interesting thing about it is the disconnected data graph, but I think you could abstract this behavior in JDO or in a DAO.  One thing I find odd about this implementation of a disconnected data graph is the fact that it comes with a locking strategy built in (namely optimistic-locking) when it would have made sense to be able to specify this declaratively or at least provide for ways to plug in your own data layer. If you have 2 sales reps working remotely on the same purchase order you should provide for collision detection or resolution if one tries to override the other’s order when it re-commits it.<br />
What I find the worst in this spec is granularity of access between 2 applications tied together thru SDO. SDO’s purpose is to abstract the data layer to the level that you can plug in any data source, including another application. This in turn means that an application has access to another application’s data layer. Access to an external application data layer is a very fine grained access to another application, which is a big no-no. Think just about the amount of coupling that you create between 2 applications, or services if we want to use the buzzword du jour. Access between applications should be coarse-grained, not fine-grained. An application should publish its coarse-grained behavior (which should not be prone to change) not its data layer. A data layer that gets published and used by external applications will evolve with great difficulty because the dependencies involving it are enterprise-wide and not application-wide.<br />
SDO appears as the data layer of a client-server application in heteregenous environment, however I am skeptical about how useful or how needed it is. You could say that it is tied to the re-emergence of the rich client, but I am neither sure that this rich client is really needed nor that it needs these capabilities.<br />
I don’t know. The more I read about it, the less I like it. I’ll be watching it with interest, but I am betting against it. The main reason for  betting against it is that the effort for implementing SDO is huge (implementing the Data Mediator and the Data Graph in a heterogeneous environment is not trivial at all) while the benefits really modest. I would be surprised if it achieves any penetration in the enterprise space.</p>
<p><a href="http://microintellia.com/blog/#">Later Edit:</a> I was reading this <a target="_blank" href="http://www.infoq.com/news/2007/02/offline-storage">article</a> on infoq.com about offline storage in AJAX applications. It looks like we have one more disconnected client type that will need the capabilities of SDO. Will anyone think about porting SDO to an AJAX environment? I hardly think so.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/20/service-data-objects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>C programming is not OOP</title>
		<link>http://microintellia.com/blog/2006/08/16/c-programming-is-not-oop/</link>
		<comments>http://microintellia.com/blog/2006/08/16/c-programming-is-not-oop/#comments</comments>
		<pubDate>Wed, 16 Aug 2006 19:37:50 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=12</guid>
		<description><![CDATA[You are probably familiar to the chorus of C programmers saying &#34;We were doing OOP in C and we were doing a good job of it&#34;, if you are not here is an article about how to program in C using OOP concepts. The article addresses only encapsulation, inheritance and polymorphism are left to better-suited [...]]]></description>
			<content:encoded><![CDATA[<p>You are probably familiar to the chorus of C programmers saying &quot;We were doing OOP in C and we were doing a good job of it&quot;, if you are not <a href="http://www.accu.org/acornsig/public/articles/oop_c.html">here</a> is an article about how to program in C using OOP concepts. The article addresses only encapsulation, inheritance and polymorphism are left to better-suited languages like Smalltalk.<br />They probably did use some OOP constructs in C. However, what they were doing was a process which could not scale. The object-oriented C that was produced was a twisted mangle of code that had a pretty high entry barrier: it was very complex and, I would assume, poorly documented. I assume that it was poorly documented because it was some sort of a hack which was known only among a small group of luminaries at a time when documentation was not considered crucial to the development process. As I said, this process could not scale, it is obvious. Implementing it across a large developer base would have required error-proof coding practices, it would have required strict enforcementes of these practices, and this would have been very costly. At the end of it the developer would have been turned into a human compiler who would have spent most of its time making sure that is procedural code was also object-oriented. The sheer complexity of this task would have prevented mass adoption and ultimately stop the &quot;object-oriented&quot; C&#8217;s growth: how could you have implemented more exotic uses of OOP if you had to constantly juggle functions passed as pointers, crazy typedefs and so on? Another roadblock to its success would have been the various conflicts that would have emerged between various groups if this object-oriented C was successful. Various OOP frameworks would have emerged each with its vocal set of fans and dissenters.<br />Then Bjarne Stroustrup came along with C++. C++ put the house in order and formalized the language to the extent that development could scale meaningfully. The OOP hack known among 5-10 programmers in a team was suddenly released to the world at large. The workforce could adapt to a standard that was not going to change according to the moods of some gurus. This was a process that could scale and that scaled very well: dozens of thousands of developers used C++ for over a decade developing very complex systems. <br />The group claiming that they were developing in &quot;object-oriented&quot; C suffer from seeing the world thru glasses tinted according to their beliefs. I get the same feeling anytime I hear people abusing the buzzword <em>du jour</em>: &quot;We were doing SOA for years&quot;. Not really, sending messages over a CORBA-talking pipe is not SOA.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/16/c-programming-is-not-oop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Various uses of RSS</title>
		<link>http://microintellia.com/blog/2006/08/13/various-uses-of-rss/</link>
		<comments>http://microintellia.com/blog/2006/08/13/various-uses-of-rss/#comments</comments>
		<pubDate>Sun, 13 Aug 2006 20:31:55 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=13</guid>
		<description><![CDATA[RSS, or Really Simple Syndication or Rich Site Summary, is a popular broadcasting protocol. A collection of items is made available to outside parties by packaging a digest of it and releasing it. The outside parties can determine what items have been added to the feed, which ones were updated, etc… The digest also provides [...]]]></description>
			<content:encoded><![CDATA[<p>RSS, or Really Simple Syndication or Rich Site Summary, is a popular broadcasting protocol. A collection of items is made available to outside parties by packaging a digest of it and releasing it. The outside parties can determine what items have been added to the feed, which ones were updated, etc… The digest also provides pointers toward the location of the items.<br />
RSS is pretty popular among the DIY crowd which uses it mostly for keeping in synch with the blogs and sites it follows. Various sites, such as  <a href="http://rojo.com">rojo.com</a>, are using it under the hood for enabling users to keep in touch with their blogs. It is creeping into browsers and since IE 7 will have an RSS reader it is a safe bet that this technology is becoming mainstream. I find it interesting that it is becoming mainstream because this is a mindset change: rather than looking for information on the web you wait for this info to be pushed to you. Anyway, I didn’t intend to talk about social changes in this entry.</p>
<p>I am more interested in RSS’s behavior and the way you could apply to various problems.<br />
One of the first uses would be to use RSS for broadcasting events in a group. Let’s say that you are a MySpace user and want to send a message to a group of people. MySpace could broadcast the message to your group by using RSS: each group member would have access to the group’s feed and any member could write to this feed. The result would be that each member could send a message which is guaranteed to be received by the rest of the group as long as the RSS server is up. Setting up this messaging infrastructure in a web application could be as easy as getting an RSS AJAX client and mapping it to the appropriate feed.<br />
Let’s go to some exotic uses of RSS. The fact that RSS is a platform-agnostic broadcasting protocol means that it could be used for managing the interactions between various services in an SOA environment. To go back to the <a href="http://cristi.blogsome.com/2006/07/24/soa-and-aop/">tax example</a>: you have to apply a service (taxation) across a wide array of applications deployed on different platforms in a financial institution. You could have each of these application broadcast events (such as a stock have been traded, a commodity has been bought or sold, etc…) in an RSS feed and the tax program would listen to all these events and take appropriate action. The messaging infrastructure would be pretty simple to implement on both sides, I assume that there are quite a few clients written for various platforms.<br />
You could use it for pushing deltas in a cluster if guaranteed delivery is not mandatory. A company could consolidate its messaging infrastructure using RSS: the email client would be replaced with an RSS client that is mapped to a specific feed, various groupware software could work off RSS feeds.</p>
<p>Various client-server interaction could be implemented easily with RSS: I wrote a desktop application that had to connect to a server and get the latest updates for catalogs, accounts, etc… This could have been done very easily using RSS. The changes in a catalog would have been published in an RSS feed and the client would have just had to connect to this feed and get its updates. Gone is the proprietary protocol which cost me a few nights, instead you get a tried, tested and true RSS client and plug it in your application.<br />
An anti-virus or a patch manager could get a list of the latest virus definitions or patches and their location in an RSS feed and proceed with installation based on the information published in the feed.</p>
<p>I don’t want to be misunderstood. I am not suggesting to gut out MOM and replace it with RSS, I’m suggesting to consider RSS when you need an infrastructure for passing messages with a certain reliability rather than build it in-house. You could have various parts of your application talking to each other literally in seconds. I hold the conviction that code-writing is an error-proce process which has to be minimized as much as possible. In order to do this we have to start thinking in processes, we have to look at various technologies in an open way, realize their potential and use it.</p>
<p><a href="http://microintellia.com/blog/#">Later edit:</a> <a target="_blank" href="http://rssbus.com/">This site</a> seems to be a good resource for RSS-related software.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/13/various-uses-of-rss/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Working with JSF and ADF</title>
		<link>http://microintellia.com/blog/2006/08/12/working-with-jsf-and-adf/</link>
		<comments>http://microintellia.com/blog/2006/08/12/working-with-jsf-and-adf/#comments</comments>
		<pubDate>Sat, 12 Aug 2006 00:34:21 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=14</guid>
		<description><![CDATA[I have been working with JSF and ADF for a while and I have to say that I am impressed. The level of abstraction is simply outstanding, I am waiting for an AJAX implementation that could map the relationships described in the web application and generate AJAX components. The navigation is very easy to implement [...]]]></description>
			<content:encoded><![CDATA[<p>I have been working with JSF and ADF for a while and I have to say that I am impressed. The level of abstraction is simply outstanding, I am waiting for an AJAX implementation that could map the relationships described in the web application and generate AJAX components. The navigation is very easy to implement and understand once implemented. The relationships between components are crystal clear, you don&#8217;t have to go back to the struts-config file for each link or form, but rather you describe the relationships and delegate their implementation to the framework.<br />I am really impressed. I got used to see most of the good frameworks come out of open-source projects so I was surprised when I saw the very good job that Sun did with JSF. I didn&#8217;t expect web development to be abstracted and turned into event-based programming because the environment is so different, but it has been done and done very well.<br />Congratulations to Sun and Oracle for these great frameworks!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/12/working-with-jsf-and-adf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spring 2.0 is released</title>
		<link>http://microintellia.com/blog/2006/08/11/spring-20-is-released/</link>
		<comments>http://microintellia.com/blog/2006/08/11/spring-20-is-released/#comments</comments>
		<pubDate>Fri, 11 Aug 2006 15:33:41 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=15</guid>
		<description><![CDATA[Spring 2.0 has been released. Check out this great article about the integration of AspectJ into Spring 2.0 using annotations. The way Spring piggy-backs on various AspectJ services, such as information about an aspect, is simply delicious. I really liked the part about throwing the AspectJ compiler out of the application and still using AspectJ. [...]]]></description>
			<content:encoded><![CDATA[<p>Spring 2.0 has been released. Check out this great <a href="http://www.infoq.com/articles/Simplifying-Enterprise-Apps">article</a> about the integration of AspectJ into Spring 2.0 using annotations. The way Spring piggy-backs on various AspectJ services, such as information about an aspect, is simply delicious. I really liked the part about throwing the AspectJ compiler out of the application and still using AspectJ. <br />Very good article and very good framework!</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/11/spring-20-is-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Object Linking and Embedding</title>
		<link>http://microintellia.com/blog/2006/08/10/object-linking-and-embedding/</link>
		<comments>http://microintellia.com/blog/2006/08/10/object-linking-and-embedding/#comments</comments>
		<pubDate>Thu, 10 Aug 2006 15:48:07 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=16</guid>
		<description><![CDATA[Anyone remembers this? Before .Net, before ActiveX, before COM there was OLE, the way that various software products could communicate one with another. The idea was that a software product would delegate various tasks to another product which was better equiped for it.
I remembered it a few months ago when I went to a head-hunting [...]]]></description>
			<content:encoded><![CDATA[<p>Anyone remembers this? Before .Net, before ActiveX, before COM there was OLE, the way that various software products could communicate one with another. The idea was that a software product would delegate various tasks to another product which was better equiped for it.<br />
I remembered it a few months ago when I went to a head-hunting agency and I watched the secretary punching in my information. She was jumping from Word to Excel, back to Word, back to a different Excel file, etc… Very, very ineffiecient. I could not help having the feeling that she was actually taking on the role of a software program, that all the repetitive jumping from one file to another could have been analyzed as a business process (it is a business process after all), abstracted and implemented.<br />
Back in the days when desktop computing ruled one way to implement this business process would have been by using OLE. You would have basically created a shrinkwrapped product (anyone remembers this one too?) that would have delegated thru OLE various tasks to products that did them best: Word would have taken care of CV editing , Excel would have taken care of managing the client information, Access would have managed the CV repository, etc… Your product would have concerned itself with the management of the tasks of a head-hunting agency. Your product would basically take different existing software products and put them together in a meaningful way, effectively implementing a business process. This approach would have been better than creating proprietary software for all the parties: the developer would not have had to be concerned with creating a good text editor and the customer would not have had to retrain its staff because they were already familiar with the various pieces that make up the product. If your product was well designed it could have been able to plug different products (let’s say different word processors) in your business process so that the secretary would continue to use WordPerfect instead of Word if she was proficient in it. Your software product would have been tailored to your customer and its business process.<br />
Unfortunately, this type of desktop mashup never occured. More and more proprietary software was churned out at great costs for everybody involved. Small customers continued the mundane practice of copy and paste (in some cases to this day) while big customers shelled out big bucks for `solutions` which were sent to the recycle bin the moment the web revolution took place.<br />
Hopefully, the current `mashup` mindset will put an end to developing huge elephants and make developers concentrate on processes rather than on infrastructure. Anyway, it is more fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/10/object-linking-and-embedding/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interacting with users</title>
		<link>http://microintellia.com/blog/2006/08/01/interacting-with-users/</link>
		<comments>http://microintellia.com/blog/2006/08/01/interacting-with-users/#comments</comments>
		<pubDate>Tue, 01 Aug 2006 14:34:44 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=17</guid>
		<description><![CDATA[I was thinking about the &#8220;Keep It Short and Simple&#8221; mantra applied to UI for desktop products and I was wondering how you could build a large desktop application and have your users manage a large array of components very different in functionality one from another. I was thinking mostly about applications such as Netscape [...]]]></description>
			<content:encoded><![CDATA[<p>I was thinking about the &#8220;Keep It Short and Simple&#8221; mantra applied to UI for desktop products and I was wondering how you could build a large desktop application and have your users manage a large array of components very different in functionality one from another. I was thinking mostly about applications such as Netscape 7 (anyone using it anymore?) where the user has to choose between a large number of components: stock quotes client, email client, RSS feeds client, AIM and whatever other AOL software is bundled in Netscape.<br />So far the approach for managing large number of components was to basically swamp the user in an ocean of checkboxes, radio buttons, dropdowns, etc… which they would have to click in order to get to the component that they need. Microsoft Word is the perfect example of it: at an UI work-shop I saw Word with all its menus expanded and the text area was shrunk down to the dimensions of a stamp. This approach obviously doesn’t scale: there is only so much room on your user’s computer screen and the user’s  attention span and patience can stretch only so much.<br />A far better approach would be to have the user discover what it needs from what you have to offer and make the management of those components easy for the user. I am thinking that a product should have a component search capability that would let the user search for its components. A component registry with search capabilities would probably solve this. Also, the user could tag various components and search components tags in order to find what it needs. Basically, every known form of collecting and searching for information should be used for letting your user manage the components easily. Whether collecting and querying this information is done locally or remotely is, obviously, particular to the application being developed and its operational environment.<br />The big number of components that your application would have to manage would imply that your application should exhibit a certain degree of plugability: the application’s components should interact with one another seamlessly and should be set-up very quickly. Various plugability contracts should be set-up: a component should be able to be demo-ed (without a demo a user would not be able to decide quickly if it needs the component or not), installed, un-installed, re-installed, loaded into the application at runtime, discarded/hidden at runtime, etc…<br />The product would then become a platform on which various plugins are set-up and assembled together, very similar to the Eclipse IDE. This leads me to say the following: one way to see how the interaction between different UI components will be implemented in the future would be to check out Eclipse’s source code. Eclipse has a certain level of UI plugability and it has the lowest barrier of entry for a developer: it is open-source.<br />Hey, if your UI requirements match Eclipse’s plug-and-play skeleton you could even use its skeleton for your application (*). The skeleton of the Eclipse IDE would become the free or low-cost infrastructure that you would use for setting up your application.</p>
<p>P.S. Along with the Web 2.0 buzz some sort of a revival in UI is taking place. It looks like interacting with users is being thought about again. Martin Fowler’s <a href="http://martinfowler.com/eaaDev/uiArchs.html">GUI Architectures</a> is worth checking out.<br />P.P.S. When writing this I kept thinking about the launch of Google Talk and the spartan user interface it had at the time. I was wondering how would an user of this product find its various services if the interface was kept simple.<br />P3.S. This article is concerned with UI management on desktop applications. I think these UI management requirements apply to web-based products but the implementation would be very different. A web application would be transformed into a portal that is easily to be managed by the user. For example, I would like to go to Yahoo’s page and have in the upper right corner some stock quotes, next to them press releases or news about those stocks and in the middle of the page general news. When I’m planning my vacation I would like the middle of the page to be a list of various trip packages rather that the news I usually have. I would like to put up these components and shut them down very easily.</p>
<p>* As far as I know Eclipse’s plug-and-play architecture is intrusive, you have to implement various interfaces, etc… Using Eclipse as a skeleton for building desktop apps would couple your application strongly to Eclipse unless you abstract the interaction between your UI components and create a bridge which will be used for having Eclipse boot-strap your application’s UI. This way you could use other plugable UI frameworks, such as Firefox, for assembling your application’s UI.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/08/01/interacting-with-users/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IT transformation</title>
		<link>http://microintellia.com/blog/2006/07/28/it-transformation/</link>
		<comments>http://microintellia.com/blog/2006/07/28/it-transformation/#comments</comments>
		<pubDate>Fri, 28 Jul 2006 17:23:15 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=18</guid>
		<description><![CDATA[I&#8217;m not the first person to write about the transformation of IT. It is pretty obvious when you look out there that you have today is not what you had 5 years ago, Microsoft, Oracle, IBM, HP, Apple, IT&#8217;s blue chips have changed dramatically. They are no longer pure tech-players: IBM moved into services, Microsoft [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not the first person to write about the transformation of IT. It is pretty obvious when you look out there that you have today is not what you had 5 years ago, Microsoft, Oracle, IBM, HP, Apple, IT&#8217;s blue chips have changed dramatically. They are no longer pure tech-players: IBM moved into services, Microsoft and Apple moved into entertainment, Oracle is moving into HR and retail, etc&#8230; Sun is one of the last pure-tech players and, sadly, has a lot of problems.<br />Commodization of software infrastructure is the common theme of this transformation. Databases, application servers, operating systems, various desktop programs, even <a href="http://opensparc.sunsource.net/nonav/index.html">computer chips design</a> or <a href="http://www.allthingsdistributed.com/2006/07/your_queues_are_ready.html">message-oriented-middleware infrastructure</a> are starting to cost absolutely nothing. Right now you can get a pretty good computer (hardware + OS + applications) for close to 500$. The big IT behemoths have sensed this for a while and are starting to try different other business models, their former businesses turning into money-losing propositions.<br />Today it looks like that you cannot expect anymore to make money handling information (storing, querying, sharing, securing, etc&#8230;) except in very small niches (such as semantic queries, NLP, etc&#8230;). Is what you do with this information that will be valuable. It is the knowledge to actually work with this information rather than handling it that will be valuable.<br />My opinion is that this shift is part of the transition to a <a href="http://en.wikipedia.org/wiki/Knowledge_economy">knowledge based economy</a>, an economy in which the knowledge that you own and that you work with is valuable and not the way you push bits from a hard-disk to the network and viceversa. The applications that Oracle, MS and IBM have are IT infrastructure and in a knowledge economy IT infrastructure doesn&#8217;t add much value because its functionality is simple (or has become/will become simple) and therefore unprofitable. IT infrastructure is becoming a commodity.</p>
<p>In the words of late Peter Drucker: People tend to concentrate on the word &quot;Technology&quot; when faced with the term &quot;Information Technology&quot;. It is time to concentrate on &quot;Information&quot;.<br />It is time to do something with this information. Handling it has become a piece of cake.</p>
<p>P.S. A lot of open source usually stands for developing infrastructure software; think about Sendmail, various web-servers, application servers, etc&#8230; So when you see that whole applications are getting open-sourced (think CMS, shopping carts, catalogs, CRM, etc&#8230;) it is a good bet that these applications are actually infrastructure, that they are the building blocks for something bigger and more valuable. It means that while previously you were supposed to work at a very low-level with database tables, triggers and Java code, from now on you may have to work with whole application stacks. Of course, not all development will be like this, someone will have to create these applications. But more and more of the work will consists of integrating these applications in order to create something of value.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/07/28/it-transformation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Infrastructure, business logic and degrees of expression</title>
		<link>http://microintellia.com/blog/2006/07/25/infrastructure-business-logic-and-degrees-of-expression/</link>
		<comments>http://microintellia.com/blog/2006/07/25/infrastructure-business-logic-and-degrees-of-expression/#comments</comments>
		<pubDate>Tue, 25 Jul 2006 18:44:54 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=19</guid>
		<description><![CDATA[At one point I wrote a code-generator that was looking up the table description in an Oracle database, take a look at some configuration files and create a DAO for accessing that table. The DB was accessed thru straight JDBC and not thru an ORM framework. We basically had to generate 2 classes that were [...]]]></description>
			<content:encoded><![CDATA[<p>At one point I wrote a code-generator that was looking up the table description in an Oracle database, take a look at some configuration files and create a DAO for accessing that table. The DB was accessed thru straight JDBC and not thru an ORM framework. We basically had to generate 2 classes that were supposed to be used by their clients: a POJO that was mapping to the table and could have some business logic methods and an access bean that would implement all the CRUD operations and could also have some business logic. <br />The solution was to generate 4 files: 2 files for the POJO and 2 files for the access bean. The POJO would have a super-class that was generated all the time by the tool and contained the getters and setters for the POJO and a sub-class that would be generated only the first time and that would extend the super-class. The sub-class would contain business-logic methods. The same things were generated for the access bean: a super-class that implemented the CRUD operations and get generated all the time and a sub-class that would contain business-logic methods and would be generated only the first time. Again, the sub-class would extend the super-class.<br />I was thinking about it and I came to the conclusion that what I basically did was to separate infrastructure (getters and setters, CRUD operations) from business logic. The infrastructure was implemented in the super-class and the sub-class was concerned only with business logic. The infrastructure could be generated and re-generated from various descriptors while the business logic could not be generated because it was too fine grained for it to be expressed in descriptors. <br />I think this is a good separation of concerns and one that would be beneficial to development if it is thought out carefully. I am not too crazy about code generators and in the above case we used it because we didn&#8217;t have a ORM framework at the time (this was pre-Hibernate and all that), but this separation is important and could be used beyond code-generation. You could use it to determine what components of an application are generic enough so that they can be either generated by a code generator or handled by a framework targeted exclusively at managing that component of the application. The rest of your application would be behavior so fine grained that it cannot be expressed in config files and is better expressed in business logic beans. <br />The difference between infrastructure and business logic is basically a difference in the degree of expression of various components in the application. Infrastructure has a very low degree of expression: it can be described in config files. Business logic, on the other side has a very high degree of expression, it needs to be coded.</p>
<p>To give an example for the above ideas: let&#8217;s say that you have a client that connects to a web-service. One way to implement this would be to use a code-generator (such as the one supplied with Apache Axis) and generate the stubs that connect to this web-service. Well, it is possible that the web-service would change in the future. In order to adapt to this change easily you could generate the web-service connection classes in a super-class (that would implement the infrastructure) and create a sub-class that would be called from your application (that would implement the business-logic). Changes in the web-service would result in changes in the super-class (which is not used by your application) and would not require big refactoring on your application. <br />Once again, I am not a big fan of code-generation. I was using the above as an example of the benefits of separating infrastructure from business-logic. You could use this separation for implementing generic behavior in a <a href="http://c2.com/cgi/wiki?TemplateMethodPattern">Template</a> for example, but it is important to notice this separation and enforce it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/07/25/infrastructure-business-logic-and-degrees-of-expression/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AOP and the division of labor</title>
		<link>http://microintellia.com/blog/2006/07/17/aop-and-the-division-of-labor/</link>
		<comments>http://microintellia.com/blog/2006/07/17/aop-and-the-division-of-labor/#comments</comments>
		<pubDate>Mon, 17 Jul 2006 13:45:25 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[AOP]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[Econo-computing]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=21</guid>
		<description><![CDATA[I am looking at AOP as an example of applying the theory of Division of Labor to development. With AOP it is possible to have different types of professionals working on the same project at the same time.
In theory a security expert would secure the application or even better a security expert in one domain [...]]]></description>
			<content:encoded><![CDATA[<p>I am looking at AOP as an example of applying the theory of <a href="http://en.wikipedia.org/wiki/Division_of_labor">Division of Labor</a> to development. With AOP it is possible to have different types of professionals working on the same project at the same time.<br />
In theory a security expert would secure the application or even better a security expert in one domain would secure one part of the application, while a security expert in another domain would secure another part of the application, a transaction expert would trace transaction boundaries within the application, a concurrency engineer would serialize calls to a state repository in order to implement concurrent access, etc… I say this is possible in theory because managing this interaction takes some good managerial skills and processes, processes with which I am not familiar for the time being.<br />
The division of labor is a process that scales very well in diversity and ultimately in complexity. Various tasks are assigned to people trained specifically for them and are executed in an efficient manner. At the end of it the process has managed to put together a product which is quite complex and has received input for people of various backgrounds. This could be very well the solution to managing complex interactions when developing software: dividing them into tasks which can be performed individually by experts and assembling them at the end. Just like when you have a coffee you don’t have to worry about growing a coffee tree, harvesting the beans and roasting them because someone else did that for you when you are writing an application you should not concern yourself with securing it or implemeting failover thru exception handling because someone else would do this as well.<br />
The division of labor pulled the human race out of the Middle Ages and into the industrial age. Hopefully AOP will be able to pull large, complex projects out of the quagmire of pointless meetings, weekly merges, versions, etc… and into functional, deployed applications.</p>
<p>P.S. I wrote this post on the most horrible coffee I had in a long time. If it had an effect on the post itself I am sorry.<br />
P.P.S. Separation of concerns resembles the division of labor as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/07/17/aop-and-the-division-of-labor/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Business-driven APIs</title>
		<link>http://microintellia.com/blog/2006/07/13/business-driven-apis/</link>
		<comments>http://microintellia.com/blog/2006/07/13/business-driven-apis/#comments</comments>
		<pubDate>Thu, 13 Jul 2006 19:12:34 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=22</guid>
		<description><![CDATA[A new kind of APIs is emerging: the APIs written by businesses rather than by IT corporations. Some examples would be Operations Support Systems for Java and Transaction Workflow Innovation Standards. Various corporations are collaborating and setting up standards regarding the processes that they have to manage, and I think this is the right way [...]]]></description>
			<content:encoded><![CDATA[<p>A new kind of APIs is emerging: the APIs written by businesses rather than by IT corporations. Some examples would be <a href="http://www.ossj.org/index.shtml">Operations Support Systems for Java</a> and <a href="http://www.twiststandards.org/">Transaction Workflow Innovation Standards</a>. Various corporations are collaborating and setting up standards regarding the processes that they have to manage, and I think this is the right way to go about it, after all they know what they are talking about, they have decades of experience in their business, they have some ideas about where it is going. They know what interactions are performed between different IT systems in their organization. They are the ones in the best position to determine how their processes should be abstracted.<br />Sun, IBM, BEA, Oracle, etc&#8230; should concern themselves with the plumbing of the IT infrastructure rather than with defining how a business process should occur and interact with other processes. They should avoid business-oriented APIs and delegate this to the businesses that have been running this process. As far as JCP is involved they should be inviting parties outside the IT landscape for supervising business-oriented JSRs and defining the main business rules. <a href="http://jcp.org/en/jsr/detail?id=144">JSR 144</a> is a fine example of this approach: take a look at its expert group and count the organizations which are not involved in IT. <br />As far as the developer is concerned: today your average developer is expected to know a few infrastructure APIs: the Servlet spec, Struts, Spring, maybe EJBs&#8230; I wouldn&#8217;t wonder if in the future a developer working for a telco would be required to know telco-specific, business-driven APIs in order for it to be more productive. In other words the developer would be expected to know the business rules which this API is formalizing. Another step in bridging the gap between a business analyst and a developer.</p>
<p>P.S. The involvement of businesses in the creation and management of business-oriented JSRs benefits the IT corporations backing JEE a lot. The effort made by a business thru-out this process will translate in some form of a commitment to the JEE platform which would benefit the IT corporations involved and ultimately JEE. The JCP process could (and should) act as a communication channel between big-business and JEE.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/07/13/business-driven-apis/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SOA is not CORBA</title>
		<link>http://microintellia.com/blog/2006/06/26/soa-is-not-corba/</link>
		<comments>http://microintellia.com/blog/2006/06/26/soa-is-not-corba/#comments</comments>
		<pubDate>Mon, 26 Jun 2006 14:57:22 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=23</guid>
		<description><![CDATA[Recently I started perusing literature concerning SOA&#160; - Service Oriented Architecture, the latest buzzword in the IT industry. As any other new concept it is pretty vague and in the process of getting defined. I find it very interesting and I read on it heavily.I cannot consider myself an expert in the domain mainly because [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I started perusing literature concerning SOA&nbsp; - Service Oriented Architecture, the latest buzzword in the IT industry. As any other new concept it is pretty vague and in the process of getting defined. I find it very interesting and I read on it heavily.<br />I cannot consider myself an expert in the domain mainly because the concept is pretty new and it applies to enterprise-wide concerns; in order to get hands-on experience you need to work close to the board-room level. However, I came across a few misconceptions that I think I can straigthen out. One of them is that SOA is the new CORBA, a particular type of CORBA that runs on XML, some CORBA on web-services, in order to connect to .NET systems.<br />Well, this is wrong. SOA is not a new CORBA and these would be a few reasons:<br />1) SOA is about empowering business users. SOA is as business-like as IT gets. CORBA is/was for techies, SOA is for business analysts, policy-makers and domain experts.<br />2) Some technological advances have occured since CORBA was released, one of them is the ESB. CORBA was essentially a point-to-point technology while ESB is all about diffussing information to different partners. CORBA was never taken above simple relationships.<br />3) SOA is partly about managing complex relationships between different actors in an enterprise, CORBA is all about simple relationships (point-to-point relationships).<br />4) SOA is much more in tune with the environment outside the server farm, CORBA is in the server farm. <br />5) SOA is concerned with business evolution, adaptability to a changing environment, efficient resource allocation, CORBA is concerned with implementing a pipe over which messages are streamed.</p>
<p>CORBA is probably the first communication protocol that noticed the&nbsp; variety of systems that were trying to communicate with each other and presented a solution to this problem. SOA is concerned at its foundation with this problem, but rather than solving it it assumes it is solved and moves on to determine what should happen once the systems do start communicating one with another.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/06/26/soa-is-not-corba/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JBoss - professional open source</title>
		<link>http://microintellia.com/blog/2006/06/19/jboss-professional-open-source/</link>
		<comments>http://microintellia.com/blog/2006/06/19/jboss-professional-open-source/#comments</comments>
		<pubDate>Mon, 19 Jun 2006 16:07:51 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=24</guid>
		<description><![CDATA[JBoss is a very unusual open source project. It is an open source project that behaves more and more like a corporation. It doesn&#8217;t shy away from money, in fact it sold itself to Red Hat for a lot of money, the price tag being somewhere in the vicinity of 400 million dollars.  What [...]]]></description>
			<content:encoded><![CDATA[<p>JBoss is a very unusual open source project. It is an open source project that behaves more and more like a corporation. It doesn&#8217;t shy away from money, in fact it sold itself to Red Hat for a lot of money, the price tag being somewhere in the vicinity of 400 million dollars. <br /> What makes it look more like a corporation than a traditional open source project is the lack of organic growth. Once it secured the initial VC funding JBoss has gone on a shopping spree. It has purchased Hibernate, Drools, Arjuna and today Rosseta ESB from Aviva. The vertical integration of its stack is also another facet of the corporate mindset that directs JBoss. JBoss, and Red Hat along the way, seems concerned with the creation of an open-source stack that will supposedly provide their customers with a one-time stop for their enterprise computing needs, they only fall short of a database.<br /> Lack of organic growth, vertical integration, VC funding, etc&#8230;, well these are concepts you come across reading Wall Street Journal, not your typical open source online-forum/wiki. JBoss is a corporation (actually, it has been one for a long time) and is very much acting like one, much to the dismay of a large number of developers. This corporate behavior runs counter to what most people think about when thinking about open-source and led to some virulent &ldquo;Boycott JBoss&rdquo; campaings. <br /> However, one thing that I find strange the way JBoss Inc. chooses to grow its business is the fact that they are growing a huge stack and charging for training and services (to a certain degree). JBoss seems to be trying to make money by managing the behemoth that you downloaded free of charge, installed and ran into problems with. <br /> This runs counter to the current development mindset where you develop small pieces of software agnostic of the operational environment, you create contracts for plugging them into the operational environment and then adapt the software to the contracts you have created. The world is moving away from large elephants to small and highly adaptive software. JBoss is moving towards the large elephant. It is probably moving from mom and pop IT shops to Fortune 500 companies. Talk about&nbsp;a corporate mindset&hellip;</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/06/19/jboss-professional-open-source/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DOM vs SAX</title>
		<link>http://microintellia.com/blog/2006/06/15/dom-vs-sax/</link>
		<comments>http://microintellia.com/blog/2006/06/15/dom-vs-sax/#comments</comments>
		<pubDate>Thu, 15 Jun 2006 18:49:36 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=25</guid>
		<description><![CDATA[I was in an interview with another BU when the question popped up: &#34;What are the differences between DOM and SAX XML parsers and when would you use one or the other?&#34;. I started with a brief description of DOM (tree-like representation of an XML document that loads an entire document upfront) and SAX (slim, [...]]]></description>
			<content:encoded><![CDATA[<p>I was in an interview with another BU when the question popped up: &quot;What are the differences between DOM and SAX XML parsers and when would you use one or the other?&quot;. I started with a brief description of DOM (tree-like representation of an XML document that loads an entire document upfront) and SAX (slim, event-based XML parser). The answer that I gave was that I would choose DOM for XML documents that are complex and prone to change while I would favor SAX for simple documents which are not prone to change (memory was not an issue). The reason that I gave this answer was that trying to keep track of where you are in a complex document while SAX events are firing is pretty complicated and that once you created a SAX event handler that maps onto a document format is pretty hard to change it in order to map it onto a new format. The team interviewing me agreed and passed to another question.<br />Now that I&#8217;m thinking about it, the answer was wrong. The right answer would have been that I would choose an object-to-XML mapper that would translate a XML document into objects and viceversa and that I would delegate all processing and resource management to the OX mapper. The days when we would have to deal with DOM or SAX are over for the most of us, we should be working with what are comfortable with, that is with objects and not DOM Nodes or SAX events.</p>
<p><font color="#ff9900">Later edit:</font> SAX is a parser really close to the metal begging to have some extension layered on top of it in order to make it more developer-friendly. The fact that no such extension exists or is not popular (I, for one, do not know of any) leads me to believe that SAX is not so widely used. Probably the reasons for which it was conceived (small memory footprint being the most important one) are not important anymore or the XML documents that are usually manipulated do not require a lot of resources.<br /><font color="#ff9900">Even later edit: </font>It looks like the size of the XML documents and the number of formats <a href="http://www.infoq.com/news/XML-Overload">grow pretty rapidly</a> as SOA matures. A SAX-based OX mapper would not be a bad idea after all&#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/06/15/dom-vs-sax/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Away</title>
		<link>http://microintellia.com/blog/2006/06/06/away/</link>
		<comments>http://microintellia.com/blog/2006/06/06/away/#comments</comments>
		<pubDate>Tue, 06 Jun 2006 18:44:48 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=26</guid>
		<description><![CDATA[I&#8217;ve been away from my blog for a while. I am in the process of getting a SCEA certification and this kept me pretty busy.Now I&#8217;m back, ready for writing more about enteprise computing.
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been away from my blog for a while. I am in the process of getting a SCEA certification and this kept me pretty busy.<br />Now I&#8217;m back, ready for writing more about enteprise computing.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/06/06/away/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Going thru the EJB spec</title>
		<link>http://microintellia.com/blog/2006/06/06/going-thru-the-ejb-spec/</link>
		<comments>http://microintellia.com/blog/2006/06/06/going-thru-the-ejb-spec/#comments</comments>
		<pubDate>Tue, 06 Jun 2006 18:41:03 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=27</guid>
		<description><![CDATA[This is obviously not the first time someone points out the deficiencies in the EJB spec but I just could not help it. 
I have started my SCEA certification process and for the first exam I had to revisit the EJB architecture. I read EJB 2&#8217;s spec and at the end I was left in [...]]]></description>
			<content:encoded><![CDATA[<p>This is obviously not the first time someone points out the deficiencies in the EJB spec but I just could not help it. </p>
<p>I have started my SCEA certification process and for the first exam I had to revisit the EJB architecture. I read EJB 2&rsquo;s spec and at the end I was left in wonder. I could not believe that a corporation like SUN came out with such a spec. </p>
<p>The first (huge) surprise was the fact that there are interfaces that go against their contracts is a first (as far as I know) for SUN. For example, the <strong>MessageDrivenContext</strong> interface extends <strong>EJBContext</strong> and as a result it provides the MDB with access to its home. Except that an MDB has no access to a home since it is not referenced thru a home. Accessing the home thru a <strong>MessageDrivenContext</strong> would throw a system exception. I was in shock when I read this. You just have to wonder, what other methods are invalid in what interfaces? An API should provide a bullet-proof contract with no room for &lsquo;buts&rsquo; or &lsquo;maybes&rsquo;. Well, this time SUN took a short-cut.</p>
<p>Another thing that surprised me was the breadth of the spec. The spec tries to address quite a few issues: transactions, security, concurrency, timer services, distributed computing, persistence and resource management. Addressing all these issues is obviously not trivial, and in this case the end-result in this case is a hodge-podge of an architecture. SUN made quite a few assumptions about the applications that will be built using EJBs and hard-wired these assumptions into the spec.<br />For example, concurrency is addressed in the simplest manner: all calls to a session bean are serialized. You cannot isolate calls based on state that is shared between calls as you would want in order to create a better-performing architecture.<br />Resource management assumes that 10 years after the first JRE garbage collection is still a big problem in enterprise computing.<br />In the persistence area: requiring that some tasks are carried out by pooled beans and others by pooled or active beans seems more like a hack than serious design, I don&rsquo;t understand why persistence issues should be inter-twined with lifecycle management.</p>
<p>One thing that attracts developers to the so-called light frameworks is the fact that these frameworks do not make any assumptions about the applications getting built with them. Instead, they provide a way to assemble applications and bind behavior to various parts of an applications. They let you integrate outside components more easily into your application.</p>
<p>I think this is a more sensible approach to enterprise computing than trying to create this solution that tries to solve all the issues important to enterprise computing. </p>
<p>Finally, another failure of the EJB model is the collaboration between different technology providers. The EJB model was supposed to encourage application assembly: you would get some beans from a provider, put them together with some beans from another provider and create an application. I do not know of a successful application which got assembled this way. <br />However, the level of integration the lightweight frameworks have with outside technologies (such as the Acegi security framework) puts them in huge contrast with the EJB architecture. It looks like the IoC containers are much better applications assemblers than an EJB container. </p>
<p>The EJB spec leaves behind the image of an elephant mired in the moors of enterprise computing, trying to provide a solution for every conceivable problem, ending up with no clear answer to anything.<br />Looking at the picture that the EJB spec presents today it is not clear how another version &ndash; even the annotation-enhanced, transparent, lightweight version 3 &ndash; will fix the systemic problems that this bloated technology poses. I am skeptical that the on-going effort for refining EJBs will ever bear the fruit it was supposed to.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/06/06/going-thru-the-ejb-spec/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Working with Ajax</title>
		<link>http://microintellia.com/blog/2006/04/25/working-with-ajax/</link>
		<comments>http://microintellia.com/blog/2006/04/25/working-with-ajax/#comments</comments>
		<pubDate>Tue, 25 Apr 2006 15:12:59 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=28</guid>
		<description><![CDATA[I developed some components that interacted with the server in an AJAX-like manner (posting to a servlet, registering a callback function that would process the output from the server). I ran into a few issues and spent some time thinking about AJAX development.
I noticed some tight-coupling for calls that returns HTML content which has Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>I developed some components that interacted with the server in an AJAX-like manner (posting to a servlet, registering a callback function that would process the output from the server). I ran into a few issues and spent some time thinking about AJAX development.</p>
<p>I noticed some tight-coupling for calls that returns HTML content which has Javascript due to not loading of JS libraries retrieved via AJAX. Some calls were getting some HTML content that required JS libraries for launching popups or DHTML manipulation. The HTML content came with the required JS libraries but the browser (IE 6) was not loading these libraries. As a result the calling page had to load the libraries that were used by the HTML content retrieved thru AJAX. <br />I didn&#8217;t like this because I wanted to be able to encapsulate my component in some form, shape or manner and then have it used without having to determine how are these components coupled and enforcing this coupling. It looks like at the current stage of development component encapsulation is not implemented in AJAX. <br />One problem this causes is that the component&#8217;s future development is pinned. You cannot add more functionality to it because the JS libraries which will implement this functionality will have to be imported in the pages using the AJAX component. You will have to document the dependencies between the AJAX component and the pages calling it, reload the libraries in the dependent pages and re-test them. Big effort&#8230;<br /><em>Note: There is a work-around: getting the JS libraries and adding them to the document in a &lt;script&gt; tag. This would cause the browser to parse the JS required by the component. However this would require 2 calls: one to get the libraries, add them to the document in a &lt;script&gt; tag and another one to pull the component that uses these libs.</em><br /><em>Also, it is possible that future browsers will determine if JS libraries are retrieved thru an AJAX call and parse them.</em></p>
<p>The concept of application on one page is a bit flawed. The problems posed by a browser&#8217;s refresh button will add to the problems of the back button and so on. The current AJAX client is missing some important functionality (it is not transactional for example) and probably due to the variety of JS implementations in browsers it will always miss this functionality. Drawing a boundary between what logic falls on the client and what falls on the server is an extra effort. App versioning and the browser&rsquo;s JS cache pose some interesting problems too.</p>
<p>I wonder what will happen to an application written in AJAX and to its code base once W3C will put out HTML 4.01 (which among other things will separate the data from presentation and style)? Will these apps suddenly become obsolete? Probably yes.  </p>
<p>The biggest drawback of AJAX is that AJAX is currently under-developed. Everything revolves around the return status of the http request. There are some libraries out there (such as DWR &ndash; Direct Web Remoting) and some frameworks are being developed but otherwise AJAX is under-developed. The plumbing is being developed by ear for now. It is possible that Microsoft will come out with their own plumbing for asynchronous client-server communication. It is likely the W3C will expand this technology as well. The danger that your current code base will grow obsolete is great. The danger that various independent AJAX implementations will emerge and require developers to code to 2 different implementations is also pretty big. Anyone remembers the Netscape-vs-IE wars?</p>
<p>The asynchronous nature of AJAX may pose some problems. Some ramp-up time is required for developing at ease in an asynchronous environment if you have not had to deal with asynchronous applications.</p>
<p>My opinion is that currently AJAX is pretty good for small tasks pertaining to presentation. Let&rsquo;s say you have a result set presented in a list and you want to display detailed information about an object in that list without refreshing the page. You could do it in AJAX. You could share various presentation objects across a site with AJAX as well. <br />What you should probably not be doing right now is embark on large-scale projects revolving around this immature technology.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/04/25/working-with-ajax/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Declarative programming and dynamic languages</title>
		<link>http://microintellia.com/blog/2006/04/17/declarative-programming-and-dynamic-languages/</link>
		<comments>http://microintellia.com/blog/2006/04/17/declarative-programming-and-dynamic-languages/#comments</comments>
		<pubDate>Mon, 17 Apr 2006 14:00:27 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=29</guid>
		<description><![CDATA[I am following the dynamic vs static debate and its by-product, the debate of Ruby vs Java, not really understanding what the fuss is all about.
I think we could say that the language used in the XML descriptors of a package using declarative programming (such as an EJB XML descriptor, a struts-config.xml or bean-definitions.xml for [...]]]></description>
			<content:encoded><![CDATA[<p>I am following the dynamic vs static debate and its by-product, the debate of Ruby vs Java, not really understanding what the fuss is all about.</p>
<p>I think we could say that the language used in the XML descriptors of a package using declarative programming (such as an EJB XML descriptor, a struts-config.xml or bean-definitions.xml for Spring) fits the definition of a dynamic language.<br />You can change the behavior at runtime, you can create new classes and call them from different points in your program, you can even pass invalid objects to your program and find out that your program is not working because you didn&#8217;t XML-program (I have to admit &#8216;XML-program&#8217; is an atrocious name) it correctly. </p>
<p>Declarative programming and the descriptors that enforce the contracts specified declaratively could be viewed as the place where a Java app would act in a dynamic way. The language of the application would be Java + various XML descriptors rather than only Java and this language could be viewed as dynamic. </p>
<p>So far declarative programming has been used mostly for infrastructure (EJB, Struts, etc&#8230;) but it would be interesting to see what results if it is being used for describing an application. I am thinking particularly about organizations that write programs that have to be easily customizable (such as a B2C shopping cart, a content-management system, etc&#8230;). It would be a good thing if I could describe this application in a declarative way so that I could describe and incorporate a customized business-process easily into the application. My app would be changed dynamically, customized behaviour would be created and passed to the appropriate components, etc&#8230; It would be written in Java and described and assembled in XML descriptors. It would be dynamic. </p>
<p>For example when the user presses the submit order button on an e-commerce site I should be able to specify in a declarative fashion that the DB will get updated, the credit card will be charged and the back-office system will know to send the product to the user and ask for replenishment. I want to add this and other functionality and turn it on/off at run-time. </p>
<p>To go back to the debate of Ruby vs Java, I think that Ruby will not get much penetration into enterprise development. The reason is that by now a huge investment has been made in JEE applications, an investment of the size of a few millions line of code that have been developed and, more importantly, tested and debugged. Assuming that you need to add some dynamic behavior to your product you could do so by applying declarative programming to your existing code base rather than re-writing the application once more in the language that happens to be popular. The debate of Ruby vs Java is a non-debate, it debates the current Ruby development environment and Java&#8217;s development environment as it was 4-5 years ago, i.e. Java running on its own. However, today most applications written in Java are usually run in some container that allows for loading behavior dynamically. Ruby vs Java + some frameworks would seem a more rational debate, however I have not seen anyone taking part in it.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/04/17/declarative-programming-and-dynamic-languages/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spring proxy-based AOP versus annotation-based AOP</title>
		<link>http://microintellia.com/blog/2006/04/11/spring-proxy-based-aop-versus-annotation-based-aop/</link>
		<comments>http://microintellia.com/blog/2006/04/11/spring-proxy-based-aop-versus-annotation-based-aop/#comments</comments>
		<pubDate>Tue, 11 Apr 2006 18:14:23 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[AOP]]></category>

		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=30</guid>
		<description><![CDATA[One big difference between Spring’s proxy-based AOP implementation (referenced from now on as Spring AOP) and annotation-based AOP is the fact the Spring AOP declares the advices outside of the code while annotations declare the advice in the code. This causes some side effects:
1) Spring AOP lets you apply different behavior to the same class [...]]]></description>
			<content:encoded><![CDATA[<p>One big difference between Spring’s proxy-based AOP implementation (referenced from now on as Spring AOP) and annotation-based AOP is the fact the Spring AOP declares the advices outside of the code while annotations declare the advice in the code. This causes some side effects:</p>
<p>1) Spring AOP lets you apply different behavior to the same class in different instances (actually you can do this in the same instance). It would be possible to download an open-source JEE application (such as a B2C shopping cart) and customize it without changing code resulting in different instances of the same app. For example, you would be able to declare that various steps in the checkout are transactional, apply different security requirements from instance to instance without changing the downloaded code.</p>
<p>2) The fact that annotation-based AOP binds behavior to code implies some development coupling: you have to develop or at least design the advice before you develop the class being advised. Ideally you would develop the advice independent of the code it gets applied to.</p>
<p>3) Annotation-based AOP creates horizontal relationships between classes that are very hard to change. All the classes sharing the same advice are tied together. Suppose that you have a <em>Transaction </em>annotation applied to you account manager, user signup manager and checkout manager. It would be very hard (and would require quite a lot of code-juggling) to change the app so that only your checkout process is transactional. These horizontal relationships (which as far as I know have not been integrated into modeling tools) should probably not exist at the code level, but at the application-deployment level. Cross-functional behavior should probably be applied at deployment time when the user’s requirements are ready to be implemented.</p>
<p>4) Annotations may degrade portability. One example would be the core EJB3 annotations for persistence. These annotations are platform independent since they are part of the EJB3 spec, however, these annotations are probably insufficient for real-life deployment because they do not allow for application tuning (such as data caching for example). In order to add caching to an EJB we would probably have to add server-specific annotations, and these server-specific annotations ruin the portability between application servers. With Spring AOP we could write an aspect that would piggy-back on the server-specific cache and advise the DAO with this aspect at deployment time. We could change the cache pretty easily by creating a new aspect for a different cache and advise the DAO with this aspect at deployment time.</p>
<p>5) Spring AOP creates a new role in the product’s life-cycle: the application assembler role. This role (probably best fulfilled by a business analyst which has a relation with the customer) would allow for making the application more flexible to customer’s requirements. A business analyst should be able to look at an application, determine what type of behavior should be attached to, or detached from its various parts and attach or detach that behavior. Supposing that this behavior doesn’t exist the business analyst should be able to have it developed in an advice that is independent of the overall application and advise various parts of the application with this advise.</p>
<p>I think that Spring’s proxy-based AOP is a better proposition that AOP thru annotations. Annotations promote relationships that are hard-coded and unless are specified by the domain problem they should be better implemented outside of code.</p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/04/11/spring-proxy-based-aop-versus-annotation-based-aop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://microintellia.com/blog/2006/04/04/hello-world-2/</link>
		<comments>http://microintellia.com/blog/2006/04/04/hello-world-2/#comments</comments>
		<pubDate>Tue, 04 Apr 2006 14:34:50 +0000</pubDate>
		<dc:creator>&#60;ADMINNICENAME&#62;</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://microintellia.com/blog/?p=31</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img border="0" alt="emoticon" src="http://cristi.blogsome.com/wp-content/plugins/Wysi-Wordpress/plugins/emotions/images/bye.gif" /></p>
]]></content:encoded>
			<wfw:commentRss>http://microintellia.com/blog/2006/04/04/hello-world-2/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

