<?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>Tech 4D &#187; frank</title>
	<atom:link href="http://www.tech4d.com/blog/author/frank/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tech4d.com/blog</link>
	<description>Technology, Web Society</description>
	<lastBuildDate>Mon, 08 Feb 2010 23:09:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Apple for Governor</title>
		<link>http://www.tech4d.com/blog/2010/02/07/apple-for-governor/</link>
		<comments>http://www.tech4d.com/blog/2010/02/07/apple-for-governor/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 12:32:55 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[web society]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=148</guid>
		<description><![CDATA[On January 20, the U.S. Supreme Court overturned a law that banned  political spending by corporations in candidate elections.  As Justice  Stevens said, this decision makes  &#8220;corporate  speech the same as that of human beings&#8221;.   I think it is only a  matter of time before corporations begin to assert their [...]]]></description>
			<content:encoded><![CDATA[<p>On January 20, the U.S. Supreme Court overturned a law that banned  political spending by corporations in candidate elections.  As Justice  Stevens said, this decision makes  <a href="http://www.nytimes.com/2010/01/22/us/politics/22scotus.html">&#8220;corporate  speech the same as that of human beings&#8221;</a>.   I think it is only a  matter of time before corporations begin to assert their unalienable  rights as human beings and demand full citizenship.  If all goes as  planned, the high court will rule favorably in the precedent setting &#8220;Apple vs the State  of California&#8221; and Apple will win the governor&#8217;s race in the state  elections.</p>
<p>When this happens we can look forward to a  new era of fiscal responsibility and visionary leadership for a state that  is sadly overwhelmed by failed ideas and big government spending.  Here are some of  the insanely great public policy innovations that we can expect from  the brilliant engineers at Apple:</p>
<ul>
<li>California is re-branded <strong> </strong><em>iCal</em>.  New logos and graphic look and feel standards are instituted.</li>
<li>Apple introduces the <em>iCar</em>, the  only vehicle to pass California&#8217;s tough new vehicle usability standards  and thus, the only car available for sale in the state.</li>
<li>A  two year contract is now required for California citizenship.</li>
<li>Apple  launches <em>iTunes Liquor Store</em>.  The Liquor Control Board mandates that  all alcoholic beverages must be purchased through iTunes.  Purchases  are licensed to a single household, but can be shared with up to five  other iTunes users.</li>
<li>A slew  of trademark violation suits are filed against companies using the name <em>California<sup>TM </sup></em>without permission.</li>
</ul>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2010%2F02%2F07%2Fapple-for-governor%2F&amp;linkname=Apple%20for%20Governor"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2010/02/07/apple-for-governor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open source choices</title>
		<link>http://www.tech4d.com/blog/2009/01/18/open-source-choices/</link>
		<comments>http://www.tech4d.com/blog/2009/01/18/open-source-choices/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 20:37:33 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=146</guid>
		<description><![CDATA[I open sourced concharto this week.  As a long time consumer of open source projects it has been exciting to actually contribute to the movement.
The project page is hosted on google code here.
Here&#8217;s a summary of what I went through to make this happen.
My Goals
1. The concharto atlas.  My main goal is to create a [...]]]></description>
			<content:encoded><![CDATA[<p>I open sourced <a href="http://www.concharto.com">concharto </a>this week.  As a long time consumer of open source projects it has been exciting to actually contribute to the movement.</p>
<p>The project page is hosted on google code <a href="http://code.google.com/p/concharto">here</a>.</p>
<p>Here&#8217;s a summary of what I went through to make this happen.</p>
<p><strong>My Goals</strong></p>
<p>1. <em>The concharto atlas</em>.  My main goal is to create a comprehensive online atlas of history and happenings founded the Wikipedia community process and enabled by modern mapping web services.  I believe contributors of &#8220;philanthropic information&#8221; generally want to know that their work is not going to enrich some venture capital backed startup so one way to instill confidence is to make the code open source.</p>
<p>2. <em>Someone else could use it</em>.   It would be gratifying to see other concharto based communities springing up.</p>
<p>3. <em>Make the code better</em>.  There are so many open source projects out there that the odds of anyone actually contributing to concharto are pretty low, but it has a few things going for it:</p>
<ul>
<li>the code is stable</li>
<li>the code is live</li>
<li>It is still an active project</li>
</ul>
<p><strong>The Process</strong></p>
<p>The process took about 1 month and involved a number of decisions:</p>
<ul>
<li>Choice of an open source hosting platform</li>
<li>Choice of a license</li>
<li>Code cleanup</li>
</ul>
<p>Each of these activities involved a lot of analysis and tradeoffs and I thought I would share my thought process.</p>
<p><strong>Open source hosting platform</strong></p>
<p>I&#8217;ve used projects that are hosted on source forge, google code, codehaus and a few others.  I really like google code&#8217;s group list and issue manager, and since good issue management is more important to me than anything else, I chose google code.</p>
<p>I currently use Jira (an awesome commercial issue manager) and I could have gotten a Jira open source deal, but google code&#8217;s simple and snappy groups, wiki and issue manager was an unbeatable combination.</p>
<p>Wikipedia&#8217;s <a href="http://en.wikipedia.org/wiki/Comparison_of_free_software_hosting_facilities">open source software hosting page</a> was an invaluable resource.</p>
<p><strong>Choice of a license</strong></p>
<p>I vacillated back and forth on this issue for about three months before I finally settled on Apache License 2.0.  Here again, Wikipedia <a href="http://en.wikipedia.org/wiki/Open_source_license">has lots of good things to say</a>.  The evolution of my decision went something like this:</p>
<p>1. Since Concharto is a web application and not a web library, I looked at respectable web applications like Drupal, Wordpress and Wikimedia.  Most of these use a Gnu Public License (GPL), which follows a <em>copyleft </em>model and imposes strict constraints on commercial use of the code.  This seemed just fine to me.</p>
<p>2. After a while I got to worrying about whether I really agree with the core principals behind the GNU license.  I looked at the Apache and MIT licenses, which follow a <em>permissive</em> model.  They seemed a little too permissive since they would allow anyone to take my code and sell it if they wanted to.  I decided that perhaps the Mozilla Public License, which is what Firefox uses, would be a little more restrictive, yet not as constraining as the GPL.</p>
<p>3. Eventually I decided that the chances of any organization actually taking my code and reselling it are pretty low and even if some company did that, I believe it would be highly beneficial for that organization to be a contributor to the project, so in the end the concharto web site would ultimately benefit.  I felt that the Mozilla license was too complicated and not that much different from the Apache 2 license.  I noticed that both Google&#8217;s Android and Apple&#8217;s WebKit are Apache 2 licensed, so that clinched it for me.</p>
<p><strong>Code cleanup</strong></p>
<p>Having privately worked on this code for several years, I had to ask myself whether I really wanted anyone to be able to see it &#8211; warts and all. As with any software project there are good and bad parts and the desire to make the code perfect before open sourcing it was a powerful influence on me.  Finally, I just changed the package naming, added the Apache Licence 2.0 license headers and let her fly.  A cool <a href="http://www.wdev91.com/?p=cpw">eclipse plugin made</a> adding the license headers really easy.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2009%2F01%2F18%2Fopen-source-choices%2F&amp;linkname=Open%20source%20choices"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2009/01/18/open-source-choices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;ll be demoing Concharto at Where 2.0</title>
		<link>http://www.tech4d.com/blog/2008/05/07/ill-be-demoing-concharto-at-where-20/</link>
		<comments>http://www.tech4d.com/blog/2008/05/07/ill-be-demoing-concharto-at-where-20/#comments</comments>
		<pubDate>Wed, 07 May 2008 11:56:28 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=142</guid>
		<description><![CDATA[I&#8217;ll be demonstrating Concharto at this year&#8217;s Where 2.0 conference in San Francisco on May 12.  I&#8217;ll use events and timelines from the map to illustrate all the important features of Concharto.
I&#8217;ll definitely show them &#8220;The Play.&#8221; As John Madden would say, &#8220;he goes left, he goes right, he hits the trombone player, Boom!&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:left" src="http://www.tech4d.com/blog/wp-content/uploads/images.jpg" alt="" title="images" width="112" height="110" class="alignleft size-full wp-image-143" />I&#8217;ll be demonstrating Concharto at this year&#8217;s Where 2.0 conference in San Francisco on May 12.  I&#8217;ll use events and timelines from the map to illustrate all the important features of Concharto.</p>
<p>I&#8217;ll definitely show them &#8220;<a href="http://www.concharto.com/search/eventsearch.htm?_tag=the%20play&#038;_maptype=1">The Play</a>.&#8221; As John Madden would say, &#8220;he goes left, he goes right, he hits the trombone player, Boom!&#8221; I bet I&#8217;ll irritate some Stanford grads but, hey, it&#8217;s just a demo.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F05%2F07%2Fill-be-demoing-concharto-at-where-20%2F&amp;linkname=I%26%238217%3Bll%20be%20demoing%20Concharto%20at%20Where%202.0"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/05/07/ill-be-demoing-concharto-at-where-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My class wiki</title>
		<link>http://www.tech4d.com/blog/2008/05/06/my-class-wiki/</link>
		<comments>http://www.tech4d.com/blog/2008/05/06/my-class-wiki/#comments</comments>
		<pubDate>Tue, 06 May 2008 15:44:43 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=137</guid>
		<description><![CDATA[I&#8217;ve been teaching a class at University of Delware, CISC474 &#8211; Advanced Web Development.  I&#8217;m using a wiki for most communications with the students.  It has worked pretty well, though something like Moodle (which my children use for their school) would be even nicer.
]]></description>
			<content:encoded><![CDATA[<p><img style="float:left" title="blue-hen" src="http://www.tech4d.com/blog/wp-content/uploads/blue-hen.jpg" alt="" width="82" height="82" />I&#8217;ve been teaching a class at University of Delware, <a href="http://cisc474.fsanmiguel.com/Wiki/">CISC474 &#8211; Advanced Web Development</a>.  I&#8217;m using a wiki for most communications with the students.  It has worked pretty well, though something like <a href="http://moodle.org/">Moodle</a> (which my children use for their school) would be even nicer.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F05%2F06%2Fmy-class-wiki%2F&amp;linkname=My%20class%20wiki"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/05/06/my-class-wiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Where do they find the time</title>
		<link>http://www.tech4d.com/blog/2008/05/01/where-do-they-find-the-time/</link>
		<comments>http://www.tech4d.com/blog/2008/05/01/where-do-they-find-the-time/#comments</comments>
		<pubDate>Thu, 01 May 2008 14:34:08 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[web society]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=136</guid>
		<description><![CDATA[Via Making Light
Here is a fascinating presentation about traditional media vs user generated content;  the &#8220;Cognitive Surplus&#8221; created by TV.  Clay Shirky answers the question that a TV producer asked him about Wikipededia &#8211; &#8220;Where do they find the time?&#8221;  Transcript is located here.

]]></description>
			<content:encoded><![CDATA[<p>Via <a href="http://nielsenhayden.com/makinglight/archives/010186.html#010186">Making Light</a></p>
<p>Here is a fascinating presentation about traditional media vs user generated content;  the &#8220;Cognitive Surplus&#8221; created by TV.  Clay Shirky answers the question that a TV producer asked him about Wikipededia &#8211; &#8220;Where do they find the time?&#8221;  Transcript is located <a href="http://www.shirky.com/herecomeseverybody/2008/04/looking-for-the-mouse.html">here</a>.</p>
<p><embed src="http://blip.tv/play/AbTSFAA" type="application/x-shockwave-flash" width="320" height="242" allowscriptaccess="always" allowfullscreen="true"></embed></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F05%2F01%2Fwhere-do-they-find-the-time%2F&amp;linkname=Where%20do%20they%20find%20the%20time"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/05/01/where-do-they-find-the-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Badly behaved robots and idempotency</title>
		<link>http://www.tech4d.com/blog/2008/04/29/badly-behaved-robots-and-idempotency/</link>
		<comments>http://www.tech4d.com/blog/2008/04/29/badly-behaved-robots-and-idempotency/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 13:01:03 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=135</guid>
		<description><![CDATA[This is a technical web development post.
The other night I was up until 1:30AM fixing a bug in concharto.com.  At 10:00pm I took a look at the latest changes log and noticed hundreds of &#8220;reverts&#8221; had happened and were continuing to happen.  All coming from the same IP address.  I panicked!  [...]]]></description>
			<content:encoded><![CDATA[<p>This is a technical web development post.</p>
<p>The other night I was up until 1:30AM fixing a bug in <a href="http://www.concharto.com/event/latestchanges.htm">concharto.com</a>.  At 10:00pm I took a look at the <a href="http://www.concharto.com/event/latestchanges.htm">latest changes log</a> and noticed hundreds of &#8220;reverts&#8221; had happened and were continuing to happen.  All coming from the same IP address.  I panicked!  I had to shut the site down temporarily while I fixed the problem and repaired the damage.</p>
<p>The problem was caused by a combination of a badly behaved robot (web spider) and a bug in the &#8220;undo revision&#8221; code.</p>
<p>1. <strong>The bug.</strong> Concharto is a geographic wiki.  All wiki&#8217;s need to make it easy to revert changes.  The changes page has a series of &#8220;undo this change&#8221; links next to each change.  It was originally implemented as a simple link with a query string that looked like this:<strong> /edit/undoevent.htm?id=188&amp;toRev=3</strong>.  The bug is that all HTTP GET requests like this one should be <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html"><strong><em>idempotent</em></strong> </a>- i.e. repeated requests (e.g. a user clicking the link over and over) should have the same effect as only one request.  For instance, a link to add something to a shopping cart is NOT idempotent and is best implemented with a POST method (and some javascript). When I coded this feature way back, I did it the lazy way.</p>
<p>2. <strong>The Robot</strong>.  All robots are supposed to follow the instructions in the <a href="http://www.concharto.com/robots.txt">robots.txt</a> at the root of your web site.  This file provides directives on how you want robots to follow links.  Our robots.txt file explicitly prohibits following links to the changes page (which contained the bug).  Unfortunately, all robots don&#8217;t follow this advice.  This particular robot found its way to the changes page and started following all of the links there, including each &#8220;undoevent.htm&#8221; link.  <em>Ugh!</em></p>
<p>I had to do three things to recover:</p>
<ul>
<li>Fix the bug.  I switched all of the links to invoke a javascript submit() method and post the results to the web controller.  This has two benefits: robots don&#8217;t usually run javascript and they don&#8217;t usually do HTTP POST.</li>
<li>Revert the changes that the robot made.  Database backups are a good thing.</li>
<li>Block the robot&#8217;s IP address.</li>
</ul>
<p>3. <strong>The Lesson</strong>.  Keep your GET methods idempotent.  It is sometimes easier (less coding) to use the query string to pass parameters but it is a bug &#8211; you will probably have to fix it later.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F04%2F29%2Fbadly-behaved-robots-and-idempotency%2F&amp;linkname=Badly%20behaved%20robots%20and%20idempotency"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/04/29/badly-behaved-robots-and-idempotency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Concharto</title>
		<link>http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/</link>
		<comments>http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 13:33:57 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/</guid>
		<description><![CDATA[Back in the late 90&#8217;s, I dreamed of building an immersive mapping application that would let people travel through time to any place in the past and see what it was like.  It was an impractical idea at the time, but things have changed recently and the result is Concharto. Last June, I alluded [...]]]></description>
			<content:encoded><![CDATA[<p>Back in the late 90&#8217;s, I dreamed of building an immersive mapping application that would let people travel through time to any place in the past and see what it was like.  It was an impractical idea at the time, but things have changed recently and the result is <a href="http://www.concharto.com">Concharto</a><a href="http://www.timespacemap.com"></a>. Last June, I <a href="http://www.tech4d.com/blog/2007/06/21/a-calculus-of-history-mass-collaboration/">alluded to the project</a> when I noted that Leo Tolstoy, author of &#8220;<em>War and Peace</em>&#8221; proposed applying the <em>scientific method</em> to history, asserting that a complete understanding of an event could be obtained by slicing that event into smaller and smaller pieces, in exactly the same way that a math student performs integral calculus.</p>
<p style="font-style: normal">While not actually creating a calculus of history, <a href="http://www.concharto.com">Concharto</a> does attempt to slice history into smaller pieces.  There are three recent technological advances that make this possible:</p>
<ol>
<li>Advanced database software and cheap server hardware have made it easy to search huge repositories of information.</li>
<li>Geographic web services have simplified the task of placing events in a spacial context.</li>
<li>Wikipedia has demonstrated the awesome power of mass collaboration.</li>
</ol>
<p>Hopefully, Concharto will one day be a comprehensive repository of thin slices of notable events from every place and time.</p>
<p>How can that happen? Concharto is a Geographic Wiki. It looks like Google Maps and works like Wikipedia. It has the all of the illustrative power Google Maps and all of the strengths and weaknesses of Wikipedia.</p>
<p>Unlike virtually all other mapping sites on the internet today, Concharto is not about <em>places</em> &#8211; it is about <em>events</em>. Unlike Wikipedia, it is about small discrete bits of information, rather than comprehensive <em>articles</em>.</p>
<p>You can read more about  it on the <a href="http://wiki.timespacemap.com/wiki/About">community wiki</a> and in the <a href="http://blog.concharto.com">Concharto blog</a>.  .</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
<iframe src='http://www.concharto.com/search/embeddedsearch.htm?_tag=inca%20empire&amp;_maptype=1&amp;_embed=true' height="330" width="450" frameborder="0" scrolling="no"></iframe> <br/><small><a href='http://www.concharto.com/search/eventsearch.htm?_tag=inca%20empire&amp;_maptype=1'>View A Larger Map</a></small></p>
<p>Expansion of the <a href="http://www.concharto.com/search/eventsearch.htm?_tag=inca%20empire&#038;_maptype=1">Inca Empire</a> of South America.</p>
<p><em>(Updated 4/29/08 to reflect our name change from Time Space Map to Concharto)</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F01%2F29%2Fintroducing-time-space-map%2F&amp;linkname=Introducing%20Concharto"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Platform Peril &#8211; A Tale of Two Platforms</title>
		<link>http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/</link>
		<comments>http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 19:08:22 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/</guid>
		<description><![CDATA[This is a follow-up to an earlier post, Platform Peril
I once worked for an ambitious company that aimed to create a new type of web service.  We ultimately succeeded, despite the tale I am about to tell.
Book the First: Reusable Code

Our company had developed some core capabilities in an obscure vertical market which showed [...]]]></description>
			<content:encoded><![CDATA[<p>This is a follow-up to an earlier post, <a href="http://www.tech4d.com/blog/2007/08/07/platform-peril/">Platform Peril</a></p>
<p>I once worked for an ambitious company that aimed to create a new type of web service.  We ultimately succeeded, despite the tale I am about to tell.</p>
<h3><span class="editsection"></span><span class="mw-headline">Book the First: Reusable Code<br />
</span></h3>
<p>Our company had developed some core capabilities in an obscure vertical market which showed some promise to investors.  My group made money by applying our special skills to mostly fixed price software development contracts.  It was decided that we should roll up all of our capabilities into a software platform of libraries and specialized data processing tools which I will call <em>Platform LG</em>.  The project goals for <em>LG </em>were:</p>
<ol>
<li>Speed development of all projects</li>
<li>License <em>LG</em> to our biggest customers for their own internal and external projects</li>
<li>Reduce operational costs by standardizing our internal support infrastructure</li>
</ol>
<p>These are the standard reasons to invest in reusable code projects.  Unfortunately, the project suffered from the standard reasons that such projects get into trouble:</p>
<ol>
<li><em>Behind schedule</em>.  Big, ambitious reusable code projects are notoriously hard to manage, especially in a dynamic environment where requirements are uncertain. Worse still, the schedule slips are very expensive, because ongoing projects are affected.  A lot of people relied on <em>LG.</em></li>
<li><em>Last year&#8217;s requirements.  LG</em> failed to meet the needs of our newest, biggest project.  The platform was slow, ran on the wrong operating system and wasn&#8217;t sufficiently customizable to support the new requirements.</li>
<li>Packaging the platform for use by our big customers exacerbated the other problems because the effort necessary to <em>productize </em>the code made it harder to respond to new requirements.</li>
</ol>
<p>Thus, the <em>LG </em>failed to meet two of its three goals. As a result, our biggest project, which I will call <em>Operation Bandwagon</em>, decided to abandon the platform, instead resurrecting some old code and creating custom capabilities tailored exactly to their own needs.</p>
<p><em><strong>Lesson 1</strong>.  Platforms are expensive and slow to adapt to new requirements.  They are best used in situations where requirements are well understood and relatively constant.</em></p>
<h3><span class="editsection"></span><span class="mw-headline">Book the Second: Operation Bandwagon</span></h3>
<p><em>Operation Bandwagon</em> focused on building an application, not a platform and so was able to create a great deal of new and innovative features very quickly with a small team.  To some people in management, it made the <em>LG </em>look bad.   This should have been no surprise however, since <em>Bandwagon </em>developers weren&#8217;t nearly as constrained as the <em>LG </em>team.</p>
<p><em><strong>Lesson 2.</strong>  It is easier and cheaper to build custom code than reusable code.   </em></p>
<h3><span class="mw-headline">Book the Third: Platform Redux</span></h3>
<p>Within a year, <em>Bandwagon </em>was a smash hit. During that time, the software development organization was split into two competing and antagonistic groups. The <em>Bandwagon </em>core code began to get the petrified feel of a platform.  Unlike the <em>LG</em> however, <em>Bandwagon</em> was originally conceived as an custom application, and then retrofitted to act like a platform &#8211; and it showed.</p>
<p>Meanwhile, <em>LG</em> had finally grown into its own as a stable and capable base on which to build applications. The company now had two competing platforms, complete with release and support organizations. We were paying through the nose for the original schism.</p>
<p><em><strong>Lesson 3.</strong>  Pay attention!  People love to build platforms, but there should be only one.</em></p>
<h3><span class="editsection"></span><span class="mw-headline">Book the Fourth: Unification<br />
</span></h3>
<p>It was left to a small bad of brave developers to reunite the two warring platforms, a process that took years to accomplish.  I wasn&#8217;t there to witness the effort, but I&#8217;ve heard stories.  Some claim that good ultimately won out over evil.  Others say that the two were synergistically merged into a new platform that was better than the individuals combined.</p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2008/01/95px-charles_dickens_-_project_gutenberg_etext_13103.jpg" style="float: left" alt="95px-charles_dickens_-_project_gutenberg_etext_13103.jpg" /></p>
<p>Dickens&#8217; <a href="http://en.wikipedia.org/wiki/A_Tale_of_Two_Cities">A Tale Of Two Cities</a> is a tragic story centered on the French Revolution.  Like its namesake, our story has a bittersweet ending.  <em>It was the best of times</em>.  We built some truly remarkable software.  But <em>it was the worst of times </em>too. If we had been more careful we could accomplished much, much more.</p>
<h3>Epilogue</h3>
<p>History seems doomed to repeat itself.  Revolutions come and go and so do tech bubbles.  Two years later, I found myself enmeshed in platform peril that was weirdly similar to <em>Bandwagon</em> vs <em>LG</em>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F01%2F07%2Fplatform-peril-a-tale-of-two-platforms%2F&amp;linkname=Platform%20Peril%20%26%238211%3B%20A%20Tale%20of%20Two%20Platforms"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Cost of Complexity</title>
		<link>http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/</link>
		<comments>http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 19:09:46 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/</guid>
		<description><![CDATA[Most software developers understand the relationship between complexity and cost; more complex = more expensive.  Unfortunately many equate code complexity with lines of code, slavishly following design patterns that reduce code counts while actually increasing complexity.
Value Engineering
For years, engineers have noted that the overall cost of a manufactured device is roughly proportional to the [...]]]></description>
			<content:encoded><![CDATA[<p>Most software developers understand the relationship between complexity and cost; more complex = more expensive.  Unfortunately many equate code complexity with lines of code, slavishly following design patterns that reduce code counts while actually increasing complexity.</p>
<p><strong>Value Engineering</strong></p>
<p>For years, engineers have noted that the overall cost of a manufactured device is roughly proportional to the  number of parts it has.  A whole discipline, known as <a href="http://en.wikipedia.org/wiki/Value_engineering">Value Engineering</a>, is dedicated to assigning a cost to each function of a product so that designers and manufacturers can can make wise choices about which functions to improve and which to throw away.  A classic value engineering excercise is to take a common item like a circuit breaker, tear it apart, and then redesign it with less pieces.  Removing one part from the design can yield dramatic cost savings and big improvements in reliability.</p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2008/01/cost-of-complexity.png" alt="cost-of-complexity.png" /></p>
<p>Figure 1 &#8211; Cost and complexity for two competing solutions</p>
<p>In Figure 1, two companies are designing competing products with similar market requirements.   The company that solves the problem with the least number of parts (Team A) is the big winner.  Note that cost often increases exponentially with the complexity of a particular solution.</p>
<p>In many respects, software engineering bears <a href="http://www.tech4d.com/blog/2007/06/28/software-engineers-are-not-engineers/">little resemblance to other engineering disciplines</a>, but in this case, there are real parallels.  Just as in circuit breakers, more parts means more $, both in initial cost and ongoing maintenance and operations.</p>
<p><strong>Virtual Parts</strong></p>
<p>The analogy is useful because code reduction techniques <strong>often increase</strong> the number of virtual &#8220;parts&#8221; while decreasing lines of code.  My favorite example is indirection. Many popular design patterns aim to reduce code duplication by introducing levels of indirection (for example, <a href="http://en.wikipedia.org/wiki/Adapter_pattern">adapter</a> or <a href="http://martinfowler.com/articles/injection.html">dependency injection</a> patterns). If you think of each indirection as a new part, it is easy to see how some designs can have less code yet more parts. I use adapters and injection all of the time, but I also acknowledge that they complicate the design, development, testing and maintenance of the code.</p>
<p>Let&#8217;s say you are adding a new feature to an existing project and there are some similarities to other parts of your code.  You must decide whether to build a new common module and refactor your existing code to use it, or ignore the existing code and build the new piece without regard to the existing stuff.  Many developers, especially dogmatic adherents to <a href="http://en.wikipedia.org/wiki/Agile_software_development">agile development</a> methodologies, would blindly choose the former approach, without regard to the costs involved.  A better strategy is to choose based on a reasoned trade off between cost and benefit.  And there are many hidden costs to certain complex design patterns:</p>
<ul>
<li><em>Clarity</em>.  Some code is just too hard to understand.  For example, xml based configuration files can make your code easy to configure and impossible to understand.</li>
<li><em>Unit Testing complexity</em>. Multiple levels of indirection require multiple levels of testing.  This usually means more support classes, including utility dao&#8217;s, mocks, etc.</li>
<li><em>Debugging time</em>.   You would think that designers would avoid any architecture that hinders efficient debugging, but many architecture decisions are made without even considering the effect on debugging and deployment.</li>
<li><em>Operational costs</em>.  If it is hard to understand  the code, then it will almost always be hard to keep running.</li>
</ul>
<p><strong>Too Many Notes</strong></p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2008/01/too-many-notes.png" style="float: left" alt="too-many-notes.png" />In the play, <a href="http://en.wikipedia.org/wiki/Amadeus">Amadeus</a>, the  Austrian King tells Wolfgang Amadeus Mozart that his opera is too complicated, it has too many notes, and he should &#8220;<em>take some away.</em>&#8221;  Mozart, who feels that his opera is perfect, asks the king which notes he would like to take away.  It is a moment full of meaning for any creative person.  Unfortunately, many creative software developers empathize too much with Mozart, favoring the ornamentation and flash of 18th century classical music.  I believe we should all take the tone deaf King&#8217;s advice and take some away.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F01%2F01%2Fthe-cost-of-complexity%2F&amp;linkname=The%20Cost%20of%20Complexity"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSS Browser compatibility note</title>
		<link>http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/</link>
		<comments>http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 15:16:19 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/</guid>
		<description><![CDATA[I haven&#8217;t written in a while because I&#8217;ve been heads down coding &#8211; not much to say that hasn&#8217;t already been said.  I&#8217;ve been in CSS hell recently, and I haven&#8217;t seen much about the following compatibility issue with IE 6.  Dreamweaver doesn&#8217;t pick up on the problem.
IE 6 doesn&#8217;t handle mixing units in [...]]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t written in a while because I&#8217;ve been heads down coding &#8211; not much to say that hasn&#8217;t already been said.  I&#8217;ve been in CSS hell recently, and I haven&#8217;t seen much about the following compatibility issue with IE 6.  Dreamweaver doesn&#8217;t pick up on the problem.</p>
<p>IE 6 doesn&#8217;t handle mixing units in CSS style sheets.  For instance,</p>
<blockquote><p> #main ul {<br />
padding: .1em  .4em .1em 18px;<br />
}</p></blockquote>
<p>Renders in a very unexpected way.  The proper method is:</p>
<blockquote><p> #main ul {<br />
padding: 6px 6px 6px 18px;<br />
}</p></blockquote>
<p>OR</p>
<blockquote><p> #main ul {<br />
padding: .1em  .4em .1em 1.4em;<br />
}</p></blockquote>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2007%2F12%2F05%2Fcss-browser-compatibility-note%2F&amp;linkname=CSS%20Browser%20compatibility%20note"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
