<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Adam Jordens@littlesquare:~/</title>
	
	<link>http://littlesquare.com</link>
	<description>Just a little square in a sea of blogs.</description>
	<lastBuildDate>Wed, 02 Dec 2009 05:45:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/littlesquare" /><feedburner:info uri="littlesquare" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>When Good is Enough (and when it isn’t)</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/2TTARS00w_k/</link>
		<comments>http://littlesquare.com/2009/12/01/when-good-is-enough-and-when-it-isnt/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 05:30:06 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/12/01/when-good-is-enough-and-when-it-isnt/</guid>
		<description><![CDATA[It’s a constant debate that we fight on a daily basis, is the work we’ve completed good enough, or is important enough to spend an extra half day or day(s) perfecting.
Often times we’re forced to make sacrifices, but when is it the right time to push back or accept defeat?
Obviously what follows here are my [...]]]></description>
			<content:encoded><![CDATA[<p>It’s a constant debate that we fight on a daily basis, is the work we’ve completed good enough, or is important enough to spend an extra half day or day(s) perfecting.</p>
<p>Often times we’re forced to make sacrifices, but when is it the right time to push back or accept defeat?</p>
<p>Obviously what follows here are my own opinions but I’m a firm believer that a well executed plan only 80% complete, is worth leaps and bounds more than a flawed plan 100% complete. </p>
<p>&#160;</p>
<p>A few questions I commonly ask myself:</p>
<ul>
<li><em><u>Is what I’m working on tied to a software release</u>.&#160; </em>We release on a month basis in two 2 week iterations.&#160; I know that if I want to make it into a release, I need to have it done sufficiently ahead of time in order to ensure adequate testing.&#160; <strong>This may mean cutting scope.&#160; </strong>Cutting scope is fine IMO, just do so in a way that you avoid silly shortcuts that create headaches for yourself when you inevitably have to come back and add functionality. </li>
<li><em><u>Who is the consumer</u></em>. Is it a paying customer (<em>ie. they have already paid)</em>? Is it for a demo? Is it for another developer? If its a customer, what are they actually trying to accomplish? Often times, we get caught up in our own expectations of how something should look or behave, and lose sight of what the customer is actually trying to do.&#160; If the customer is currently using pen &amp; paper to track something, a simple (<em>ugly?) </em>web form may be perfectly acceptable. <strong>Don’t overcomplify. </strong>With good feedback, you can always come back and do a better job. Focus on the present, don’t get distracted on what you <strong>*might*</strong> need to do in the future. </li>
<li><em><u>How often is the functionality used</u>. </em>If the feature or function being worked on is used by a handful of backend administrators, you may not need to go over the top on day one.&#160; If they come back and tell you that they absolutely cannot use the system without A, B or C.&#160; Make sure you understand what A, B and C are and get cracking.&#160; <strong>Quick turnaround built loyalty and trust.&#160; You need both as early in the customer relationship as possible.&#160; </strong>If the feature is public facing and used by a large percentage of the audience, by all means, perfect it. </li>
<li><em><u>Do I need to modify the database</u></em>. From a technical perspective, this has always been a killer.&#160; Make a flub manipulating the database, and you’ll cause yourself countless hours of time trying to correct customer datasets. <strong>Get representational datasets, migrate them automatically and test test test!</strong>&#160; Speaking from experience, do not cut corners testing or working with your database migrations. </li>
<li><em><u>Have I been burnt in this area before</u></em>. Maybe the work you’re doing is in direct response to a filed bug.&#160; Either way, if you’re working a particularly risky area of the codebase, it’s worth going that extra step to ensure you’ve got solid code coverage (<em>unit, regression, selenium tests, etc.</em>).&#160; <strong>Fool me once… Fool me twice…</strong> </li>
</ul>
<p>&#160;</p>
<p>There are plenty more, but in general, I err on the side of trying to get releases out the door.&#160; If we spend 20 calendar days in a release (4 work weeks), <strong>up to 6</strong> of those will be spent either performing non-automated regression tests (<em>don’t worry, we have automated tests as well</em>) or fixing post code-complete deficiencies.&#160; </p>
<p>Test cases are a given.&#160; If you’re working Java or any other programming language with tooling like JUnit or TestNG, I really see no excuse not to use it.&#160; If nothing else, it’s a good safety net if you ever need to refactor a particular area of the code base.&#160; </p>
<p>&#160;</p>
<p>If I had to pick a guiding principle, it would be:&#160; <strong><em>Get it in, Make it right, Make it fast.</em></strong>&#160; </p>
<p><em><strong></strong></em></p>
<p><em><strong>Get it in </strong>because you need the feedback.</em></p>
<p><em><strong>Make it right </strong>because that’s what we’re paid to do and stakeholders expect it.</em></p>
<p><em><strong>Make it fast </strong>because it’s no fun staying up until 2:00am trying to debug performance problems on a customers live system.</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=2TTARS00w_k:aIi-MeIBmOo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=2TTARS00w_k:aIi-MeIBmOo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=2TTARS00w_k:aIi-MeIBmOo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=2TTARS00w_k:aIi-MeIBmOo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/2TTARS00w_k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/12/01/when-good-is-enough-and-when-it-isnt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/12/01/when-good-is-enough-and-when-it-isnt/</feedburner:origLink></item>
		<item>
		<title>Using Interfaces with JAXB</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/Q_lT5rCh5bk/</link>
		<comments>http://littlesquare.com/2009/11/25/using-interfaces-with-jaxb/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 02:38:23 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/11/25/using-interfaces-with-jaxb/</guid>
		<description><![CDATA[I set about the other day to use JAXB-annotated classes to generate some JSON as part of some web services work.
The trivial case worked.
@XmlRootElement     public class ExtMessage      {      &#160;&#160;&#160; private String owner; 
&#160;&#160;&#160; @XmlElement     &#160;&#160;&#160; private ExtConcreteBody [...]]]></description>
			<content:encoded><![CDATA[<p>I set about the other day to use JAXB-annotated classes to generate some JSON as part of some web services work.</p>
<p>The trivial case worked.</p>
<blockquote><p>@XmlRootElement     <br />public class ExtMessage      <br />{      <br />&#160;&#160;&#160; private String owner; </p>
<p>&#160;&#160;&#160; @XmlElement     <br />&#160;&#160;&#160; private ExtConcreteBody body; </p>
<p>}</p>
</blockquote>
<p>What I set about doing next caused some immediate grief.&#160; My intention for ‘body’ is to actually be one of many JSON entities. First attempt was to introduce a JSONBody interface and use that instead of ExtConcreteBody.</p>
<blockquote><p>@XmlRootElement     <br />public class ExtMessage      <br />{      <br />&#160;&#160;&#160; private String owner; </p>
<p>&#160;&#160;&#160; @XmlElement     <br />&#160;&#160;&#160; private JSONBody body; </p>
<p>}</p>
</blockquote>
<p>Of course that didn’t work.&#160; At marshalling time, the JAXB provider complained about not supporting interfaces.</p>
<p>A quick search on Google said I wasn’t the only person who had run into this problem before.&#160; </p>
<p>Best resource I found was the <a href="https://jaxb.dev.java.net/guide/Mapping_interfaces.html">JAXB User Guide</a>.&#160; Seems to have some funny rendering and be slightly out of date, but it led me down the correct path.</p>
<p>Essentially you need to make use of an <strong>XmlJavaTypeAdapter</strong>.&#160; JAXB ships a default one (AnyTypeAdapter) that will generate a ‘<font face="cour">type=&quot;xs:anyType&quot;</font>’ in your xml schema.&#160; If you want specific type support, you can implement your own Adapter.&#160; </p>
<p>After adding the class-level @XmlJavaTypeAdapter(AnyTypeAdapter.class) to JSONBody, I thought I had it licked.</p>
<p>Then the JAXB provider complained that “Marshalling Error: class [...] nor any of its super class is known to this context”.</p>
<p><strong>WTF?</strong></p>
<p>Fortunately that led me to a comment on a random blog post on <a href="http://syrupsucker.blogspot.com/2008/10/collections-and-jax-rs.html">Collections and JAX-RS</a> mentioning that you should use an @XmlSeeAlso(…) if you want to avoid that error.</p>
<p>Finally it works.</p>
<blockquote><p>@XmlRootElement</p>
<p>@<strong>XmlSeeAlso</strong>(ExtConcreteBody.class)      <br />public class ExtMessage      <br />{      <br />&#160;&#160;&#160; private String owner; </p>
<p>&#160;&#160;&#160; @XmlElement     <br />&#160;&#160;&#160; private JSONBody body; </p>
<p>}</p>
<p>@<strong>XmlJavaTypeAdapter</strong>(AnyTypeAdapter.class)      <br />public interface JSONBody      <br />{      <br />}</p>
<p>@XmlRootElement     <br />public class ExtConreteBody implements JSONBody       <br />{      <br />&#160;&#160;&#160; private int id;</p>
<p>}</p>
</blockquote>
<p>The JSON looked like:</p>
<blockquote><p>{&quot;extMessage&quot;:{&quot;body&quot;:{&quot;@type&quot;:&quot;extConcreateBody&quot;,&quot;id&quot;:&quot;0&quot;},&quot;owner&quot;:&quot;dummy.user&quot;}}</p>
</blockquote>
<p>Which seemed reasonable to me.</p>
<p>Hopefully this helps anyone else out there that is having grief trying to do the same thing!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=Q_lT5rCh5bk:7Q6lyiZ8T_Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=Q_lT5rCh5bk:7Q6lyiZ8T_Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=Q_lT5rCh5bk:7Q6lyiZ8T_Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=Q_lT5rCh5bk:7Q6lyiZ8T_Q:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/Q_lT5rCh5bk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/11/25/using-interfaces-with-jaxb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/11/25/using-interfaces-with-jaxb/</feedburner:origLink></item>
		<item>
		<title>You’re a big company, now act like a little one.</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/1-yO6b1oz7c/</link>
		<comments>http://littlesquare.com/2009/09/09/youre-a-big-company-now-act-like-a-little-one/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 08:11:57 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/09/09/youre-a-big-company-now-act-like-a-little-one/</guid>
		<description><![CDATA[Very good article over on Smart Bear about small companies behaving like small companies when it comes to interacting with customers, and not pretending to be something they aren’t.
&#160;
I won’t claim to work for a big company, it’s still very much the opposite.&#160; But over the past 5 or 6 years, I have seen a [...]]]></description>
			<content:encoded><![CDATA[<p>Very good <a href="http://blog.asmartbear.com/blog/youre-a-little-company-now-act-like-one.html">article</a> over on Smart Bear about small companies behaving like small companies when it comes to interacting with customers, and not pretending to be something they aren’t.</p>
<p>&#160;</p>
<p>I won’t claim to work for a big company, it’s still very much the opposite.&#160; But over the past 5 or 6 years, I have seen a transition in how customers are marketed to and interacted with from sale to solution implementation and beyond.&#160; We’ve gone from a group of 2 to a company of more than 70 complete with departments, budgets, vice presidents, BoDs, etc.&#160; </p>
<p>I’m not a marketer so I’m not going to comment on our web presence or our quarterly e-mail campaigns.&#160; They seem to be working as that mythical funnel remains full.&#160; Needless to say, our sales process was very rudimentary back in the day, there certainly was no funnel.&#160; We develop enterprise solutions and have always made the $100k+ deals.</p>
<p>&#160;</p>
<p>All things aside, when you start considering customers as a number or percentage point in some quarterly metric you’re trying to hit, you’ve lost an edge.&#160; The startup isn’t even going to have the metric in the first place, they’re going to be concentrating on getting the customer’s attention, getting them product, iterating on said product, and maintaining the relationship.&#160; The product may suck (<em>our first few releases definitely did</em>) but that’s addressable over time.&#160; The relationship is far more important and can be lost very quickly.&#160; </p>
<p>The other thing that changes as a company gets larger is focus.&#160; No longer do you have that laser guided focus on getting product to a single customer, you’re now dealing with existing and new customers simultaneously.&#160; Your decision making ability slows as you’re forced to consider the implications of change to <em>all</em> customers.&#160; It’s one of those annoying but necessary evils that comes with maturity and customer successes.&#160; <img src='http://littlesquare.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .&#160; </p>
<p>I shouldn’t say it’s impossible to maintain the focus, it just becomes more difficult.&#160; Your ability to focus on a particular customer is, in my mind, a key indicator of your ability to be successful.&#160; It’s one of the reasons we track a customer satisfaction metric.&#160; I won’t get into how it’s calculated, but essentially its a gauge of how often we’re communicating with a customer and whether or not the relationship is positive and if they’re happy with their particular solution.&#160; Green is good, Red/Yellow is bad.</p>
<p>The other key indicator in my mind is not making the same mistake twice, but that’s a topic for another post.&#160; It’s an item of significant competitive advantage that the slightly larger company has over the startup. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=1-yO6b1oz7c:nB4oueolH5w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=1-yO6b1oz7c:nB4oueolH5w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=1-yO6b1oz7c:nB4oueolH5w:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=1-yO6b1oz7c:nB4oueolH5w:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/1-yO6b1oz7c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/09/09/youre-a-big-company-now-act-like-a-little-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/09/09/youre-a-big-company-now-act-like-a-little-one/</feedburner:origLink></item>
		<item>
		<title>I’ve been a terrible blogger…</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/-kK9HDG11v8/</link>
		<comments>http://littlesquare.com/2009/09/07/ive-been-a-terrible-blogger/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 06:47:39 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[citations]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/09/07/ive-been-a-terrible-blogger/</guid>
		<description><![CDATA[I must admit that I’ve been a terrible blogger these past few months.
I blame Twitter!
&#160;
Now that fall is upon us, I’m going to try and write more than 140 characters on a somewhat regular basis.&#160; 
]]></description>
			<content:encoded><![CDATA[<p>I must admit that I’ve been a terrible blogger these past few months.</p>
<p>I blame <a href="http://twitter.com/ajordens">Twitter</a>!</p>
<p>&#160;</p>
<p>Now that fall is upon us, I’m going to try and write more than 140 characters on a somewhat regular basis.&#160; </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=-kK9HDG11v8:LzG8SfjiVGY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=-kK9HDG11v8:LzG8SfjiVGY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=-kK9HDG11v8:LzG8SfjiVGY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=-kK9HDG11v8:LzG8SfjiVGY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/-kK9HDG11v8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/09/07/ive-been-a-terrible-blogger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/09/07/ive-been-a-terrible-blogger/</feedburner:origLink></item>
		<item>
		<title>Maintaining OEM’d Source</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/j_TzVBfvt1g/</link>
		<comments>http://littlesquare.com/2009/09/07/maintaining-oemd-source/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 06:42:29 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/09/07/maintaining-oemd-source/</guid>
		<description><![CDATA[Background
The company I work for made the decision to OEM a product from a partner, rather than invest valuable development time to build something that has essentially been commoditized.
Development resources are at a premium and we consciously don’t want to spend any more time on this code base than we have to, we’re much better [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Background</strong></p>
<p>The company I work for made the decision to OEM a product from a partner, rather than invest valuable development time to build something that has essentially been commoditized.</p>
<p>Development resources are at a premium and we consciously don’t want to spend any more time on this code base than we have to, we’re <strong>much better</strong> at adding value in other areas.</p>
<p>&#160;</p>
<p>Not necessarily a bad or the wrong decision, we’ve just reached the point in time where we need to make functional changes to the OEM’d code base.&#160; </p>
<p>&#160;</p>
<p><strong>Due Diligence</strong></p>
<p>Obviously, before you entertain the outright purchase or license of a third party product/code base, there’s a few questions you ought to ask yourself:</p>
<p><em>- Is the technology stack compatible with our existing products?&#160; </em>(A member of the development staff should provide the answer)</p>
<p>-<em> Does the product do significantly less/more than we will ever need it to? </em>(The later is an important question, do you really want to maintain features that customers will never use? What’s the cost of re-implementing just the features the customer does need?)</p>
<p>- <em>What’s the support model look like? </em>(Who is fixing bugs, you or the source company? How are patches exchanged, or are they?)</p>
<p>&#160;</p>
<p><strong>Maintenance</strong></p>
<p>During the course of our due diligence, we did send a couple developers on site to become familiar with not only the code base but in particular the build process around it.</p>
<p>This did pay dividends as we were able to setup Bamboo builds capable of automatically creating installation packages and running unit tests.</p>
<p><em>Significant win in my books</em>.&#160; Test coverage may not be the greatest, but if you can build a complete candidate release in 7 minutes, manual testing/verification remains a possibility.</p>
<p>&#160;</p>
<p>That’s it for now.&#160; </p>
<p>I’ll admit that I was a skeptic when the idea of adopting a 3rd party code base was first brought up.&#160; Fortunately the changes we’ve been required to make thus far have been minor.&#160; Technology stack is slightly different and anecdotally bug fixes seem to be taking ~3x longer then they would on our primary product, I expect that ratio to more or less even out as we familiarize ourselves with the patterns and structure in the new code base.&#160; </p>
<p>The verdict&#8217;s still out on whether or not we’ll be able to add any new components of significant functionality while keeping things at all maintainable.</p>
<p>But of course that’s the challenge inherent with any software development activity!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=j_TzVBfvt1g:JHfG55qWU-U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=j_TzVBfvt1g:JHfG55qWU-U:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=j_TzVBfvt1g:JHfG55qWU-U:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=j_TzVBfvt1g:JHfG55qWU-U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/j_TzVBfvt1g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/09/07/maintaining-oemd-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/09/07/maintaining-oemd-source/</feedburner:origLink></item>
		<item>
		<title>DeveloperForce.com : Initial Thoughts and Experiences using the Platform</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/SUmw2UtL2ws/</link>
		<comments>http://littlesquare.com/2009/07/08/developerforce-com-initial-thoughts-and-experiences-using-the-platform/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 06:39:19 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source Software]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/07/08/developerforce-com-initial-thoughts-and-experiences-using-the-platform/</guid>
		<description><![CDATA[The team and I have recently kicked off a rather ambitious project.&#160; In an attempt to help accelerate the early development activities, we’ve made a decision to build a series of one-off implementations using the DeveloperForce.com platform (salesforce.com sans the sales CRM portions).
The objective is to learn enough about the platform during these initial largely [...]]]></description>
			<content:encoded><![CDATA[<p>The team and I have recently kicked off a rather ambitious <a href="http://www.genologics.com/translational-research">project</a>.&#160; In an attempt to help accelerate the early development activities, we’ve made a decision to build a series of one-off implementations using the <em>DeveloperForce.com</em> platform (<em>salesforce.com sans the sales CRM portions</em>).</p>
<p>The objective is to learn enough about the platform during these initial largely custom implementations, to be in a position to hopefully create and deliver a largely standalone solutions faster than we would using the typical Java technology stack.</p>
<p>The jury is still out, but what follows are some initial thoughts after working with the platform.&#160; The team in question are a group of 3 senior developers working collectively on an application deployed in a single Salesforce Organization.&#160; <em></em></p>
<p><em>Forgive my use or miss-use of Salesforce/DeveloperForce terminology.&#160; </em><em>It can get confusing at times <img src='http://littlesquare.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<p><strong></strong></p>
<p><strong>Version Control</strong></p>
<p>Like any good development shop, we store all code and build artifacts in source control.&#160; Subversion is our poison of choice.</p>
<p>Salesforce development is a bit different in that a lot of the configuration and development activities can occur in either the browser or their Eclipse-based IDE.&#160; </p>
<p>Our strategy for getting code and configurations under source control was to use Eclipse and regularly sync with our development organizations (<em>Salesforce jargon for a development space or area</em>).&#160; </p>
<p>Unbeknownst to us at the onset, there are certain configurations you can make using the browser that are not possible to make with the IDE.&#160; It’s important that these configurations (<em>user/queue creation, etc.</em>) are documented externally (<em>ie. in a spreadsheet</em>).</p>
<p>Code and configurations are moved between developers using Subversion and the Eclipse synchronization capabilities (or the Salesforce migration tool).&#160; By storing these artifacts in Subversion, we’re also able to do code reviews on them via Crucible.</p>
<p>Your mileage may vary with this approach, as we found the current Salesforce tooling to be quite poor at conflict resolution when it came to structural changes.&#160; Moreover, we frequently had to fall back to manually making changes via the web browser.&#160; <strong></strong></p>
<p><strong>Very annoying</strong>.&#160; </p>
<p>I think it’s safe to assume that despite all the redeeming qualities of the DeveloperForce platform, some significant gaps remain when it comes to the expectations of traditional software developers.&#160; By traditional, I mean those of us that are used to using source control, doing code reviews, etc.&#160; <strong>I guess Salesforce considers us a dying breed <img src='http://littlesquare.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
<p>&#160;</p>
<p>Would I choose the platform to build a product I expected to maintain in the long-term and derive significant value from? <strong>No</strong>.&#160; </p>
<p>Would I use it in the short-term as a RAD environment to build a prototype? <strong>Possibly</strong>, but not without first considering some of the more traditional alternatives (<em>there are a number of schema-less data storage products available these days, combine that with a Grails, Seam, Rails or Django and you may very well be off to the races</em>).</p>
<p>&#160;</p>
<p>That’s enough for one night.&#160; I plan on doing a follow-up once the team has more experience maintaining and migrating code after it’s been deployed to DeveloperForce.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=SUmw2UtL2ws:X1CUhPeL61Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=SUmw2UtL2ws:X1CUhPeL61Y:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=SUmw2UtL2ws:X1CUhPeL61Y:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=SUmw2UtL2ws:X1CUhPeL61Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/SUmw2UtL2ws" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/07/08/developerforce-com-initial-thoughts-and-experiences-using-the-platform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/07/08/developerforce-com-initial-thoughts-and-experiences-using-the-platform/</feedburner:origLink></item>
		<item>
		<title>Hibernate Scalability Talk</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/S8TzwRY2ub8/</link>
		<comments>http://littlesquare.com/2009/06/20/hibernate-scalability-talk/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 03:05:48 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source Software]]></category>
		<category><![CDATA[qcon hibernate]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/06/20/hibernate-scalability-talk/</guid>
		<description><![CDATA[Good talk from Emmanuel Bernard and Max Ross on the subject over at InfoQ. Both Hibernate Core and Shards are covered, as well as Hibernate Search.
Particularly interesting for me was his overview of the different mechanisms by which you can support multiple customer schemas securely and with decent performance.&#160; The product I’m actively working on [...]]]></description>
			<content:encoded><![CDATA[<p>Good <a href="http://www.infoq.com/presentations/Scaling-Hibernate-Emmanuel-Bernard-Max-Ross">talk</a> from Emmanuel Bernard and Max Ross on the subject over at InfoQ. Both Hibernate Core and Shards are covered, as well as Hibernate Search.</p>
<p>Particularly interesting for me was his overview of the different mechanisms by which you can support multiple customer schemas securely and with decent performance.&#160; The product I’m actively working on is likely headed in this direction, looks like Oracle VPD is Emmanuel’s preferred solution.&#160; A quick search has turned up an add-on for Postgres called <a href="http://veil.projects.postgresql.org/curdocs/index.html">Veil</a> which aims to provide row/column-level security similar to Oracle VPD.&#160; Good to at least have a choice, but I imagine that when push comes to shove, Oracle will win out.</p>
<p>Shards has always looked interesting, will be nice when it finally hits GA and supports the JPA API.&#160; Would make it slightly easier to incorporate and play around with.</p>
<p>Interesting thoughts on clustering Lucene/Hibernate Search.&#160; We’re currently running it asynchronously (<em>ie. @Asynchronous in Seam</em>) on a single node but will likely need to look at pushing it to a second box and trying to get indexes in near real time without noticeable degradation to the front-end.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=S8TzwRY2ub8:kxOtU7cfPwQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=S8TzwRY2ub8:kxOtU7cfPwQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=S8TzwRY2ub8:kxOtU7cfPwQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=S8TzwRY2ub8:kxOtU7cfPwQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/S8TzwRY2ub8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/06/20/hibernate-scalability-talk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/06/20/hibernate-scalability-talk/</feedburner:origLink></item>
		<item>
		<title>Win7, nice to meet you.</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/PtH6N4c7Q9E/</link>
		<comments>http://littlesquare.com/2009/05/21/win7-nice-to-meet-you/#comments</comments>
		<pubDate>Fri, 22 May 2009 05:12:57 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[citations]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/05/21/win7-nice-to-meet-you/</guid>
		<description><![CDATA[I hate to admit it but I’ve been running Vista on a desktop machine at home for the better part of the past 8 months.
It has not been a terrible experience (High-end dual-core with 8 gigs of ram does help) but I’ve been looking for more.
I’ve heard good things about Win7, and with the recent [...]]]></description>
			<content:encoded><![CDATA[<p>I hate to admit it but I’ve been running Vista on a desktop machine at home for the better part of the past 8 months.</p>
<p>It has not been a terrible experience (<em>High-end dual-core with 8 gigs of ram does help</em>) but I’ve been looking for more.</p>
<p>I’ve heard good things about Win7, and with the recent release of the RC, decided to upgrade.</p>
<p>&#160;</p>
<p>I must say the process was quite painless and almost everything worked out of the box.&#160; We just got a new SonicWALL Firewall/VPN at work and the client had to be re-installed.&#160; Other than that, a minor tweak to the <a href="http://www.blogsdna.com/1900/how-to-run-google-chrome-on-windows-7-64-bit-version.htm">command-line parameters for Chrome</a> and I was off to the races.</p>
<p>YMMV but I’ve seen a noticeable improvement in my day-to-day activities on the machine.&#160; </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=PtH6N4c7Q9E:EWdcJGhc5Ts:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=PtH6N4c7Q9E:EWdcJGhc5Ts:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=PtH6N4c7Q9E:EWdcJGhc5Ts:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=PtH6N4c7Q9E:EWdcJGhc5Ts:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/PtH6N4c7Q9E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/05/21/win7-nice-to-meet-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/05/21/win7-nice-to-meet-you/</feedburner:origLink></item>
		<item>
		<title>Good-bye Exchange, it was nice knowing you (I hope)</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/XC2yS4MCjl8/</link>
		<comments>http://littlesquare.com/2009/05/21/good-bye-exchange-it-was-nice-knowing-you-i-hope/#comments</comments>
		<pubDate>Fri, 22 May 2009 05:04:24 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/05/21/good-bye-exchange-it-was-nice-knowing-you-i-hope/</guid>
		<description><![CDATA[I’m happy to say that after a good 3 or 4 years of using Exchange for all our corporate email/calendaring, there is light at the end of the tunnel.
I got an invitation today to join our pilot project on Google Apps for Enterprise.&#160; Awesome, right!?
Is it bad than I’m looking forward to the opportunity to [...]]]></description>
			<content:encoded><![CDATA[<p>I’m happy to say that after a good 3 or 4 years of using Exchange for all our corporate email/calendaring, there is light at the end of the tunnel.</p>
<p>I got an invitation today to join our pilot project on Google Apps for Enterprise.&#160; Awesome, right!?</p>
<p>Is it bad than I’m looking forward to the opportunity to jettison all 35 or 40k emails and start anew?&#160; I’d honestly trade that in an instance to free up the memory and CPU cycles chewed up by Entourage.&#160; </p>
<p>&#160;</p>
<p>It’ll be interesting to see how it plays out.&#160; It’s still a pilot project so there are a few obvious and annoying gaps that force me back to Entourage, but if we can work out those kinks I’ll sure be a happy camper.&#160; </p>
<p><em>Given that our executives were willing to jump on the iPhone bandwagon from the Blackberry, this idea could actually fly.</em></p>
<p>&#160;</p>
<p>I’d be curious to hear from any small to mid-sized companies (<em>we’re in the 75-100 employee range</em>) that have made similar transitions.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=XC2yS4MCjl8:OYALr47BkBQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=XC2yS4MCjl8:OYALr47BkBQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=XC2yS4MCjl8:OYALr47BkBQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=XC2yS4MCjl8:OYALr47BkBQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/XC2yS4MCjl8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/05/21/good-bye-exchange-it-was-nice-knowing-you-i-hope/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/05/21/good-bye-exchange-it-was-nice-knowing-you-i-hope/</feedburner:origLink></item>
		<item>
		<title>Framework misuses are still your bugs.</title>
		<link>http://feedproxy.google.com/~r/littlesquare/~3/YR-4MvuA90A/</link>
		<comments>http://littlesquare.com/2009/03/03/framework-misuses-are-still-your-bugs/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 16:24:04 +0000</pubDate>
		<dc:creator>ajordens</dc:creator>
				<category><![CDATA[General Discussions]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source Software]]></category>

		<guid isPermaLink="false">http://littlesquare.com/2009/03/03/framework-misuses-are-still-your-bugs/</guid>
		<description><![CDATA[I spent a few hours tonight trying to diagnose a problem we were running into tonight with some web application code.
That was on top of the better part of a day that was spent by another developer digging into the code.
Development ain’t easy, and frameworks for all their glory strive to make the easy stuff [...]]]></description>
			<content:encoded><![CDATA[<p>I spent a few hours tonight trying to diagnose a problem we were running into tonight with some web application code.</p>
<p>That was on top of the better part of a day that was spent by another developer digging into the code.</p>
<p>Development ain’t easy, and frameworks for all their glory strive to make the easy stuff easier and the difficult stuff… well it’s still difficult.</p>
<p>Take Seam for example, a couple simple @In annotations here and there, and all of a sudden you have an application up and running.&#160; </p>
<p>But throw transactions and exceptions into the mix and the expected behaviour is up in the air.</p>
<p>Imagine the following scenario:</p>
<blockquote><p>Component A calls Component B.update() which in turn calls EntityManager.persist(someEntity).</p>
<p>someEntity fails a database constraint and an EntityAlreadyExists exception is propagated from Component B.update().&#160; </p>
</blockquote>
<p>Can Component A turn around and update someEntity and call Component B.update() again?</p>
<p>It depends.&#160; In Seam there is a RollbackInterceptor behind the scenes that will rollback any transaction crossing an injection boundary (<em>it’s slightly more complicated than that but we’ll leave that for another day</em>).&#160; </p>
<p>If Component A was a POJO Transactional Seam component, and Component B was a Seam EntityHome component, this wouldn’t work.&#160; In this sitation, Component B throwing an exception would actually rollback the transaction before control was returned to Component A.&#160; Component A could very well handle the exception but the underlying transaction would still be rolled back.</p>
<p>From the looks of the implementation, the EntityHome (<em>Component B</em>) is relying on the entity existing in its PersistenceContext when doing an update.&#160; You can update() multiple times as long as the transaction remains open and long-running.</p>
<p>Throw an exception into the mix and that transaction is likely to get rolled back by the RollbackInterceptor and the persistence context reset.</p>
<p>From that point on, calling Component B.update() (<em>equivalent to EntityHome.update()</em>) is going to report a success but do nothing but flush an empty persistence context.&#160; </p>
<p>&#160;</p>
<p>The short term fix was to have Component B.update() re-merge in <em>someEntity</em>.&#160; However, rather than perverting the framework, it likely makes sense to dig deeper into the implementations and merge Component A and Component B to prevent the RollbackInterceptor from firing and rolling back the transaction on an exception that is recoverable.</p>
<p>The things you learn!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/littlesquare?a=YR-4MvuA90A:8kA-TneiYog:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=YR-4MvuA90A:8kA-TneiYog:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/littlesquare?i=YR-4MvuA90A:8kA-TneiYog:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/littlesquare?a=YR-4MvuA90A:8kA-TneiYog:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/littlesquare?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/littlesquare/~4/YR-4MvuA90A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://littlesquare.com/2009/03/03/framework-misuses-are-still-your-bugs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://littlesquare.com/2009/03/03/framework-misuses-are-still-your-bugs/</feedburner:origLink></item>
	</channel>
</rss>
