<?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>Thought Clusters &#187; design</title>
	<atom:link href="http://www.thoughtclusters.com/tag/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thoughtclusters.com</link>
	<description>Software Development &#38; Management</description>
	<lastBuildDate>Tue, 10 Aug 2010 03:27:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Do The Basic Research</title>
		<link>http://www.thoughtclusters.com/2010/01/do-the-basic-research/</link>
		<comments>http://www.thoughtclusters.com/2010/01/do-the-basic-research/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 23:48:35 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[normalization]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1204</guid>
		<description><![CDATA[I fail to comprehend how someone can write this (emphasis mine): Overdesign is also very common with databases. People get hung up on rules like &#8220;third normal form&#8221;. Sometimes when you over-normalize a database is [sic] makes it impossible to &#8230; <a href="http://www.thoughtclusters.com/2010/01/do-the-basic-research/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I fail to comprehend how <a href="http://www.codecapers.com/post/Software-Development-Dos-and-Donts.aspx">someone can write this</a> (emphasis mine):</p>
<blockquote><p>Overdesign is also very common with databases. <strong>People get hung up on rules like &#8220;third normal form&#8221;.</strong> Sometimes when you over-normalize a database is [<em>sic</em>] makes it impossible to query the data later on. If your application is going to require reports, sometimes its better to design the database with the reports in mind. In other words, let the reports dictate how the data is stored.</p></blockquote>
<p>This kind of advice is insane, ridiculous stuff. Take a minute and read what the <a href="http://en.wikipedia.org/wiki/Third_normal_form">third normal form</a> means. Not following the third normal form means essentially having duplicate data in different places in your database creating a serious nightmare in maintaining data integrity. What you gain in reporting, you will lose when you start writing code to ensure that data is consistent everywhere.</p>
<p>Normalizing a database does not make it &#8220;impossible&#8221; to query data. If you have many tables because of normalization, work is harder because you need multiple joins to do the trick. But if you know elementary SQL, you can get it done easily. On the other hand, if you haven&#8217;t normalized properly, you have very silly problems. For example, in the Wikipedia example, to find out how many players were born on the 1st of January, you have to write code that does not count the birthdays of multiple players twice. In a normalized database, it is an extremely simple query.</p>
<p>It is ironic that the author talks about &#8220;overdesign&#8221; while falling victim to premature optimization. First, understand what normalization is supposed to do and how it helps you. Learn SQL or use tools that can help you get your data out easily. Profile your application and find ways to improve performance. And only if everything fails, then go for denormalization. And that too, only after understanding its downsides and how to prevent them.</p>
<p>Read my <a href="http://www.thoughtclusters.com/2009/03/understand-normalization-before-denormalizing/">previous article</a> on the same subject.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2010/01/do-the-basic-research/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Delete Confirmation Functionality</title>
		<link>http://www.thoughtclusters.com/2010/01/delete-confirmation-functionality/</link>
		<comments>http://www.thoughtclusters.com/2010/01/delete-confirmation-functionality/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 23:22:00 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[user experience]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[user interface]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1193</guid>
		<description><![CDATA[Phil Haack writes about the lack of confirmation dialogs when deleting an item in the Netflix queue. I have noticed something similar on the Amazon wish lists. It avoids an unnecessary click, but at the same time, allows you to &#8230; <a href="http://www.thoughtclusters.com/2010/01/delete-confirmation-functionality/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Phil Haack writes about the <a href="http://haacked.com/archive/2010/01/01/jquery-undoable-plugin.aspx">lack of confirmation dialogs</a> when deleting an item in the Netflix queue.</p>
<p><a href="http://www.thoughtclusters.com/wp-content/uploads/2010/01/netflix-queue-deleted_2.png"><img class="size-full wp-image-1194 alignnone" style="border: 1px solid black;" title="netflix-queue-deleted_2" src="http://www.thoughtclusters.com/wp-content/uploads/2010/01/netflix-queue-deleted_2.png" alt="" width="451" height="58" /></a></p>
<p>I have noticed something similar on the Amazon wish lists. It avoids an unnecessary click, but at the same time, allows you to quickly undo the action if you had accidentally clicked the first time.</p>
<p>This reminds me of one of my pet peeves: people who complain about the Delete confirmation dialog box for files. Generally, the person who makes this complaint &#8220;cannot imagine&#8221; how stupid the operating system architects and developers are there. <em>The user wants to delete something. You have a Recycle Bin. Why doesn&#8217;t the operating system just get out of the way? And who reads the dialog box anyway?</em> One complainer suggested that this was just a way for the developer to shift responsibility onto the user. Since the user clicked Yes, the programmer is no longer responsible if the user accidentally made a mistake. And the implication is that the programmer is lazier and needs to own the responsibility. Or something of the sort.</p>
<p>Obviously, I have no idea what the intention of the programmers were. But let&#8217;s assume that there was no confirmation dialog box and the second you clicked Delete, the file is deleted. That is great if you meant to hit the Delete key. But what if you had meant to hit the &#8220;End&#8221; key (<em>to navigate to the end of a list of files</em>) and your stubby finger pressed down both the Delete and End key. What would probably happen is that the currently selected file gets deleted, you navigate to the end of the file list and you don&#8217;t realize that your file has just been zapped.</p>
<p>But what about the Trash can, you say? The problem is that if you don&#8217;t know the file has been deleted, you may not bother to check its contents before emptying it, especially if you had been deleting other files. You may not even realize the mistake until days or weeks have passed and then even a disk recovery service may not be able to help you.</p>
<p>I elaborate on this seemingly minor issue because although user interface issues are more complex than they seem at first glance, because they don&#8217;t seem so complex, everyone has an opinion. Even those who have no clue about user interaction or the design choices that made a choice necessary, even if it was not the most optimal. This was best illustrated by a recent comic &#8220;<a href="http://theoatmeal.com/comics/design_hell">How a Web Design Goes Straight to Hell</a>&#8221; by Oatmeal Comics. As the author notes,</p>
<blockquote><p>I actually had a client include their mother in the design process so that she could provide feedback and criticism. [...] You are no longer a web designer. You are now a mouse cursor inside a graphics program which the client can control by speaking, emailing and instant messaging.</p></blockquote>
<p>It is a tough world out there for user interface and user interaction designers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2010/01/delete-confirmation-functionality/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Bigger Complexity Lies Outside Technology</title>
		<link>http://www.thoughtclusters.com/2009/11/the-bigger-complexity-lies-outside-technology/</link>
		<comments>http://www.thoughtclusters.com/2009/11/the-bigger-complexity-lies-outside-technology/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 01:56:14 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[project management]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1155</guid>
		<description><![CDATA[From the Domain-Driven Design Site: [A] great deal of effort has gone into the design of networks, databases, and other technical dimension of software. Books have been written about how to solve these problems. Developers have cultivated their skills. Yet &#8230; <a href="http://www.thoughtclusters.com/2009/11/the-bigger-complexity-lies-outside-technology/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>From the <a href="http://domaindrivendesign.org/resources/what_is_ddd">Domain-Driven Design Site</a>:</p>
<blockquote><p>[A] great deal of effort has gone into the design of networks, databases, and other technical dimension of software. Books have been written about how to solve these problems. Developers have cultivated their skills.</p>
<p>Yet the most significant complexity of many applications is not technical. It is in the domain itself, the activity or business of the user. When this domain complexity is not dealt with in the design, it won’t matter that the infrastructural technology is well-conceived. A successful design must systematically deal with this central aspect of the software.</p></blockquote>
<p>Those of us with a software background have a tendency to get mired in the technical details of implementation. All of those discussions around the duct-tape programmers and unit tests and inversion of control. In some ways, it is a good debate to have. But they are just tools to do the actual work, which is to provide solutions to real-world problems.</p>
<p>And in the real world, there is enormous complexity. If you take a business application, there are so many rules and constraints demanded by various departments in the organization. Ignore software for a moment and think of any organization you have worked in. Remember the employee manual? That is just the start, isn&#8217;t it? There are so many other de-facto rules for inter-personal or inter-group coordination because of organizational history, etiquette, bureaucracy, etc. </p>
<p>Then there are outside rules by government and standards bodies, to name a couple. The sheer volume of these rules makes it very difficult for any one person to truly understand them all, let alone the inconsistencies and relationships between them. To make matters more complicated, these rules are changing always. Not everything all at once. But one rule here, one standard there &#8211; this month, that month. And your requirements keep shifting ground. There is never a fixed target.</p>
<p>That is the real reason why building software is complex. And it is not going to be solved simply by having a better tool or process which only help if you have somehow managed the complexity of the problem. Sometimes, the real-world complexity is, in fact, too difficult to manage. And the best you can do is take a small piece of the problem and try to solve it. Or maybe you can influence the real world to get rid of a business need like, say, end some silly bureaucratic process, and avoid the need to build a complex piece of software.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/11/the-bigger-complexity-lies-outside-technology/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Software Analysis Paralysis</title>
		<link>http://www.thoughtclusters.com/2009/09/software-analysis-paralysis/</link>
		<comments>http://www.thoughtclusters.com/2009/09/software-analysis-paralysis/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 23:22:16 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.thoughtclusters.com/?p=1091</guid>
		<description><![CDATA[Programmers and managers are obsessed with finding the best way to solve a particular challenge. This is a good thing because that is what quality is all about. Sometimes, though, it can be taken to extremes and the project gets &#8230; <a href="http://www.thoughtclusters.com/2009/09/software-analysis-paralysis/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Programmers and managers are obsessed with finding the best way to solve a particular challenge. This is a good thing because that is what quality is all about. Sometimes, though, it can be taken to extremes and the project gets stuck in discussions of minutiae.</p>
<p>I was reminded about this when I read about the <a href="http://chandlerproject.org/">Chandler project</a> in <a href="http://www.wordyard.com/">Scott Rosenberg&#8217;s</a> &#8220;<a href="http://www.amazon.com/gp/product/1400082471?ie=UTF8&amp;tag=krishkumarhome&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1400082471">Dreaming in Code</a>&#8220;. Much of the book is about the innumerable discussions that the team members had about requirements and design which lead to the project being at standstill for significant periods of time. Also how they kept second-guessing themselves and changing decisions in mid-stream.</p>
<p>This is not unique to Project Chandler. Projects go through this phase where the programmers need to understand their end goals and how they plan to get there. The question is how much time do you plan to spend on it and how soon you can make decisions to get on with the construction phase? Where is the point at which you have diminishing returns from further analysis?</p>
<p>I wrote a post sometime back about the <a href="http://www.thoughtclusters.com/2007/08/hard-coding-and-soft-coding/">pitfalls of soft coding</a>, which is writing an application in such a way that the user can configure its features ad infinitum. Soft coding exists, in part, because the team could not make a decision about what the user wants. Instead, the project team kicks the decision to the user&#8217;s court.</p>
<p>You can also see this in design, where there is a lot of hand-wringing about writing loosely coupled code. The idea is that you should be able to remove any class or library at any time, plug in a replacement and just have to change one line in a configuration file without compiling. So much engineering effort goes into writing such maintainable code, when in reality, most of the code will never be changed again in the lifetime of the product. And most of such decoupling is quite unnecessary because it could easily be substituted by someone taking two minutes to change the code.</p>
<p>Now, you may think my previous paragraph is stupid. How dare I promote tightly coupled software? But there lies the problem. Many programmers have been bitten by bad code written by bad developers that they have gone into over-engineering mode. Instead of having to change code, let&#8217;s make it so that the users can dynamically change the behavior of the software. Instead of having to recompile code, let&#8217;s make it so that some administrator can change an XML file.</p>
<p>Sometimes, I feel that programmers are stuck creating <em>compilers</em> when they should be creating <em>applications</em>. Compiler, as in, give users the ability to specify in minute detail how the application should behave at run-time and allow them to change their minds whenever they wish. Whatever else an application may do, you can guarantee that the &#8220;Settings&#8221; module of the application will grow and grow, as programmers delegate decisions to users.</p>
<p>This tendency to favor configuration over convention is perhaps due to a fear of being wrong. It is less risky to allow users to make the choice than find out what the more intuitive way of doing something is and implement that. So keep on building indirection upon indirection.</p>
<p>We need to break out of this cycle. Keep the application as simple as possible. Follow best practices, but don&#8217;t beat them to death. Start coding sooner. Build prototypes to validate your requirements. Build pilots to validate your design approach. Channel user feedback into refactoring the application. But just don&#8217;t sit there re-examining your decisions and trying to come up with the perfect design.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thoughtclusters.com/2009/09/software-analysis-paralysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
