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

<channel>
	<title>Lumenovis</title>
	<atom:link href="http://lumenovis.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lumenovis.com</link>
	<description>Technology Consulting and Software Development</description>
	<lastBuildDate>Mon, 03 Jan 2011 18:13:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Scale, Facebook Style</title>
		<link>http://lumenovis.com/2011/01/02/scale-facebook-style/</link>
		<comments>http://lumenovis.com/2011/01/02/scale-facebook-style/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 04:59:13 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=248</guid>
		<description><![CDATA[Facebook scale elements]]></description>
			<content:encoded><![CDATA[<p>After reading the Time magazine &#8220;Person of the Year&#8221; article (about Mark Zuckerberg), it occurred to me that I&#8217;d never really explored Facebook&#8217;s scale and the techniques used to achieve it.  After a brief search, I found the following concise and informative overview of the &#8220;Facebook&#8221; stack.  For a scale-geek like me, this was gold and I stayed up way too late drilling down into each link.  I already knew about or had used many of these components, but the sheer size of the implementation at Facebook is staggering, and the creativity in which they are developed, employed and modified these components is noteworthy.</p>
<p><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #234fae} span.s1 {text-decoration: underline} --><a href="http://royal.pingdom.com/2010/06/18/the-software-behind-facebook/" target="_blank">http://royal.pingdom.com/2010/06/18/the-software-behind-facebook/</a></p>
<p>What really impressed me is that, even though the underlying components are often very sophisticated, the overall architecture is very straightforward and adheres to the architectural premise of &#8220;simplify, simplify, simplify&#8221;&#8230;</p>
<p>Kudos to the Facebook team, and thanks to the folks at pingdom for compiling this information.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2011/01/02/scale-facebook-style/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloud Predictions 2011</title>
		<link>http://lumenovis.com/2010/12/28/cloud-predictions-2011/</link>
		<comments>http://lumenovis.com/2010/12/28/cloud-predictions-2011/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 20:26:14 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[SaaS]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=241</guid>
		<description><![CDATA[Cloud predictions 2011]]></description>
			<content:encoded><![CDATA[<p>Good article on some of the likely moves in the SaaS and cloud space.</p>
<p><a href="http://www.cio.com/article/645763/Cloud_Computing_2011_Predictions?page=1&amp;taxonomyId=3112" target="_blank">http://www.cio.com/article/645763/Cloud_Computing_2011_Predictions?page=1&amp;taxonomyId=3112</a></p>
<blockquote><p><a href="http://www.cio.com/article/645763/Cloud_Computing_2011_Predictions?page=1&amp;taxonomyId=3112" target="_blank"></a>&#8220;No cloud vendor, no matter how large or smart, can repeal the laws of physics, and migrating workloads and (especially) data between sites confronts the issue of &#8220;the skinny straw,&#8221; which is the fact that the connectivity between internal sites and public cloud providers is much lower than that within either of those environments.</p>
<p>Furthermore, supporting seamless migration requires a sophisticated IT infrastructure and operations capability, which translates into investment and skill building. While these factors can be procured or created, it&#8217;s not a trivial task to do so.</p>
<p>Both of these challenges will make IT executives realize that the all-moving hybrid cloud strategy is overly ambitious and needs to be scaled back. Trying to implement such a vision, for many organizations, will prove to be <a href="http://en.wikipedia.org/wiki/A_Bridge_Too_Far_%28film%29" target="_blank">&#8220;A Bridge Too Far&#8221;</a>.&#8221;</p></blockquote>
<p>Cloud is powerful and should be considered in nearly any IT strategy, but it also falls into &#8220;trained experts at work, don&#8217;t try this at home&#8221;.  Lumenovis and others have years of experience in hosted / SaaS systems and can help with the design, planning, and implementation of SaaS solutions.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/12/28/cloud-predictions-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software platform trends</title>
		<link>http://lumenovis.com/2010/12/23/software-platform-trends/</link>
		<comments>http://lumenovis.com/2010/12/23/software-platform-trends/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 03:55:12 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=245</guid>
		<description><![CDATA[Software language usage]]></description>
			<content:encoded><![CDATA[<p>Interesting perspective on where the action is from a software development platform standpoint.</p>
<p><a href="http://www.eweek.com/c/a/Application-Development/Java-C-C-Top-18-Programming-Languages-for-2011-480790/?kc=EWKNLBOE12242010FEA1" target="_blank">http://www.eweek.com/c/a/Application-Development/Java-C-C-Top-18-Programming-Languages-for-2011-480790/?kc=EWKNLBOE12242010FEA1</a></p>
<p>I&#8217;m excited to see the number of new platforms that aim to simplify software development.  Seriously, the biggest language advance over the last 20-30 years (since C/C++ days) may have been virtual machines with garbage collection.  Useful, but certainly not earth-shattering.  True, there have been major improvements in productivity now that app servers and open source libraries provide most of the &#8220;plumbing&#8221; for free (or close to it), but the act of writing a program using basic language syntax is still pretty primitive and prone to error.  I&#8217;m excited to explore the new languages, and I look forward to radical improvements in productivity and quality over the next decade.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/12/23/software-platform-trends/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protecting against attack</title>
		<link>http://lumenovis.com/2010/11/19/protecting-against-attack/</link>
		<comments>http://lumenovis.com/2010/11/19/protecting-against-attack/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 22:47:06 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[vulnerability]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=234</guid>
		<description><![CDATA[The web is a hostile place.  There are no real governing and policing bodies protecting &#8220;good citizens&#8221;.  There are no borders.  There are lots of bad but very clever people trying to exploit the good citizens.  The (current) underlying protocols (TCP/IP and HTTP) provide little in the way of protection but offer many attack vectors. [...]]]></description>
			<content:encoded><![CDATA[<p>The web is a hostile place.  There are no real governing and policing bodies protecting &#8220;good citizens&#8221;.  There are no borders.  There are lots of bad but very clever people trying to exploit the good citizens.  The (current) underlying protocols (TCP/IP and HTTP) provide little in the way of protection but offer many attack vectors.  In the end, it&#8217;s up to each site to largely protect itself.</p>
<p>It&#8217;s not easy, even when you&#8217;re aware of the typical vulnerabilities and diligent about securing against them.  Recently I was involved in a project in which an attack vector was accidentally left wide open through a one line oversight in a Grails application.  Grails has excellent built-in protections against attach vectors such as XSS (Cross-Site Scripting) and SQL injection- assuming you actually take advantage of them.  In this case, our team had enabled XSS protection on pages via the &#8220;render as HTML&#8221; global configuration- this setting forces all variables written to the HTML page via GSP to be encoded as HTML.  Unfortunately, we were also making heavy use of taglibs (which are not affected by the global setting), and in one taglib we failed to manually encodeAsHtml() a single parameter which was subsequently exploited when the site was penetration tested.</p>
<p>One hole.  Busted.</p>
<p>Moral of the story:</p>
<p>- Be very familiar with ALL common (and hopefully some of the uncommon) web vulnerabilities.  A good list can be found here:  <a href="http://www.owasp.org/index.php/Top_10_2007" target="_blank">http://www.owasp.org/index.php/Top_10_2007</a>.</p>
<p>- Leverage best practices in software development: code reviews, TDD, vulnerability testing, etc.</p>
<p>- Think like a hacker: try to crack your own site.</p>
<p>- If you&#8217;re developing a site with critical financial or privacy data, spend the money to have high quality independant vulnerability tests performed.</p>
<p>I&#8217;ll be adding more security best practices and lessons learned over the coming months.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/11/19/protecting-against-attack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test Driven Development</title>
		<link>http://lumenovis.com/2010/10/14/test-driven-development/</link>
		<comments>http://lumenovis.com/2010/10/14/test-driven-development/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 21:10:48 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[sdlc]]></category>
		<category><![CDATA[software testing]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=230</guid>
		<description><![CDATA[Test driven development to the rescue!]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently working on a large (multi-quarter) project for a large telecommunications client to produce a very stable and high-performing communications middleware component.  Throughout the project I&#8217;ve been a big advocate of test driven development (TDD), and as we approach the end of the project our decision to adopt TDD practices is paying off on a daily basis.  I&#8217;ve already lost count of the number of times our automated testing has caught &#8220;oops&#8221; bugs resulting from unintended consequences of unrelated code changes and bug fixes.  I wish I would have tracked the time, but my guess is we&#8217;ve saved ourselves 3-6 man months of painful debugging vs. perhaps a total of a couple of man weeks of test case development.   A multi-month savings, even on a multi-man-year project, is no trivial thing.  As an added bonus, I&#8217;m very confident that our release 1 product will be far higher quality than it would have been without a TDD approach.</p>
<p>Test early.  Test often.  Be happy.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/10/14/test-driven-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outages in 5 minutes or less</title>
		<link>http://lumenovis.com/2010/10/04/outages-in-5-minutes-or-less/</link>
		<comments>http://lumenovis.com/2010/10/04/outages-in-5-minutes-or-less/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 22:15:55 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Outage resolution]]></category>
		<category><![CDATA[Reliability]]></category>
		<category><![CDATA[Stability]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=208</guid>
		<description><![CDATA[How to design systems for rapid outage resolution.]]></description>
			<content:encoded><![CDATA[<p>One of my primary architecture principles when designing mission-critical real-time systems is that the time from a user-affecting outage to resolution should be 5 minutes or less.  Of course we&#8217;d like there to never be a customer affecting outage, but that impossible- the best we can do (via redundancy, caching, N+1, etc.) is seriously minimize the occurrences of outages or the impact to the customer.  But at some point there will be an outage and customers will be affected, so we need to design rapid recovery into the architecture.</p>
<p>Getting to &lt;5 minutes is not a trivial task; in this time, we need to:</p>
<ol>
<li>DETECT the outage</li>
<li>ALERT personnel (assuming there is no automated recovery capability in place)</li>
<li>Allow time for personnel to DIAGNOSE the cause of the issue.</li>
<li>FIX the problem through some set of corrective actions.</li>
<li>VERIFY the system works properly.</li>
</ol>
<p>Clearly there is no time to waste, so each step has to be traversed as efficiently as possible.  Here are some general best practices on how to reach this goal:</p>
<p>1)  DETECT:  the system needs to have both internal (push) and external (pull, polling) monitoring in place.  The internal checks need to be tuned to identify any condition (usually exceptions) that indicate that the system is sick or about to be sick.  The system needs a way to push this information to a monitoring console or alerting system.  Likewise, an independent, continuously polling/monitoring system should be in place that sends test events or transactions through the system every few seconds; this external monitor also needs a pay to post alerts.</p>
<p>Time: &lt; 5 seconds after the issue</p>
<p>2) ALERT: when the system detects a potentially customer affecting issue, an alert must immediately be sent to support personnel.  In the cases where there is a 24&#215;7 NOC, this should not be an issue (though some thought needs to be put into preventing alert-storms).  Where there is no NOC in place, paging, email, SMS, automated call, etc. should be explored, and additional tools will need to be developed for remote trouble resolution.</p>
<p>Time: 30-90 seconds</p>
<p>3) DIAGNOSE: this is usually the &#8220;make or break&#8221; step- the responding technician needs to have all of the relevant information &#8220;at their fingertips&#8221;, with perhaps a small amount of digging, in order to quickly identify the cause of the problem.  Logs typically don&#8217;t cut it&#8230; by the time the technician has identified the affected server, logged into the host, and reviewed (potentially millions of lines of) the logs, the five minute window will long have been history.  Don&#8217;t get me wrong- logs are great for debugging (when you have time), forensics, and as a last resort, but they should NOT be the first line of defense for time-critical outages.</p>
<p>The best tool I&#8217;ve used/experienced is a lightweight, extensible central monitoring console.  Typically a small webapp, the console will display the status of all running servers and applications using the appropriate APIs for the environment in question (for Unix/Java, SNMP + JMX is a good start).  These APIs can be used to pull information and effect changes as needed.  Besides environmental data, business data is often useful to have as well (e.g. number of &#8220;sessions&#8221; in progress, etc).  If you need to push information to console, consider using publish/subscribe (e.g. JMS).  Finally, the console can also provide access to recent logs, and should certainly provide access to recent errors.</p>
<p>Ideally, the technician should be able to look at the console and immediately (color, etc) see which host / app is in distress and then drill down into that host / app to view additional diagnostics that should quickly identify the root cause (which may, in some cases, be in a downstream component).</p>
<p>Time: 60-120 seconds</p>
<p>4)  FIX:  at this point the action(s) required should be clear; now the only trick is making sure the technicians have the tools and procedures required to take the actions.  More often than not, &#8220;fix&#8221; entails bouncing and app or a server.  In some cases it&#8217;s more complex- perhaps there&#8217;s data corruption that needs to be cleaned up, for example.  Regardless, wherever possible, have scripts that can be executed safely but easily, perhaps even from the monitoring console.  This increases speed and removes opportunities for mistakes.</p>
<p>A key success factor here is &#8220;defensive&#8221; component design.  If your system is multiple component executables (e.g. app server and database), make sure that (a) the failure of any one component doesn&#8217;t cascade through the entire system, and (b) that each component will automatically &#8220;reconnect&#8221; to the failed component once it&#8217;s fixed.  The last thing you want to do is have to shut down the entire system and execute a slow sequential startup just because a single component failed.</p>
<p>Time: 60-90 seconds</p>
<p>5) VERIFY: once the fix has been applied, verify the system now works as expected and that customers are not being impacted; if there is still a problem, go back to #3.</p>
<p>The list above is admittedly high-level- each system has it&#8217;s own challenges and complexities that need to be factored in.  There are also many commercial and open-source third party components that either should or must be taken into account.  But regardless of the final toolset the five above steps should provide a framework and acid-test for the integrated design.</p>
<p>A final note: effective outage resolution capabilities, like most RASS (Reliability Availability, Scalability and Security) elements, fall into the &#8220;don&#8217;t try this at home&#8221; category&#8230; there is no substitute for hard-won battle scars earned from developing and operating similar systems.  Do what you can to get someone like that on your team, at the very least in a coaching role.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/10/04/outages-in-5-minutes-or-less/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C + C = A</title>
		<link>http://lumenovis.com/2010/07/09/c-c-a/</link>
		<comments>http://lumenovis.com/2010/07/09/c-c-a/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 22:22:33 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[talent]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=177</guid>
		<description><![CDATA[It&#8217;s said that one definition of insanity is doing the same thing over and over but expecting different results.  By that definition most of us are probably a little insane, and most of the businesses I&#8217;ve worked with even more so.  I&#8217;m going to spend some time over the next few postings discussing some of [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s said that one definition of insanity is doing the same thing over and over but expecting different results.  By that definition most of us are probably a little insane, and most of the businesses I&#8217;ve worked with even more so.  I&#8217;m going to spend some time over the next few postings discussing some of these tried and true, repeatable methods for underperforming or failing.  The first installment:  C + C = A.</p>
<p>If you&#8217;ve been in the technology field for any length of time, you witnessed some variation of this logic:</p>
<ol>
<li>The company has a budget X for a certain project/product.</li>
<li>We need as many people as we can get for that budget.</li>
<li>Let&#8217;s avoid top talent and instead target the market average (or below) to get as many people as possible.</li>
<li>Let&#8217;s apply the latest hot methodology to produce a great product (a topic for another day).</li>
</ol>
<p>In other words, I&#8217;m going to create a team of C players but expect A results.  C + C = A.</p>
<p>The major breakdown here is, of course, #2: the assumption that quantity begets productivity.  While that is true in some cases (you can&#8217;t build a massive, multi-million-lines-of-code enterprise system in a reasonable timeframe with 2-3 sharp developers), it is not true when you measure across quality levels.  Ten C-players will probably not out-produce 5 A-players.  In fact, they might not even outproduce 1 A-player.  If the problem is complex, the C-players may never deliver an acceptable solution.</p>
<p>I&#8217;ve seen many variations of these cases play out in the real world.  I&#8217;ve seen a large development team shed 1/3 of it&#8217;s (bottom ranking) staff and improve productivity by 50% or more.  I&#8217;ve seen a small group of A-players produce an order of magnitude (yes, 10X) more features in a given time period than a larger group of C-players.  But most of all, I&#8217;ve seen teams of C players produce lots and lots of C results, followed by inevitable surprise and confusion at the management level.</p>
<p>So if it&#8217;s clear that, in many or most cases, net productivity improves when you go up-talent, why don&#8217;t companies do so?  In my experience, the number one reason is concerns about cost (actual or perceived).  Paying 20-40% more for an A player (vs. a C player) seems prohibitive on a person-by-person basis, but once you look at the ratio of productivity to cost at the team level, it quickly becomes apparent that going up-talent is probably a net cost savings.  If I had a budget of X, I&#8217;d much rather hire 6 A players than 10 C players, knowing full well that I&#8217;ll get a 2-3X productivity boost even with fewer bodies.</p>
<p>But management (especially CFOs and financial types) generally can&#8217;t get past the cost of the individual resources.  Large companies are often driven by the CFOs, who are by and large focussed on raising the top line and reducing the bottom line on a quarterly or annual basis; in their quest to squeeze out all costs, they get a little gassy when they see high-dollar individuals on the payroll.  In short they see top-performers as an expense item, and not as an investment in future success.  Great for the short run; not so good if you want to be competitive 3-5 years from now.</p>
<p>A more reasonable excuse is finding that talent- there are not many A players on the market, and the companies that have them keep them.  But it&#8217;s not impossible to move up-talent over time.  Companies that are brutally honest in their evaluations and ones that refuse to keep low-talent can move up-talent over time.  I believe it&#8217;s possible to bump up a full grade level within a year or two with some firm commitment.  But again, this is tough.  Companies and made of people, and people live by relationships, and relationships make it sometimes hard to do what is best for the team.  Likewise companies (and their management) like to think they&#8217;ve done a great job building a great team (like the old adage about 70% of people thinking of themselves as above average)&#8230; deep down many of these managers are resistant to going up-talent.</p>
<p>Another reason is &#8220;thrashing&#8221;, which results when C players produce a faulty, leaky system, and then massive amounts of manpower have to be thrown at the problems to keep them at bay.  In this case you are caught between a rock and hard place- you can&#8217;t shed too many bodies since you simply need numbers to spread them out over all the problems.  Once you&#8217;re at this point, good luck.  I&#8217;m sure you&#8217;ll spend many painful sleepless nights wishing you (or your predecessor) had invested in A players and avoided the problems altogether.</p>
<p>I&#8217;m running out of time for this entry, but suffice it to say that there are more reasons for the perpetuation of this insanity, and I see no evidence that it will stop (in aggregate).  That said, there are plenty of exceptions to the rule- teams that have invested in A-talent and are reaping the benefit; teams that are working hard to move up-talent; etc.  Kudos to these teams.  And if you&#8217;re on the wrong side of the insanity, just know that it&#8217;s never too late start moving up-talent.</p>
<p>By the way, there is a variation of this myth known as outsourcing, but we&#8217;ll hit that another day.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/07/09/c-c-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To be right or to be effective?</title>
		<link>http://lumenovis.com/2010/06/23/be-right-or-be-effective/</link>
		<comments>http://lumenovis.com/2010/06/23/be-right-or-be-effective/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 23:02:43 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[management]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=185</guid>
		<description><![CDATA[Thoughts on how to go from being "right" to being "effective"]]></description>
			<content:encoded><![CDATA[<p>A few years ago I was having lunch with William (not his real name).  William was a former colleague of mine at a recent startup.  William was one of the hardest chargers I&#8217;ve ever worked with; as a key leader in the quality assurance and configuration management departments, he was always available, 24&#215;7, and ran a very tight ship.  He was also a former military special forces warrior and was generally unconcerned about collateral damage as long as the mission was accomplished- in other words, he caused a lot of hard feelings.</p>
<p>William asked me to lunch to catch up and to discuss some challenges he was having in a new position; not surprisingly, his style was creating some friction.  He was perplexed because, for the most part, he was &#8220;in the right&#8221;.  The new organization needed some serious discipline and procedural house cleaning, and William was doing everything in his power to make the changes as quickly as possible.</p>
<p>William was caught in the classic trap- he was &#8220;right&#8221;, but he wasn&#8217;t being &#8220;effective.&#8221;  I see this all the time, and I&#8217;m guilty more often than I&#8217;d like to admit.  When you know you&#8217;re right, it is very seductive to take what appears to be the shortest route, which is ofter to simply announce that &#8220;this is the way it will be, because I&#8217;m right&#8221; (or some variation).</p>
<p>But the truth is that being right is not enough if you actually want to make a difference.  Sun Tzu said it well: &#8220;In war, then, <em>let your</em> great object be <em>victory</em>, not lengthy campaigns.&#8221;  You can be &#8220;right&#8221; over and over and never get out of the campaign.  Being effective requires you to expand your definition of &#8220;victory.&#8221;  Your &#8220;great object&#8221; (i.e. goal) is to bring about some change, not to achieve a state of moral righteousness.</p>
<p>So how do you go from being &#8220;right&#8221; to being &#8220;effective&#8221;.  That&#8217;s more art than science, but here&#8217;s a few guidelines I try to keep in mind:</p>
<p>-  When possible, take some time socializing the idea.  Change is scary to many people, so allow for some time.  Once a critical mass of the group believes its a good idea, then it&#8217;s a done deal.</p>
<p>-  Get buy-in from the leadership (peers or superiors).</p>
<p>-  Create a sense of ownership; make it everyone&#8217;s idea, not just yours.</p>
<p>-  Listen.  Let people voice their objections or concerns.  Address them with respect.  Use them to beter the idea.</p>
<p>-  Let others fight the battle.  If you can convince a few &#8220;thought leaders&#8221; of your idea, let them run with it.  Don&#8217;t hesitate to give them credit (or even let them take credit).</p>
<p>-  Stay focussed on the real victory conditions.  It&#8217;s easy to get bogged down in tactical conflicts, but if you stay focussed on the end-game, you&#8217;ll be in a great position to compromise or even back down in areas that are not critical to getting the idea done.  &#8221;Lose the battle but win the war&#8221; is a great tool to have in the toolbox.</p>
<p>-  Be willing to compromise and be patient.  If you can get 50% of your idea implemented without much fuss today vs. 100% with major push-back, I&#8217;d take the 50% and then go after the remainder in the next round.</p>
<p>-  Use Guerilla tactics (carefully).  It&#8217;s sometimes helpful to throw an idea on the table that is so unpleasant that your original idea looks positively great by comparison.  This works best if someone else floats the idea.</p>
<p>-  Last, but perhaps most important, lead by example.  If you can show personally or within your organization that your idea not only works but gives you and your team a competitive advantage, others will be highly motivated to get on board.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/06/23/be-right-or-be-effective/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails ROCKS!</title>
		<link>http://lumenovis.com/2010/03/24/grails-rocks/</link>
		<comments>http://lumenovis.com/2010/03/24/grails-rocks/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 04:38:20 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=170</guid>
		<description><![CDATA[Grails development.]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;ve been pretty heads down for the last year cranking out a number of enterprise Java, service provider, and iPhone projects.  It&#8217;s been a hugely productive period and I&#8217;ve both taught and learned a great deal.  One of the highlights, though, has to be diving into the Grails web application development framework.  If you&#8217;re not familiar with Grails, it&#8217;s a &#8220;convention over configuration&#8221; framework (much like Ruby on Rails) that sits on top of Spring and Hibernate and leverages Groovy to make development faster and easier.  It was a bit of a steep learning curve (probably because I refused to read any of the great books out there (e.g. Grails in Action) and instead tried to learn on the go), but now that I&#8217;m up to speed I have to say that it&#8217;s made web development fun again.  Gone are the hours and hours futzing with build configurations and XML files.  Gone are the days of writing boilerplate code to transfer data from the brower to the database and back.  With Grails, most of the tedious stuff is done &#8220;automagically&#8221; and you can focus on cranking out your app.  My unscientific estimate is that I&#8217;m producing features 3-5x faster with Grails than I can with Struts 2 or Spring MVC.  Seriously- it&#8217;s that good.</p>
<p>Here&#8217;s an example.  I&#8217;m finishing on an app for a nationwide company that decided a couple of weeks before the portal was to go live that it needed to support co-branding for all of their clients- basically, display a custom logo depending on who was logged in.  The right answer should have been &#8220;No!&#8221; since we were short on time and had limited resources available, but I had a hunch that Grails would make it easy enough to take on despite the risk.  So I branched the code (just in case), started a timer (literally) and dove into it.  I developed a &#8220;Brand&#8221; table that would store name, styles, and logos.  I developed full featured CRUD pages for admins to add, change, and delete brands.  I added the Brand section to the Admin section of the portal.  I modified the portal pages to show the brand logos when available.  And I developed a servlet (&#8220;controller&#8221; in Grails) to serve up images out of the database.  Grand total:  35 minutes and maybe 50 lines of handwritten code.  (To be fair, I should also add another 30-60 minutes for automated test development and testing.)  My guess is that this would have been a couple of days in any other framework.</p>
<p>If you&#8217;re a Java web developer do yourself a favor and have a look.  I think you won&#8217;t be disappointed.</p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2010/03/24/grails-rocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Text Message Marketing App</title>
		<link>http://lumenovis.com/2009/05/28/text-message-marketing-app/</link>
		<comments>http://lumenovis.com/2009/05/28/text-message-marketing-app/#comments</comments>
		<pubDate>Thu, 28 May 2009 22:12:33 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://lumenovis.com/?p=153</guid>
		<description><![CDATA[I recent worked with a friend on an app for his text messaging marketing product called Goomzee.  The first version of Goomzee mobile allows real estate professionals to track all of their listings, campaigns and leads from their phone, enabling immediate and effective response to inquiries.   I developed the UI and stubbed out the [...]]]></description>
			<content:encoded><![CDATA[<p>I recent worked with a friend on an app for his text messaging marketing product called Goomzee.  The first version of Goomzee mobile allows real estate professionals to track all of their listings, campaigns and leads from their phone, enabling immediate and effective response to inquiries.   I developed the UI and stubbed out the data layer for his initial demos and product trials; the app is currently being wired up to his web services.  Screenshots below.</p>
<p><a href="http://lumenovis.com/wp-content/uploads/2009/06/screenshot-20090624-143223.png"><img class="alignnone size-medium wp-image-154" title="screenshot-20090624-143223" src="http://lumenovis.com/wp-content/uploads/2009/06/screenshot-20090624-143223-200x300.png" alt="" width="200" height="300" /></a> <a href="http://lumenovis.com/wp-content/uploads/2009/06/screenshot-20090624-143228.png"><img class="alignnone size-medium wp-image-155" title="screenshot-20090624-143228" src="http://lumenovis.com/wp-content/uploads/2009/06/screenshot-20090624-143228-200x300.png" alt="" width="200" height="300" /></a> <a href="http://lumenovis.com/wp-content/uploads/2009/06/screenshot-20090624-143243.png"><img class="alignnone size-medium wp-image-156" title="screenshot-20090624-143243" src="http://lumenovis.com/wp-content/uploads/2009/06/screenshot-20090624-143243-200x300.png" alt="" width="200" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://lumenovis.com/2009/05/28/text-message-marketing-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

