<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Thought Clusters</title>
	
	<link>http://www.thoughtclusters.com</link>
	<description>Software Development and Management</description>
	<lastBuildDate>Mon, 09 Nov 2009 11:30:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<geo:lat>42.880481</geo:lat><geo:long>-71.382055</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-sa/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/thoughtclusters" type="application/rss+xml" /><feedburner:emailServiceId>thoughtclusters</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fthoughtclusters" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fthoughtclusters" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fthoughtclusters" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/thoughtclusters" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fthoughtclusters" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fthoughtclusters" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fthoughtclusters" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>A Difference Between Indian and American Programmers</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/m3uDVdOd4cE/</link>
		<comments>http://www.thoughtclusters.com/2009/11/a-difference-between-indian-and-american-programmers/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 11:30:22 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[india software]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1138</guid>
		<description><![CDATA[There are a lot of them, but I keep coming across one all the time. Here is an example (emphasis mine):
Brad Fitzpatrick, born in 1980, started to learn programming at the age of 5. In high school he went on to create a voting booth script called FreeVote, which he says earned him as much [...]]]></description>
			<content:encoded><![CDATA[<p>There are a lot of them, but I keep coming across one all the time. <a href="http://blogoscoped.com/archive/2009-11-07-n67.html">Here is an example</a> (emphasis mine):</p>
<blockquote><p>Brad Fitzpatrick, born in 1980, <strong>started to learn programming at the age of 5</strong>. In high school he went on to create a voting booth script called FreeVote, which he says earned him as much as 27 cent per click on banner ads back then (making for 25, 27 grand per month).</p></blockquote>
<p>I <em>touched</em> my first computer (<em>for playing chess</em>) at the age of 14. I <em>touched </em>my first mouse (<em>at a science fair</em>) at the age of 19. I wrote my first C program at the age of 21. I have done a lot of programming since then, but the 16-year difference is a huge gap.</p>
<p>The reason is that my family and I didn&#8217;t have the money to buy a computer, nor did the schools and under-graduate colleges I studied have them for programming purposes. So I had to wait till my graduate studies. Those institutions have the right facilities today, but back in the 1980&#8217;s and 1990&#8217;s, India was just emerging from the lost years of the <a href="http://en.wikipedia.org/wiki/Licence_Raj">License Raj</a>. The cohort I belong to share the same experience. We probably read a lot more books than a similar American demographic, but programming, not so much. (I remember reading a book on BASIC, but no computer to type it on.)</p>
<p>Time equals knowledge. A vast majority of the senior Indian programmers had their first experience with software development in college. While looking at reasons for the relative low proportion of software products coming out from India, this must be kept in mind. The Indian developers did not know enough programming to start a company or write great software during the early years of their youth, which are usually the most productive.</p>
<p>This is rapidly changing now. With the tremendous improvement in living standards over the past two decades, millions of Indian children are being raised in families that have &#8220;the&#8221; hardware! The gap in software innovation and entrepreneurship will surely decrease as these children grow up to become software engineers.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=m3uDVdOd4cE:x4GIGlZbYnc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=m3uDVdOd4cE:x4GIGlZbYnc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=m3uDVdOd4cE:x4GIGlZbYnc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=m3uDVdOd4cE:x4GIGlZbYnc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=m3uDVdOd4cE:x4GIGlZbYnc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=m3uDVdOd4cE:x4GIGlZbYnc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=m3uDVdOd4cE:x4GIGlZbYnc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/m3uDVdOd4cE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/11/a-difference-between-indian-and-american-programmers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/11/a-difference-between-indian-and-american-programmers/</feedburner:origLink></item>
		<item>
		<title>Fast Sales-Driven Growth</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/EURrO3DelPE/</link>
		<comments>http://www.thoughtclusters.com/2009/11/fast-sales-driven-growth/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 20:25:54 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[business management]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[growth]]></category>
		<category><![CDATA[sales]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1134</guid>
		<description><![CDATA[A friend shared Joel Spolsky&#8217;s new column on Inc Magazine which asks if slow growth means slow death and suggests a couple of ways to grow faster:
Step One, I think, is to pluck off our biggest competitors. We&#8217;re pretty certain that we&#8217;ve already built a great product that meets our customers&#8217; needs &#8212; but there [...]]]></description>
			<content:encoded><![CDATA[<p>A friend shared Joel Spolsky&#8217;s new column on Inc Magazine which asks <a href="http://www.inc.com/magazine/20091101/does-slow-growth-equal-slow-death.html?partner=fogcreek">if slow growth means slow death</a> and suggests a couple of ways to grow faster:</p>
<blockquote><p>Step One, I think, is to pluck off our biggest competitors. We&#8217;re pretty certain that we&#8217;ve already built a great product that meets our customers&#8217; needs &#8212; but there are still too many cases where we find out that, for some reason, someone went with the other guy. So that&#8217;s the development team&#8217;s mission for 2010: to eliminate any possible reason that customers might buy our competitors&#8217; junk, just because there is some dinky little feature that they told themselves they absolutely couldn&#8217;t live without. I don&#8217;t think this is going to be very hard, frankly. Developing great software is something I&#8217;m pretty sure we&#8217;re good at.</p>
<p>Step Two is something I&#8217;m not particularly good at. Not in the least bit. We have to build up our sales force. The bottom line is, we just don&#8217;t do enough selling. I&#8217;ve been working on the assumption that a product naturally creates demand for itself and the sales team just helps fulfill that demand. But I&#8217;ve realized that I have things backward. I&#8217;ve come to understand that a sales team drives demand. My problem is that I&#8217;ve never been able to figure out how to hire good salespeople. For a guy who wrote a book on how to hire great programmers, it&#8217;s mortifying how incompetent I&#8217;ve been at enlarging the sales team, which, right now, consists of one terrific account executive and a dog. (I&#8217;m just kidding. There&#8217;s no dog.)</p></blockquote>
<p>I will tackle the slow growth/slow death issue in a later post, but what does it mean when you want to try to rapidly accelerate the growth of your business, especially when it is sales-driven instead of marketing-driven, as in the case of FogCreek? Is it just about taking more risk, as Joel seems to think?</p>
<p>Risk-taking is a big part of higher growth, as you have to spend money on sales personnel, marketing, customer service and technical staff while you are uncertain about the returns from such investment. Sometimes, spending money within your comfort zone is not enough to make a difference, so you may have to either take on large liabilities (bank loans) or get investors who will share control of your company.</p>
<p>But there is a different story with reaching for fast growth with a sales-driven approach. Which is that everything about the structure and environment of your organization will fundamentally change. First, it will change from an engineering-driven company to a sales-driven one. This means, that no longer will engineers call the shots about the direction and delivery of the software. The sales people will do that and the engineering staff will have to follow.</p>
<p>The reason is that salespeople are expensive and they only go after large customers. Every potential customer can bring in revenue from tens of thousands to millions of dollars. Let us say that a customer is willing to pay a site license that is equal to 25% your current revenue, but wants to add three non-trivial features that is not on the development road map. You have a choice to make here. If you decide that the integrity of your application is more important, then not only will you be writing off a huge dollar amount, but you will anger the salesperson who will probably quit. Which is not what you set out to do.</p>
<p>So, you take on new customers and do further customizations and changes that take the product away from its initial vision. This is not necessarily a bad thing from a business perspective, because it may meet your business goals. But it definitely will establish a new, different pecking order in your organization. And probably some of your technical employees (especially the earliest ones) will leave the organization because their personal growth needs do not coincide with those of the organization.</p>
<p>In a perfect world, sales and engineering could co-exist happily. But in the real world, money talks and the priorities of the salesforce always come first. Once again, there is nothing wrong in being sales-driven. Higher profits can bring financial benefits and security to everyone in the company and that may be the dream of many of them. Just don&#8217;t think that the organization and work environment will stay the same once you change your focus.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=EURrO3DelPE:frjzWYp7WXw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=EURrO3DelPE:frjzWYp7WXw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=EURrO3DelPE:frjzWYp7WXw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=EURrO3DelPE:frjzWYp7WXw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=EURrO3DelPE:frjzWYp7WXw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=EURrO3DelPE:frjzWYp7WXw:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=EURrO3DelPE:frjzWYp7WXw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/EURrO3DelPE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/11/fast-sales-driven-growth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/11/fast-sales-driven-growth/</feedburner:origLink></item>
		<item>
		<title>StackExchange Experience: The OpenID Conundrum</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/2znlfuaCJAM/</link>
		<comments>http://www.thoughtclusters.com/2009/10/stackexchange-experience-the-openid-conundrum/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 23:00:41 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[stackexchange]]></category>
		<category><![CDATA[stackoverflow]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1130</guid>
		<description><![CDATA[Using the new StackExchange platform opened for beta, a few friends and I set up a new cricket question and answer site at http://cricket.kridaya.com. The site has been active for a few days now and it has been an interesting experience working with it in an admin role. I am a fan of StackOverflow, the [...]]]></description>
			<content:encoded><![CDATA[<p>Using the new StackExchange platform opened for beta, a few friends and I set up a new cricket question and answer site at <a href="http://cricket.kridaya.com">http://cricket.kridaya.com</a>. The site has been active for a few days now and it has been an interesting experience working with it in an admin role. I am a fan of StackOverflow, the programming Q&amp;A site, but operating a StackExchange site gives you a different perspective and more insight into how <em>other </em>users behave.</p>
<p>One differentiating feature on StackExchange is the use of OpenID for registration. As a technical user, I like OpenID, because I don&#8217;t have to keep remembering the password for every single site I visit. A few clicks and I am logged in. What could be easier and more convenient than that? Everyone should use OpenID, right?</p>
<p>Not so fast. Here are some lessons from our experiences with talking to users who tried to use the site.</p>
<p>First, people have no idea what OpenID is. So they are confused and skip the registration step. People would feel less lost if you tell them, &#8220;<em>Login with your Google, Yahoo! or AOL account</em>&#8221; (and whatever other sites support OpenID). It won&#8217;t hurt to leave out the word &#8220;OpenID&#8221; itself.</p>
<p>StackExchange&#8217;s statement &#8220;<em>Log in with OpenID</em>&#8221; is more technically accurate than &#8220;<em>Register with OpenID</em>&#8220;, but it baffles users because they don&#8217;t understand how to register on the site. They don&#8217;t realize that a new account is created when they login with an OpenID account.</p>
<p>The standard expectation for users visiting a website is that they want to see a Login form (User name, Password and a Submit button), a &#8220;Remember Me&#8221; checkbox,  &#8221;Forgot Password&#8221; link and a &#8220;Register&#8221; link. The last takes them to a page where they can submit their information including an email for validation purposes. There is a lot of friction, but <em>this is what users expect</em>. When they see something different, they get antsy and don&#8217;t know what to do.</p>
<p>Users have been participating on the site (answering questions) without registering on the site, despite the fact that the OpenID link is available on every answer form. StackExchange (apparently) does not provide the ability to force users to register before they can answer questions.</p>
<p>I don&#8217;t have any data for this thought, but I also wonder if users who click through for Google&#8217;s OpenID authentication get spooked and wonder if they are allowing another site access to their Google account, which is not true. In the traditional registration mechanism, there is a clean separation between one site and the other and so this issue never comes into the picture.</p>
<p>From an administration perspective, there is another problem. Users who login through OpenID and do not update their profile show up as &#8220;unknown (google)&#8221;. We don&#8217;t have their name, email address or any other information as a means to contact them in the future. Strangely, the system captures more information from the unregistered users who answer questions.</p>
<p>In conclusion, OpenID is good in theory, but may be a little premature for non-technical audiences.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=2znlfuaCJAM:xfLu_TP60OE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=2znlfuaCJAM:xfLu_TP60OE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=2znlfuaCJAM:xfLu_TP60OE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=2znlfuaCJAM:xfLu_TP60OE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=2znlfuaCJAM:xfLu_TP60OE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=2znlfuaCJAM:xfLu_TP60OE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=2znlfuaCJAM:xfLu_TP60OE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/2znlfuaCJAM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/stackexchange-experience-the-openid-conundrum/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/stackexchange-experience-the-openid-conundrum/</feedburner:origLink></item>
		<item>
		<title>Guide to Software Pricing</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/YZkGfq8lhCc/</link>
		<comments>http://www.thoughtclusters.com/2009/10/guide-to-software-pricing/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 02:43:49 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[business management]]></category>
		<category><![CDATA[software pricing]]></category>
		<category><![CDATA[software product management]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1128</guid>
		<description><![CDATA[Highly recommended &#8211; &#8220;Don&#8217;t Just Roll the Dice&#8220;, a free e-book by Neil Davidson.
An excerpt:
Although scientifically purer, it often doesn’t make sense to change a single variable at a time. Theoretically, you shouldn’t change the price of your product, your discounting strategy and the types of bundle that you sell, all at the same time. [...]]]></description>
			<content:encoded><![CDATA[<p>Highly recommended &#8211; &#8220;<a href="http://www.neildavidson.com/dontjustrollthedice.html">Don&#8217;t Just Roll the Dice</a>&#8220;, a free e-book by Neil Davidson.</p>
<p>An excerpt:</p>
<blockquote><p>Although scientifically purer, it often doesn’t make sense to change a single variable at a time. Theoretically, you shouldn’t change the price of your product, your discounting strategy and the types of bundle that you sell, all at the same time. But practically, it can be the right thing to do. It’s more useful to fix the problem than to understand why it’s broken. When a scientist goes on a blind date that doesn’t work out then, in theory, he should fix one variable at a time, and re-run the date. First, he should change the partner but go to the same film and buy the same flowers. Next, he should keep the partner the same, vary the film and keep the flowers the same, and so forth. But the pragmatist in him will, or should, change the girl, the film, the flowers, and buy some new clothes and shave too. If it works, he might not understand why, but at least he’ll have a girlfriend.</p></blockquote>
<p>Complement this with some reading on basic <a href="http://en.wikipedia.org/wiki/Microeconomics">microeconomics</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=YZkGfq8lhCc:zLYVSxexvEo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=YZkGfq8lhCc:zLYVSxexvEo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=YZkGfq8lhCc:zLYVSxexvEo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=YZkGfq8lhCc:zLYVSxexvEo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=YZkGfq8lhCc:zLYVSxexvEo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=YZkGfq8lhCc:zLYVSxexvEo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=YZkGfq8lhCc:zLYVSxexvEo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/YZkGfq8lhCc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/guide-to-software-pricing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/guide-to-software-pricing/</feedburner:origLink></item>
		<item>
		<title>Code Readability</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/XTchfg9Byac/</link>
		<comments>http://www.thoughtclusters.com/2009/10/code-readability/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 23:42:36 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1126</guid>
		<description><![CDATA[Rob Conery pointed out an interesting comment on his IoC post:
In this simplified example above you switched from 3 lines of easily understandable code to something that requires code in the global.asax, another couple classes, and an interface. The end result contains an extra line or two of code, but now the whole thing is [...]]]></description>
			<content:encoded><![CDATA[<p>Rob Conery pointed out <a href="http://blog.wekeroad.com/cool-kids/200-page-manual-on-inversion-of-control-part-2/">an interesting comment on his IoC post</a>:</p>
<blockquote><p>In this simplified example above you switched from 3 lines of easily understandable code to something that requires code in the global.asax, another couple classes, and an interface. The end result contains an extra line or two of code, but now the whole thing is “reusable” and can be unit tested. I happen to agree with Joel’s quote which you openly mocked… it *is* more convoluted. It *is* harder to read and grok. And this was an overly simple example… I’m sure it gets more convoluted with large projects.</p></blockquote>
<p>I am going to ignore IoC for a minute and take this in a general context. Some junior programmers have a tendency to write lengthy code instead of splitting the code into different classes and methods. The code, in itself, is not bad. I am not talking about poor variable names, bad formatting, copy-and-paste or low level silliness. But it is structurally deficient in the sense that</p>
<ol>
<li>Each method will have many lines of code doing different things. In other words, the method has multiple responsibilities.</li>
<li>The coding is algorithmic, i.e., although they are coding in an object-oriented language, the coding is very linear in terms of execution.</li>
</ol>
<p>I used to have a different perspective about people who did this kind of coding, but over time, I have concluded that this has got to do with the (<em>learnable</em>) ability of programmers to deal with complex systems consisting of different building blocks.</p>
<p>Junior programmers need to see, feel and know the entire program. They feel lost and confused otherwise. This is only possible if the code is one place and it has a very linear structure. This is enough for simple programs. But more complex programs require more code.</p>
<p>Well, it happens that a tree-like structure of code is also easy to understand because it is a easy progression from a linear code structure. You start from the root (<em>the main method</em>), navigate linearly, traverse each branch (if you come upon one), re-trace your steps and keep going until you are done. If the tree structure is not deep, you don&#8217;t have to keep too many things in your head and the complexity is managed.</p>
<p>The tree-structure is achieved by moving chunks of code into different sub-routines. But here is where the problem starts. You don&#8217;t get a true tree structure because you can call different sub-routines from different parts of your program &#8211; almost like having a leaf shared by different branches. Now, this is not a problem when the methods are very simple, but when they start manipulating data, it starts getting complex again. Another problem is that in modern event-driven programming environments, there is no &#8220;root&#8221; of the program. The linearity has been broken. What you have is a graph that has many inter-connections (or dependencies). Once again, complexity rears its ugly head.</p>
<p>We have different techniques to manage this complexity. Object-oriented design (especially encapsulation), refactoring techniques and design patterns help us manage the increasing complexity of software applications. But some of the techniques seem counter-intuitive if you have never used them.</p>
<p>For example, a junior programmer can reduce some complexity in his code by isolating similar code and moving it into a method with parameters. This reduces the code and decreases the complexity. On the other hand, moving data and code into a <em>new </em>class seems to increase code. It seems to imply more code to understand and worry about.</p>
<p>But, of course, this is not true. The point is to move code into a place <em><strong>where it can be completely forgotten</strong></em>. You create the new class that can be tested on its own and then only worry about the code that interacts with it. To a large extent, we already do this by tapping into the framework classes and APIs.</p>
<p>I want to emphasize that this is a learnable skill. These are all well-documented techniques waiting for some investment of time and effort. As you learn them and use them more in your code, you will become familiar with how they work. Some of these are easier and/or more commonly used than others, so it may take a while to be an expert in them all. The point is to keep learning and keep becoming a better programmer.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=XTchfg9Byac:Ir3ChJltL_Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=XTchfg9Byac:Ir3ChJltL_Y:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=XTchfg9Byac:Ir3ChJltL_Y:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=XTchfg9Byac:Ir3ChJltL_Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=XTchfg9Byac:Ir3ChJltL_Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=XTchfg9Byac:Ir3ChJltL_Y:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=XTchfg9Byac:Ir3ChJltL_Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/XTchfg9Byac" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/code-readability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/code-readability/</feedburner:origLink></item>
		<item>
		<title>IntelliJ IDEA Community Edition is Uninspiring</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/uE-vkm1H6NE/</link>
		<comments>http://www.thoughtclusters.com/2009/10/intellij-idea-community-edition-is-uninspiring/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 01:31:48 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[intellij idea]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1124</guid>
		<description><![CDATA[A friend sent over the news that IntelliJ IDEA is going open source with a commercial option. My first reaction was that while it would be helpful to Java developers to play with it, there was a distinct possibility that IDEA is already out on its way out. I have always been an Eclipse person, [...]]]></description>
			<content:encoded><![CDATA[<p>A friend sent over the news that <a href="http://blogs.jetbrains.com/idea/2009/10/intellij-idea-open-sourced/">IntelliJ IDEA is going open source</a> with a commercial option. My first reaction was that while it would be helpful to Java developers to play with it, there was a distinct possibility that IDEA is already out on its way out. I have always been an Eclipse person, so I don&#8217;t have any strong views on IDEA either way, but from what I have heard, it is a very good IDE. The point, though, is that if it was successfully competing with Eclipse, why did JetBrains decide to give it away for free?</p>
<p>I have <a href="http://www.thoughtclusters.com/2009/07/free-is-for-users-not-publishers/">written about this before</a>:</p>
<blockquote><p>if you are a producer, how do you profit by giving away your product for free? At the moment you stop charging, you lose the revenue from product sales. So you only benefit by making more money via other means than you have lost by forgoing direct sales.</p></blockquote>
<p>JetBrains may be betting on the scenario that there will be a greater adoption of the free product over Eclipse, which, in turn, drives the sales of the commercial product upwards. This may have been more likely if only the Community Edition had come <a href="http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html?utm_source=IDEA_BLOG&amp;utm_media=Anouncement&amp;utm_campaign=IDEA9_CE">without many features disabled</a>.</p>
<p>It gets mind-boggling as you go down the comparison list. Almost all the features that would entice someone to ditch Eclipse for IDEA have been removed. Remember people, the biggest problem in Eclipse is not the editor, it is the senseless ability  to configure anything and everything that makes it so difficult to do something simple. So why in the world would you remove (from IDEA) debugging, language support for HTML and environment support for Spring and Hibernate, not to mention any application server? (<em>The blog post mentions debugging, but the feature list has it as missing.</em>)</p>
<p>It almost seems that there was an internal argument inside the company with some people arguing for open source and the other side worrying about cannibalization of sales. Finally, they struck a compromise by releasing a barebones version as open source, which doesn&#8217;t help either side of the argument.</p>
<p>The other possibility for JetBrains is that IDEA will attract developers working on Eclipse. Once again, with many important features removed, why should anyone bother? Re-invent the wheels that both Eclipse and IDEA (in the proprietary version) have already invented? I just cannot see it.</p>
<p>Cedric has <a href="http://beust.com/weblog/archives/000520.html">similar thoughts</a>:</p>
<blockquote><p>I still see the move from commercial to open source as a sign that the business is struggling. A lot of companies have gone down that path in the past and all of them have tried to make it pass as a selfless action meant to help the community, but the truth is that they were just having a harder time selling their software, so making it open source is usually a last ditch effort to regain mindshare while trying to make money somewhere else.</p>
<p>I can&#8217;t think of a single example where a struggling commercial software suddenly started regaining market share when they went open source. Can you? [...]</p>
<p>Whatever side of the fence you stand on, one thing is clear about this move: it means less revenue for JetBrains for the foreseeable future. And what this means is that they will have less means to compete against Eclipse and less power to add features to either of the editions (the Community one or the Ultimate one).</p>
<p>And this is where a lot of companies make a fatal mistake: they think that making their software open source will automatically generate a ground swell of patches and additions from the community that will float them back to the top.</p>
<p>And in my experience, this never happens.</p></blockquote>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=uE-vkm1H6NE:kOZYGrwsaIQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=uE-vkm1H6NE:kOZYGrwsaIQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=uE-vkm1H6NE:kOZYGrwsaIQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=uE-vkm1H6NE:kOZYGrwsaIQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=uE-vkm1H6NE:kOZYGrwsaIQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=uE-vkm1H6NE:kOZYGrwsaIQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=uE-vkm1H6NE:kOZYGrwsaIQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/uE-vkm1H6NE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/intellij-idea-community-edition-is-uninspiring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/intellij-idea-community-edition-is-uninspiring/</feedburner:origLink></item>
		<item>
		<title>Do Bad Programmers Know About Technical Debt?</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/n2zvthz5JMY/</link>
		<comments>http://www.thoughtclusters.com/2009/10/do-bad-programmers-know-about-technical-debt/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 11:22:35 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software quality]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1122</guid>
		<description><![CDATA[In short, no.
But why am I asking the question in the first place?
Well, much discussion in the technical blogs (such as the NOOP.NL Top 200) is centered around the idea about whether a mediocre programmer will land on a blog where somebody is talking about adopting a simpler approach to programming and then use that [...]]]></description>
			<content:encoded><![CDATA[<p>In short, no.</p>
<p>But why am I asking the question in the first place?</p>
<p>Well, much discussion in the technical blogs (such as the <a href="http://www.noop.nl/2009/09/top-200-blogs-for-developers-q3-2009.html">NOOP.NL Top 200</a>) is centered around the idea about whether a mediocre programmer will land on a blog where somebody is talking about adopting a simpler approach to programming and then use that idea to stop improving himself and continue writing bad code.</p>
<p>It is a useless subject to argue about because bad programmers do not haunt technical blogs. This is how such a person works:</p>
<ol>
<li>Come in at 9 am or whatever time you are supposed to come in.</li>
<li>Find out what task to do.</li>
<li>Is the task something that looks familiar? If so, go to Step 7.</li>
<li>Interrupt someone in the office. Do they know the answer? If so, go to Step 7.</li>
<li>Google for the answer. Is there anything there that works? If so, go to Step 7.</li>
<li>Complain to the project manager that the task cannot be done and get something that can be done.</li>
<li>Do the task.</li>
<li>Is it time to leave? If so, go to Step 11.</li>
<li>Is there any other task? If so, go to Step 3</li>
<li>Kill time until it is time to leave.</li>
<li>Leave.</li>
<li>Enjoy the rest of the day.</li>
</ol>
<p>What they don&#8217;t do is spend time visiting technical websites or blogs unless they happen to be landing on them via Google. And those Google visits are only for the purpose of finding some code that works. And issues like intellectual property rights be thrown to the winds.</p>
<p>So let us be clear about the audience when we are arguing about technical debt. We are having an argument among people who know how to write good code and how to test it properly. Some of them use a few more tools and a little more process than the rest, who are constrained either by their lack of knowledge, awareness or business situation to imitate them. No one among this crowd is writing bad code, as in copy-and-paste coding or bad variable names.</p>
<p>Therefore what we are really discussing about and what needs to be answered by people are:</p>
<ol>
<li>You are a good developer who gets things done without Process X or Tool Y.</li>
<li>How much beneficial for you would it be to use X or Y?</li>
<li>How much time, effort and money do you need to invest for using X or Y to get started in and then be proficient?</li>
<li>What is the return on investment if you use X or Y?</li>
<li>Let&#8217;s understand if X or Y makes sense in your situation, including timelines, budgets, technical environment.</li>
</ol>
<p>There are literally thousands of programming tools, techniques and processes out there, all claiming to increase productivity. So whatever the &#8220;best thing&#8221; you are promoting is, you have to justify it in these terms to the good programmers. And someone who cannot justify that is simply selling snake oil.</p>
<p>As for the other programmers, they are out there enjoying the day and definitely not dreaming in code.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=n2zvthz5JMY:fu0d6npZdzw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=n2zvthz5JMY:fu0d6npZdzw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=n2zvthz5JMY:fu0d6npZdzw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=n2zvthz5JMY:fu0d6npZdzw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=n2zvthz5JMY:fu0d6npZdzw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=n2zvthz5JMY:fu0d6npZdzw:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=n2zvthz5JMY:fu0d6npZdzw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/n2zvthz5JMY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/do-bad-programmers-know-about-technical-debt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/do-bad-programmers-know-about-technical-debt/</feedburner:origLink></item>
		<item>
		<title>Technical Debt Quadrant</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/Ohn4_1V2pOQ/</link>
		<comments>http://www.thoughtclusters.com/2009/10/technical-debt-quadrant/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 23:42:05 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[software quality]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1118</guid>
		<description><![CDATA[Martin Fowler clears up some of the confusion around the term &#8220;technical debt&#8220;:
The debt metaphor reminds us about the choices we can make with design flaws. The prudent debt to reach a release may not be worth paying down if the interest payments are sufficiently small &#8211; such as if it were in a rarely [...]]]></description>
			<content:encoded><![CDATA[<p>Martin Fowler <a href="http://martinfowler.com/bliki/TechnicalDebtQuadrant.html">clears up some of the confusion around the term &#8220;technical debt</a>&#8220;:</p>
<blockquote><p>The debt metaphor reminds us about the choices we can make with design flaws. The prudent debt to reach a release may not be worth paying down if the interest payments are sufficiently small &#8211; such as if it were in a rarely touched part of the code-base.</p>
<p>So the useful distinction isn&#8217;t between debt or non-debt, but between prudent and reckless debt. [...]</p>
<p>there [is] a difference between prudent and reckless debt, there&#8217;s also a difference between deliberate and inadvertent debt. The prudent debt example is deliberate because the team knows they are taking on a debt, and thus puts some thought as to whether the payoff for an earlier release is greater than the costs of paying it off. A team ignorant of design practices is taking on its reckless debt without even realizing how much hock it&#8217;s getting into.</p></blockquote>
<p>It seems that Martin is suggesting that the best debt you should have is the prudent-inadvertent debt, where you only understand the technical debt after working with the application. It is not a case of recklessness where you decided to ignore design, or be content in your ignorance. Or a case where you weighed all the pros and cons and then decided for the quick-and-dirty approach. The prudent-inadvertent debt is something that happened despite your best intentions and efforts.</p>
<p>The way to explain this is that there are potentially different ways to design an application. For example, if you take the <a href="http://sourcemaking.com/creational_patterns">creational design patterns</a>, you may have to choose between competing patterns. You may start using a Factory pattern, but then need to change that for something more flexible. Or you start out with a relational database design and then later find you have to denormalize or use a NoSQL database because the application became too successful. It is hard to predict the changes in requirements and sometimes, you have to make the decision using present day considerations.</p>
<p>There are always gray areas in those quadrants. Assume that you are building an online application. It is impossible to know ahead of time whether you will get 100 visitors per day or 10,000 or a million. You could choose to target a million, but that could be over-engineering the application. Maybe 1,000 seems a happy medium or maybe you are making a terrible mistake of under-estimating traffic. Making design decisions in these cases can seem reckless or prudent after the fact.</p>
<p>Perhaps the real mistake is to think of design as an independent process. Much is tied to business decisions and forecasts. And where your technical debt falls is determined by those business factors.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=Ohn4_1V2pOQ:VL0kSAhySxg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=Ohn4_1V2pOQ:VL0kSAhySxg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=Ohn4_1V2pOQ:VL0kSAhySxg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=Ohn4_1V2pOQ:VL0kSAhySxg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=Ohn4_1V2pOQ:VL0kSAhySxg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=Ohn4_1V2pOQ:VL0kSAhySxg:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=Ohn4_1V2pOQ:VL0kSAhySxg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/Ohn4_1V2pOQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/technical-debt-quadrant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/technical-debt-quadrant/</feedburner:origLink></item>
		<item>
		<title>Dealing with Growing Software Complexity</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/mQHgpQbzIkI/</link>
		<comments>http://www.thoughtclusters.com/2009/10/dealing-with-growing-software-complexity/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 00:31:50 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[complexity]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1115</guid>
		<description><![CDATA[Ted Neward had a post wondering why we don&#8217;t see more small-scale applications being built with tools as it used to be in the past with FoxPro.
[...] many people I care about [...] made a healthy living off of building &#8220;line of business&#8221; applications in FoxPro, which Microsoft has now officially shut down. For those [...]]]></description>
			<content:encoded><![CDATA[<p>Ted Neward had a post wondering <a href="http://blogs.tedneward.com/2009/10/12/quotAgile+Is+Treating+The+Symptoms+Not+The+Diseasequot.aspx">why we don&#8217;t see more small-scale applications</a> being built with tools as it used to be in the past with FoxPro.</p>
<blockquote><p>[...] many people I care about [...] made a healthy living off of building &#8220;line of business&#8221; applications in FoxPro, which Microsoft has now officially shut down. For those who did Office applications, Visual Basic for Applications has now been officially deprecated in favor of VSTO (Visual Studio Tools for Office), a set of libraries that are available for use by any .NET application language, and of course classic Visual Basic itself has been &#8220;brought into the fold&#8221; by making it a fully-fledged object-oriented language complete with XML literals and LINQ query capabilities.</p>
<p>Which means, if somebody working for a small school district in western Pennsylvania wants to build a simple application for tracking students&#8217; attendance (rather than tracking it on paper anymore), what do they do?</p></blockquote>
<p>I am in two minds about this. In agreement with Ted, it would be nice to crank out quick business applications using simple tools. In fact, many applications that are built using .NET or Java could be automated using Excel or Access, not to say even a Word document that is put in a shared folder! It is one of the characteristics of human beings that they will spend more money than they need for things that they could have lived without.</p>
<p>The problem, unfortunately, is that people also display the following characteristics:</p>
<ul>
<li>They get new ideas, i.e., when they see what software can do, they want it to do more.</li>
<li>They change their mind about how things should work.</li>
<li>They are not organized: they need the software to protect them from their own mistakes or provide them more information to help them out.</li>
<li>They don&#8217;t understand the millions of man hours that have gone into fine-tuning the functionality in sophisticated off-the-shelf products and demand that in their own applications.</li>
</ul>
<p>This is all apart from external business reasons for application changes. So there is no &#8220;simple&#8221; application because the moment it is built, people want to change it.</p>
<p>For the developer, there are 2 choices: Walk away after building it, or continue to make changes for the customer. But even in the first chance, there may be a warranty/guarantee period where the developer continues to be involved with the product. And these changes become more and more difficult with the tools that we had in the past.</p>
<p>There are many dimensions where the &#8220;simple&#8221; tools of the past made it more difficult. Consider deployment &#8211; it is infinitely easier to manage deployment on one web server than worry about many different Windows (or DOS!) machines. Consider simplicity &#8211; plain JavaScript versus JQuery. Consider separation of concerns in different architectural layers instead of code lying in the different layers, including the &#8220;business&#8221; layer and triggers.</p>
<p>There are many more tools today to learn, but they make it simpler, not harder, to code. Ted has a point that the standalone developer has to go through several weeks of learning. But if we are talking about college students, those 6 weeks is spread across a few years of study &#8211; not a big deal. But even if it is a person making a new career move into programming, there has to be some investment in educating oneself. Otherwise the programmer will end up fielding more and more support calls instead of moving from one project to another.</p>
<p>Also,  it is possible to build smaller applications using a limited set of present-day technologies. If you look at the 5-week list that Ted put up, it is plausible that a good programmer can write a small application without using or knowing much of them. For example, Joel Spolsky and Co. probably don&#8217;t use many of the tools in the .NET space or at least they hadn&#8217;t been using them during the <a href="http://www.joelonsoftware.com/items/2006/09/01b.html">Wasabi Era</a>.</p>
<p>Finally, I don&#8217;t see it necessarily as a disaster that people have to <a href="http://haacked.com/archive/2009/10/13/software-externalities.aspx">rewrite software</a> once in a while. Sometimes, a business can only afford to spend so much money building an application. If the business grows, maybe they will throw out what they have to and get something better. Just as they would buy a larger conference table or bigger coffee maker after throwing what they have into the dumpster. Sometimes, the smaller investment helps them get to the next level, where they have to spend more money.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=mQHgpQbzIkI:6ilxP8uN6KU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=mQHgpQbzIkI:6ilxP8uN6KU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=mQHgpQbzIkI:6ilxP8uN6KU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=mQHgpQbzIkI:6ilxP8uN6KU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=mQHgpQbzIkI:6ilxP8uN6KU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=mQHgpQbzIkI:6ilxP8uN6KU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=mQHgpQbzIkI:6ilxP8uN6KU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/mQHgpQbzIkI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/dealing-with-growing-software-complexity/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/dealing-with-growing-software-complexity/</feedburner:origLink></item>
		<item>
		<title>Show, Don’t Tell</title>
		<link>http://feedproxy.google.com/~r/thoughtclusters/~3/nWQYH-7zQ6I/</link>
		<comments>http://www.thoughtclusters.com/2009/10/show-dont-tell/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 02:48:11 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[unit tests]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1113</guid>
		<description><![CDATA[The title comes from the field of literature and art where writers (and movie directors) are rebuked for using narration (&#8221;he was sad&#8221;) instead of using actions and thoughts of a character to illustrate a situation.
Much of the recent debate over unit tests and Inversion of Control has been the meta discussion: &#8220;Unit tests are [...]]]></description>
			<content:encoded><![CDATA[<p>The title <a href="http://en.wikipedia.org/wiki/Show-not-tell">comes from the field of literature</a> and art where writers (and movie directors) are rebuked for using narration (&#8221;he was sad&#8221;) instead of using actions and thoughts of a character to illustrate a situation.</p>
<p>Much of the recent debate over unit tests and Inversion of Control has been the meta discussion: &#8220;Unit tests are hard&#8221; versus &#8220;No, they are not&#8221; and so on. Which is why Rob Conery&#8217;s <a href="http://blog.wekeroad.com/smackdown/200-page-manual-on-inversion-of-control-plus-or-minus-199/">post on IoC</a> and its <a href="http://blog.wekeroad.com/cool-kids/using-dependency-injection-and-mocking-for-testability/">sequel</a> are worth reading. Well, at least for the .NET audience. Honorable mention also goes to Justin Etheredge for a similar (but less detailed) <a href="http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy-Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-is-Developers-Who-Pretend-To-Move-Forward.aspx">article</a>.</p>
<p>I would note a few points. First is that not all IDEs and IoC containers are created equal. Those who are working outside the .NET space and are not using commercial products can sometimes find the going tough. Maybe this is just my experience with open source tools, but it does take a non-trivial amount of time to set up your environment properly and then work with it easily.</p>
<p>This should not deter someone who wants to get it done. But if someone is exploring how it is working, there is a barrier for such beginners and can sour them on the experience. My advice to the open source community is to come up with installation packages that can make it easy for such programmers to get started with these tools easily. Greater usability will mean proliferation of best practices in the general programming community.</p>
<p>Second, there is a virtuous cycle in place with these programming practices. Someone using TDD has a greater chance of using IoC. And that same person is more likely to learn and use design patterns where applicable. So you perhaps only have to give a small push to a programmer to get them rolling on the way to adopt these best practices. Start them with unit tests and soon they will be on to bigger things.</p>
<p>Finally, while we have good tools, there is still scope for improvement. A common complaint about TDD are tests that achieve greater coverage, but are either meaningless or boiler-plate stuff. There can be more intelligent unit testing tools that generate generic tests, allow the programmer to override them where necessary and spend more time on writing tests for more complex code. We are getting there, especially in the .NET space, but more of that would be better.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=nWQYH-7zQ6I:5EX8oPZSesA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=nWQYH-7zQ6I:5EX8oPZSesA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=nWQYH-7zQ6I:5EX8oPZSesA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=nWQYH-7zQ6I:5EX8oPZSesA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=nWQYH-7zQ6I:5EX8oPZSesA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?i=nWQYH-7zQ6I:5EX8oPZSesA:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thoughtclusters?a=nWQYH-7zQ6I:5EX8oPZSesA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thoughtclusters?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/thoughtclusters/~4/nWQYH-7zQ6I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/10/show-dont-tell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.thoughtclusters.com/2009/10/show-dont-tell/</feedburner:origLink></item>
	</channel>
</rss>
