<?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>techfounder &#187; UI</title>
	<atom:link href="http://www.techfounder.net/category/webdev/ui/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.techfounder.net</link>
	<description>Blog about web development and Internet entrepreneurship</description>
	<lastBuildDate>Mon, 21 Jun 2010 19:41:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Distiliing Usability</title>
		<link>http://www.techfounder.net/2008/09/23/distiliing-usability/</link>
		<comments>http://www.techfounder.net/2008/09/23/distiliing-usability/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 23:46:59 +0000</pubDate>
		<dc:creator>Eran Galperin</dc:creator>
				<category><![CDATA[UI]]></category>
		<category><![CDATA[Web development]]></category>

		<guid isPermaLink="false">http://www.techfounder.net/?p=122</guid>
		<description><![CDATA[Brilliant. http://stuffthathappens.com/blog/2008/03/05/simplicity/]]></description>
			<content:encoded><![CDATA[<p>Brilliant.</p>
<p><a href="http://stuffthathappens.com/blog/2008/03/05/simplicity/">http://stuffthathappens.com/blog/2008/03/05/simplicity/</a></p>
 <img src="http://www.techfounder.net/wp-content/plugins/feed-statistics.php?view=1&post_id=122" width="1" height="1" style="display: none;" /><div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F09%2F23%2Fdistiliing-usability%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F09%2F23%2Fdistiliing-usability%2F" height="61" width="51" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.techfounder.net/2008/09/23/distiliing-usability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The lost art of user experience</title>
		<link>http://www.techfounder.net/2008/07/26/the-lost-art-of-user-experience/</link>
		<comments>http://www.techfounder.net/2008/07/26/the-lost-art-of-user-experience/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 05:16:03 +0000</pubDate>
		<dc:creator>Eran Galperin</dc:creator>
				<category><![CDATA[Lionite]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.techfounder.net/?p=55</guid>
		<description><![CDATA[User interface design is my favorite part of the development process. The problems it poses are the most interesting, and thinking up solutions is a form of creative expression. Users consume applications through the interface - one chance to either deliver a satisfying experience or fail miserably. It is a topic I have very strong [...]]]></description>
			<content:encoded><![CDATA[<p>User interface design is my favorite part of the development process. The problems it poses are the most interesting, and thinking up solutions is a form of creative expression. </p>
<p>Users consume applications through the interface - one chance to either deliver a satisfying experience or fail miserably.</p>
<p>It is a topic I have very strong and passionate opinions of, and motivated by <a href="http://jonoscript.wordpress.com/2008/07/17/these-things-i-believe/" target="_blank">this beautiful prose</a> by Jono over at Not the User's Fault, these are my guidelines for user interaction design:<br />
<span id="more-55"></span></p>
<h2>Know your users</h2>
<p>The first step in interaction design is to know who it will be interacting with. Users can be profiled on many criteria, such as age, technical orientation, vocation, cultural background and more. The user profiles created from segmentation of those criteria are called <a href="http://www.cooper.com/journal/2001/08/perfecting_your_personas.html" target="_blank">Personas</a>.</p>
<p>While defining Personas is a common practice for designing user interactions, it might not be possible to engage in all the steps required to fully understand the needs and tendencies of the users they represent - such as interviews, surveys, focus groups etc. </p>
<p>This is especially true on the web, where projects have limited funds and are very quick from inception to implementation. In this case, experience and common sense rule the day - but it is still important to define the base Personas for which the interaction under design applies. Going through the process brings out some considerations that can influence design decisions.</p>
<p>Watching actual users go through an interaction is very important to learn about its effectiveness. Watching live users in action is the best learning experience in interaction design.</p>
<h2>Know yourself</h2>
<p>Knowing your users is the most basic step to interaction design. Yet, for each user type and interaction requirements there are as many possible implementations as there are interaction designers. At this point the interaction designer has to make choices for his users based on his experience, attitude and style. </p>
<p>It is sometimes hard to avoid designing an interaction for yourself rather than for your users. It is a natural tendency to try to solve interaction problems in a way that seems most natural <em>to you</em>, however that might not always be in the user's best interest. </p>
<p>Ideally, the interaction designer is a part of the target audience. When that is not the case, observing prospective users is very important to understanding their needs and deciding on the approach to solve their problems.</p>
<p>I believe that good UI design is more intuitive than science, and in that respect it is not so different from graphical design. However the two should never be confused - as I've argued in my post on <a href="http://www.techfounder.net/2008/07/20/common-misconceptions-in-web-application-development/">common misconceptions in web development</a>.</p>
<h2>Keep it as simple as possible</h2>
<p>This <a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank">old mantra</a> is very much an integral part of a successful user interface. By keeping interactions as simple as possible you will:</p>
<ul>
<li>Have less opportunities to fail your users</li>
<li>Give your users less to think about, allowing them to make easier decisions</li>
<li>Reward your users quicker (at the completion of the interaction)</li>
<li>Increase the chance that the interaction will get completed at all</li>
</ul>
<p>A large part of the success of web-based services can be attributed to the simpler interfaces they provide compared to desktop solutions. Some of this is a result of technological limitations on the delivery software (ie, web browsers), but it's hard to argue with the results.</p>
<p>There are several common ways to simplify interactions:</p>
<ul>
<li>Use intelligent defaults</li>
<li>Hide optional paths (or form fields) by default (progressive disclosure)</li>
<li>Remove unnecessary steps from the interaction (and do so aggressively)</li>
<li>Reduce mouse clicks. Make each click do more</li>
</ul>
<p>This is obviously a very partial list, but it's a good start.</p>
<p>For me as a developer, the KISS principle is deeply ingrained in my thought process. Translating it into user interface design took some getting used to, but once it happened it became second nature. </p>
<p>In fact, many parallels can be drawn between UI design and software architecture design almost to the point you wonder why most developers aren't interested in designing interactions (actually I know why - most developers resent users for constantly breaking their code. I know this since a couple years back I had the same mindset). </p>
<h2>Don't break conventions - And if you do, make it obvious</h2>
<p>The tools available to us developers have evolved much in recent years, allowing us to create richer interfaces and interactions. With power comes responsibility - we need to apply discretion when using advanced techniques and tools, as to not confuse users. </p>
<p>Breaking interface conventions by using new technologies where they are not needed <i><a href="http://billhiggins.us/weblog/2007/04/20/the-value-of-ui-consistency/" target="_blank">is a mistake</a></i>. </p>
<p>Conventions should only be broken when they result in a bad user experience or when the alternative is significantly better. The latter is very uncommon when the former does not apply, so be advised. </p>
<p>If you do design a unique interaction (or at least, one that isn't in common use) - make it as obvious as possible for the user. A user can only begin to understand your new interaction when he realizes that something is different. Disguising buttons as links, hiding drop down menus in small target zones, making background changes to the document without notifying the user - all result in user confusion and a bad user experience. </p>
<p>The more you need to educate the user on how to complete an interaction - the less likely he will bother to. Good interactions are self explanatory.</p>
<h2>Interactions should be fun</h2>
<p>Users interact with your application since they want to achieve a goal. That goal might be to complete an item purchase, to indulge a curiosity, to gather information and many others. There are several factors that affect the user's motivation to complete an interaction:</p>
<ul>
<li>How important is the interaction to achieving the user's goal</li>
<li>How unique is your application (ie, how easy would it be for the user to find a better place to achieve his goal)</li>
<li>How hard it is for the user to complete the interaction</li>
</ul>
<p>Negative factors can be offset by a fourth one:</p>
<ul>
<li>How <strong>fun</strong> is it to progress through the interaction</li>
</ul>
<p>The fun factor in interactions is often ignored as they are considered strictly functional. It's no coincidence the word functional begins with <strong>fun</strong>. The fun factor of an interaction increases motivation for completing it - it makes your application more unique and it increases the user's tolerance for the interaction.</p>
<p>There are several ways to increase the fun factor of an interaction:</p>
<h3>Increasing aesthetics</h3>
<p>Making your interface prettier will have a positive effect on your users' perception of it. It's no secret that most of the illusion of Apple's superior OS interface is made on the grounds of aesthetics. </p>
<h3>Make it gamely</h3>
<p>Computer games have some of the best interfaces of any computer software, and it's no coincidence. You can make your interactions more gamely by adding feedback, reward the user for completing steps and transmit the feeling that the interaction is a part of the user's journey towards his goal, rather than a functional requirement that he must take care of.</p>
<h3>Make the interaction do more with less</h3>
<p>The user's time and patience are limited. Advance the interaction as much as you can with each user input. Make the user feel the interaction is smart and that it is working with him towards completion.</p>
<h2>Learn from others</h2>
<p>Those are my thoughts on user interaction design, born out of my experience in web development and of my introspection as a long-time user. </p>
<p>If you are interested in user interface design, the <a href="http://library.gnome.org/devel/hig-book/stable/" target="_blank">GNOME Human Interface guidelines</a> is as good a reference as you will find. </p>
<p>My favorite web authors on the subject include Jono at <a href="http://jonoscript.wordpress.com/" target="_blank">Not the User's Fault</a>, Bill Scott at <a href="http://looksgoodworkswell.blogspot.com/" target="_blank">Looks Good Works Well</a> and Aza at <a href="http://azarask.in/blog/" target="_blank">Aza's Thoughts</a>.</p>
 <img src="http://www.techfounder.net/wp-content/plugins/feed-statistics.php?view=1&post_id=55" width="1" height="1" style="display: none;" /><div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F26%2Fthe-lost-art-of-user-experience%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F26%2Fthe-lost-art-of-user-experience%2F" height="61" width="51" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.techfounder.net/2008/07/26/the-lost-art-of-user-experience/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Common misconceptions in web application development</title>
		<link>http://www.techfounder.net/2008/07/20/common-misconceptions-in-web-application-development/</link>
		<comments>http://www.techfounder.net/2008/07/20/common-misconceptions-in-web-application-development/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 07:13:18 +0000</pubDate>
		<dc:creator>Eran Galperin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[Web development]]></category>

		<guid isPermaLink="false">http://www.techfounder.net/?p=98</guid>
		<description><![CDATA[Over the time I have developed for the web, I have read and heard many assumptions about development practices and technologies. This is my list of common misconceptions in (web) development: 1. OO code is less performant than procedural code The number one argument against OO application design from procedural advocates. This argument is based [...]]]></description>
			<content:encoded><![CDATA[<p>Over the time I have developed for the web, I have read and heard many assumptions about development practices and technologies. This is my list of common misconceptions in (web) development:</p>
<h2>1. OO code is less performant than procedural code</h2>
<p>The number one argument against OO application design from procedural advocates. This argument is based more on intuition than fact. The <a href="http://devzone.zend.com/article/1236-The-Best-Tool-For-The-Job-OO-versus-Procedural-Programming-in-PHP" target="_blank">usual examples</a> pit short procedural code against equivalent OO code in which procedural code comes out triumphant as more terse and performant.<br />
<span id="more-98"></span></p>
<pre class="php"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">//Procedural, quick and to the point!</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$string</span> = <span style="color: #ff0000;">'hello world'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$string</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">//OO, verbose and ineffecient...</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">class</span> Speaker <span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> say<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$string</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$me</span> = <span style="color: #000000; font-weight: bold;">new</span> Speaker<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$me</span> -&gt; <span style="color: #006600;">say</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'hello world'</span><span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
<p>Actually, this example compares apples to oranges. Both approaches use 'echo' to output a string, only in the OO approach it is wrapped inside a class method. A more appropriate example for the procedural code would be:</p>
<pre class="php"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> say<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$string</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">say<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'hello string'</span><span style="color: #66cc66;">&#41;</span>;</div></li></ol></pre>
<p>Which is very similar to the OO code written before. Strong application structure actually does not differ greatly between OO and procedural/functional approaches as my second example suggests, and it is mainly a function of the developer's skill and experience.</p>
<p>OO methodology however gives more language features and scope constructs to deal with code complexities and to handle code reuse, features that would require much more discipline and experience to implement using procedural programming only.</p>
<p>In reality, it is the efficiency of the language parser that will determine performance differences between procedural and OO code. There are no inherent <strong>noticeable</strong> performance differences between both methodologies for <strong>common usage in web applications</strong>. More typically in the web environment, IO operations such as server requests or database queries are the bottlenecks of performance / scalability.</p>
<p>Since it's impossible to know in advance what the bottlenecks will be (you can only make educated guesses), I try to follow the <a title="Wikiwikiweb on Rules of optimization" href="http://c2.com/cgi/wiki?RulesOfOptimization" target="_blank">Rules Of Optimization</a>:</p>
<ol>
<li>First rule of optimization - <strong>Don't</strong></li>
<li>Second rule of optimization - <strong>Don't ... yet</strong></li>
<li>Third rule of optimization - <strong>Profile before optimizing</strong></li>
</ol>
<p>It is much more important to pick a methodology that will promote more maintainable and structured code, as OOP does, to possible minor performance gains. With a well structured design, profiling an application and refactoring slow-performing code is a relatively straightforward process.</p>
<h2>2. The backend is the most important part of development</h2>
<p>I often see web developers treat HTML, CSS and Javascript as second class languages. While HTML and CSS are not programming languages per-se, correct implementation of both in a cross-browser and semantic way requires much experience and skill that I often see lacking in otherwise proficient web developers.</p>
<p>It is not uncommon to relegate implementation of those two markup languages to web designers or  "client-side developers" (which are usually regarded as lower level developers) or to use auto-generating tools for creating markup.</p>
<p><strong>Both approaches are wrong</strong> - the client side is an important aspect of the web development process, especially because of the unique environment a web site or application runs in on the Internet - the browser, which has many different flavours each with its own set of problems and constraints.</p>
<p>Javascript (or DHTML) is another domain expertise which is undervalued and yet has become such a common requirement in today's rich Internet applications. Many web developers coming from a server-side language background have an intrinsic dislike for Javascript because of its weird OO syntax, its difficult debugging scheme and its un-uniform implementation across browsers . I would admit to once have thought the same way, however through necessity I came to like Javascript and now consider it an indispensable skill for a serious web developer.</p>
<p><strong>Don't disrespect the client side languages</strong>. Sometimes the greatest challenges in web development are found there.</p>
<h2>3. Graphical designers are good at user interface design</h2>
<p>* This is more relevant for web applications as opposed to web sites</p>
<p>While there is a connection between graphical design and UI design, graphical designers <strong>do not</strong> naturally make for good UI designers. I can not emphasis this enough. User interface and user experience design is a separate expertise from graphical design. How a user will interact with a site / application is different from how he will view it. It is connected - but not the same.</p>
<p>Quoting <a href="http://en.wikipedia.org/wiki/User_interface_design" target="_blank">wikipedia</a>:</p>
<blockquote><p>Where traditional graphic design seeks to make the object or application physically attractive, the goal of user interface design is to make the user's interaction as simple and efficient as possible</p></blockquote>
<p>Graphical designers with no expertise in UI design tend to prefer aesthetics over usability, and this is only natural as it accentuates their strengths. On the flip side, (web) developers don't usually make for good UI designers either.</p>
<p>UI design is important for creating a usable application. <strong>Make sure the right people are creating it</strong>.</p>
<h2>4. The existence of a superior programming language</h2>
<p>While some programming languages are considered superior to others (higher level, more featured, better syntax etc.), no one language can be considered <strong>the</strong> superior language. Debating that one exists is more a statement of personal preferences than a declaration of actual merit.</p>
<p>All modern languages have roughly the same features and can perform most tasks equally well. Some languages might be more suited to specific problems than others, however no one language does everything better than the others.</p>
<p>Some promote specific languages because of highly acclaimed frameworks developed for them (I'm referring to <a title="Ruby On Rails" href="http://www.rubyonrails.org/" target="_blank">Ruby on Rails</a>, naturally). While this is a more relevant argument, currently all the major languages have at least one serious framework (<a href="http://www.djangoproject.com/" target="_blank">Django</a> for python, <a href="http://framework.zend.com/" target="_blank">Zend Framework</a> / <a href="http://www.cakephp.org/" target="_blank">CakePHP</a> / <a href="http://www.symfony-project.org/" target="_blank">Symphony</a> for PHP).</p>
<p>Use the language you are comfortable with, but <a href="http://www.techfounder.net/2008/05/22/php-versus-the-world/">don't deride others</a> based on your inexperience with them.</p>
<h2>5. XML is more economic than a DB</h2>
<p>Database are notorious for being the major bottleneck for many successful web sites / applications. It is this notoriety that prompts novice developers to seek out alternative persistence layers - and XML is the common alternative.</p>
<p>In general, parsing XML is slower and more resource intensive than querying a database. This is dependent on the complexity of the query, but holds true for 99% of the cases. Furthermore, databases have a much more complete language to fetch, order and manipulate result sets.</p>
<p>XML is a portable format for storing hierarchical data. It is useful for porting data between different databases  or between databases and interfaces. However <strong>XML is not a database</strong>, so don't treat it as one.</p>
<p><em>If you have more to add to this list, I would love to hear about it.<br />
</em></p>
 <img src="http://www.techfounder.net/wp-content/plugins/feed-statistics.php?view=1&post_id=98" width="1" height="1" style="display: none;" /><div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F20%2Fcommon-misconceptions-in-web-application-development%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F20%2Fcommon-misconceptions-in-web-application-development%2F" height="61" width="51" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.techfounder.net/2008/07/20/common-misconceptions-in-web-application-development/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>The Advancing PHP Developer Part 5: Design Patterns</title>
		<link>http://www.techfounder.net/2008/07/12/the-advancing-php-developer-part-5-design-patterns/</link>
		<comments>http://www.techfounder.net/2008/07/12/the-advancing-php-developer-part-5-design-patterns/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 03:24:11 +0000</pubDate>
		<dc:creator>Eran Galperin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[Web development]]></category>

		<guid isPermaLink="false">http://www.techfounder.net/?p=49</guid>
		<description><![CDATA[5. Design Patterns A design pattern is a general reusable solution to a recurring design problem in object-oriented systems. Design patterns are essentially blueprints that suggest how to solve a particular set of OO design problems while adhering to OO best good-practices (which I've recounted in my Object Oriented part of this series). To explain [...]]]></description>
			<content:encoded><![CDATA[<h2>5. Design Patterns</h2>
<p>A <a title="Wikipedia: Design Pattern" href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" target="_blank">design pattern</a> is a general reusable solution to a recurring design problem in object-oriented systems. Design patterns are essentially blueprints that suggest how to solve a particular set of OO design problems while adhering to OO <span style="text-decoration: line-through;">best</span> good-practices (which I've recounted in my <a title="Techfounder on Object Oriented PHP programming" href="http://www.techfounder.net/2008/05/25/the-advancing-php-developer-part-2-object-orientation/">Object Oriented part of this series</a>).</p>
<p>To explain by example, lets have a look at the <a href="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller pattern</a>, a common pattern in use on the web and a source of much confusion amongst aspiring developers. The Model-View-Controller pattern (abbr. MVC) is a general solution for decoupling domain logic from the user interface, resulting in much better maintainability for both.<br />
<span id="more-49"></span><br />
MVC suggests an application structure composed of three basic elements:</p>
<ol>
<li>Models - which encapsulate <a title="Domain Logic" href="http://www.phpwact.org/pattern/domain_logic" target="_blank">domain logic</a> (such as <a title="Wikipedia: Business Rules" href="http://en.wikipedia.org/wiki/Business_rule" target="_blank">business rules</a> and database access)</li>
<li>Views - which encapsulate presentation logic (such as HTML markup and recurring formatting decorators)</li>
<li>Controllers - which handle the application flow by handling requests and match models to views accordingly.</li>
</ol>
<p>By separating those three concerns MVC aims to provide a reusable solution for improving maintainability, as each can theoretically be changed independently (in practice, things are never so simple). My personal experience has been that MVC is a huge improvement over common PHP development which promotes spaghetti code since PHP can be very easily integrated with markup (HTML).</p>
<p>The MVC patterns is often used with the <a href="http://java.sun.com/blueprints/patterns/FrontController.html" target="_blank">Front-Controller pattern</a>, which defines a single entry point to an application and allows for ever greater control of application flow (a technique also known as <a href="http://devzone.zend.com/node/view/id/70" target="_blank" title="Zend Devzone on bootstrapping">bootstrapping</a>).</p>
<p>There are <a title="Wikipedia: Design Patterns" href="http://en.wikipedia.org/wiki/Category:Software_design_patterns" target="_blank">plenty of other useful patterns</a> for the web-environment, such as <a title="Wikipedia: Composite Pattern" href="http://en.wikipedia.org/wiki/Composite_pattern" target="_blank">Composite</a>, <a title="Wikipedia: Singleton Pattern" href="http://en.wikipedia.org/wiki/Singleton_pattern" target="_blank">Singleton</a> (and <a href="http://www.patternsforphp.com/wiki/Registry" target="_blank">Registry</a>), <a title="Wikipedia: Factory Pattern" href="http://en.wikipedia.org/wiki/Factory_method_pattern" target="_blank">Factory</a> and <a href="http://en.wikipedia.org/wiki/Decorator_pattern">Decorator</a> among others.</p>
<p>Design patterns broke into the software mainstream with the release of the apt named book <a href="http://en.wikipedia.org/wiki/Design_Patterns" target="_blank" title="Wikipedia: Design Patterns book">Design Patterns: Elements of Reusable Object-Oriented Software</a> (which I think any serious developer should read). The <a href="http://www.c2.com/cgi/wiki?WelcomeVisitors" target="_blank">WikiWikiWeb</a>, which has the book authors among others as contributors, contains many articles on design patters - such as an <a href="http://www.c2.com/cgi-bin/wiki?HistoryOfPatterns" target="_blank">overview of its history</a> and a discussion on <a href="http://www.c2.com/cgi/wiki?AreDesignPatternsMissingLanguageFeatures" target="_blank">whether design patterns should be language features</a> to name a few.</p>
<p>Design patterns are not limited to software design, and there are many patterns for design problems in all aspects of web development - such as graphical design and user interactions.</p>
<p>Extra reference material:<br />
<a href="http://www.patternsforphp.com/wiki/Main_Page" target="_blank">Patterns for PHP</a><br />
<a href="http://www.welie.com/patterns/" target="_blank">User interface patterns for the web</a><br />
<a href="http://www.e-gineer.com/v1/articles/design-patterns-in-web-programming.htm" target="_blank">Design patterns in web programming</a><br />
<a href="http://groups.ischool.berkeley.edu/ui_designpatterns/webpatterns2/webpatterns/home.php" target="_blank">Web patterns by Berkeley University</a><br />
<a href="http://ajaxpatterns.org/" target="_blank">Ajax patterns</a></p>
<p>Previously: <a href="http://www.techfounder.net/2008/06/07/the-advancing-php-developer-part-4-testing/" title="Techfounder on testing practices in PHP">Testing</a>, Next up: API</p>
 <img src="http://www.techfounder.net/wp-content/plugins/feed-statistics.php?view=1&post_id=49" width="1" height="1" style="display: none;" /><div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F12%2Fthe-advancing-php-developer-part-5-design-patterns%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F12%2Fthe-advancing-php-developer-part-5-design-patterns%2F" height="61" width="51" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.techfounder.net/2008/07/12/the-advancing-php-developer-part-5-design-patterns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Microsoft User Experience</title>
		<link>http://www.techfounder.net/2008/07/10/the-microsoft-user-experience/</link>
		<comments>http://www.techfounder.net/2008/07/10/the-microsoft-user-experience/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 02:46:38 +0000</pubDate>
		<dc:creator>Eran Galperin</dc:creator>
				<category><![CDATA[UI]]></category>
		<category><![CDATA[techfounder]]></category>

		<guid isPermaLink="false">http://www.techfounder.net/?p=92</guid>
		<description><![CDATA[I got repeatedly annoyed today by what I consider typical behavior for Microsoft products. Windows has the option to perform automatic updates - and recommends to do so in the Security Center (no one wants to see red lights in their Security Center. Does CODE RED mean anything to you? Also, everybody just LOVES updates. [...]]]></description>
			<content:encoded><![CDATA[<p>I got repeatedly annoyed today by what I consider typical behavior for Microsoft products. Windows has the option to perform automatic updates - and recommends to do so in the Security Center (no one wants to see red lights in their Security Center. Does CODE RED mean anything to you? Also, everybody just LOVES updates. Unless it's from Adobe).</p>
<p>After automatic updates does its thing, it promptly suggests to restart the computer. Two options are given - Restart now and Restart later. What 'Restart now' does should be obvious, however 'Restart later' is apparently open to interpretation - as Windows will constantly remind you to restart every 10 minutes or so, and will forcibly restart the computer itself if left unattended.<br />
<span id="more-92"></span><br />
<img src="http://www.techfounder.net/wp-content/uploads/2008/07/countdown.png" alt="Restart? NO!" class="header" /></p>
<p>What is the reasoning behind this nagging reminder? everybody will shutdown / restart their computer eventually. If I chose not to restart it now, could it be that I won't want to restart it in 10 minutes either? is my security compromised to such a degree that I need to be annoyed into submission to restart the computer?</p>
<p>This annoyance is either amplified or dampened (depending on your perspective) by Windows inability to perform system shutdown without user guidance. Often it will stop on one or more open programs which have unsaved data, prompting the user for action (Save?  Yes, No, Cancel). If no action is taken, system shutdown will never complete. Too many times I trusted Windows to complete my laptop's shutdown procedure only to discover an hour later that it ran out of battery waiting for my confirmation... (at least hibernation can happen automatically. Thank god for small miracles).</p>
<p>I will conclude this rant by shifting focus to a company I used to respect for having a good user experience - Adobe. Recently, all Adobe products have Automatic Updates turned on for some reason - with no obvious way to turn it off permanently. No offense Adobe, but unless someone can hack into my computer through Photoshop - I don't need your stinking updates. Especially when they clock at around 500Mb since you try to transparently push Adobe Air on to my computer. </p>
<p>Adobe, don't be like Microsoft. Respect your users (or risk losing them).</p>
<p><a href="http://www.intelliadmin.com/blog/2007/11/disable-adobe-automatic-updates.html">Disable Adobe updater</a></p>
<p>UPDATE: Apparently, I am not the only one annoyed by Windows Automatic Updates (big surprise there). Check out <a href="http://www.codinghorror.com/blog/archives/000294.html">this handy guide</a> over at Coding Horror for making your life a little bit better.</p>
 <img src="http://www.techfounder.net/wp-content/plugins/feed-statistics.php?view=1&post_id=92" width="1" height="1" style="display: none;" /><div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F10%2Fthe-microsoft-user-experience%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F07%2F10%2Fthe-microsoft-user-experience%2F" height="61" width="51" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.techfounder.net/2008/07/10/the-microsoft-user-experience/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>How not to provide user feedback</title>
		<link>http://www.techfounder.net/2008/06/08/how-not-to-provide-user-feedback/</link>
		<comments>http://www.techfounder.net/2008/06/08/how-not-to-provide-user-feedback/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 00:34:25 +0000</pubDate>
		<dc:creator>Eran Galperin</dc:creator>
				<category><![CDATA[UI]]></category>
		<category><![CDATA[Web development]]></category>
		<category><![CDATA[techfounder]]></category>

		<guid isPermaLink="false">http://www.techfounder.net/?p=57</guid>
		<description><![CDATA[As part of my work on the blog's presence, I try to submit my articles to relevant directories. One such directory is the Zend Framework Tutorials site, which I thought would be a perfect place for my Models in the Zend Framework series. When I try to submit my article I am presented with the [...]]]></description>
			<content:encoded><![CDATA[<p>As part of my work on the blog's presence, I try to submit my articles to relevant directories. One such directory is the <a title="ZF Tutorials" href="http://www.zftutorials.com/" target="_blank">Zend Framework Tutorials</a> site, which I thought would be a perfect place for my Models in the Zend Framework series.<span id="more-57"></span></p>
<p>When I try to submit my article I am presented with the following form:</p>
<p><img src="http://www.techfounder.net/wp-content/uploads/2008/06/form.gif" alt="Suggest new tutorial form" width="600" height="513" /></p>
<p>First thing I wonder, is what the hell do they mean by reciprocal URL. I know what the term means, but what am I expected to write there? no clue in sight, and no 'help' link to be found.</p>
<p>So I try to fill it up the best as I can, only to receive the following cryptic error:</p>
<p><img src="http://www.techfounder.net/wp-content/uploads/2008/06/form_fail.gif" alt="Form fail" width="528" height="562" class="header" /></p>
<p>Hmmm... Listing seems to be broken. No kidding. WTF?? Check it manually? what am I supposed to do with this? I tried variations with the URL (with and without http://), tried changing the reciprocal URL, nada. I looked around the site to see other submitted tutorials and found no clue as to what I was doing wrong.</p>
<p>What is the failure here:</p>
<ul>
<li>A cryptic error message</li>
<li>No further help is offered</li>
<li>The error is preventing me from completing the process</li>
<li>No contact email or any other way to ask for assistance</li>
</ul>
<p>This is what you get when you let programmers design user interactions. (If anybody has any idea on how to solve this, I would appreciate it)</p>
 <img src="http://www.techfounder.net/wp-content/plugins/feed-statistics.php?view=1&post_id=57" width="1" height="1" style="display: none;" /><div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F06%2F08%2Fhow-not-to-provide-user-feedback%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.techfounder.net%2F2008%2F06%2F08%2Fhow-not-to-provide-user-feedback%2F" height="61" width="51" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.techfounder.net/2008/06/08/how-not-to-provide-user-feedback/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
