<?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:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Janko At Warp Speed</title>
    <description>I design software that speak human and love to write about it</description>
    <link>http://www.jankoatwarpspeed.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.0.0.36</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.jankoatwarpspeed.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Janko Jovanovic</dc:creator>
    <dc:title>Janko At Warp Speed</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JankoAtWarpSpeed" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="jankoatwarpspeed" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">JankoAtWarpSpeed</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>Starting my own business</title>
      <description>&lt;p&gt;Some time ago I decided to take up new challenges and next week I am going freelance and starting my small business. I am leaving my company with which I will keep good relationship and where I met some truly great people. However, I feel it is time for me to continue chasing my dreams.&lt;/p&gt;
&lt;p&gt;I have been working for years for different companies and besides my day job I handled multiple freelance projects. It worked for quite some time but it wasn't sustainable in the long term. At one point, the amount of work exceeded my free time and energy and after I nearly burned out I realized it's time to make a change. Luckily, I met some wonderful people and have truly fantastic projects, some of which you could've seen on &lt;a href="http://dribbble.com/jankowarpspeed"&gt;my dribbble stream&lt;/a&gt;. I'm eager to continue working on the current projects and to start a couple of new exciting ones. Most of the future projects will be team work - some of my colleagues designers will work closely with me in various aspects of design process.&lt;/p&gt;
&lt;p&gt;My moleskin is full of article ideas which I haven't had time to tackle but I plan to fix this in the near future. After all, I neglected this blog completely for the last 10 months! I will write about UI/interaction design principles and practical things I learned, thoughts on design research &amp;amp; usability testing and observations about being an in-house UX person.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dribbble.com/system/users/21105/screenshots/144359/home-2.jpg" alt="Janko At Warp Speed redesign" /&gt;&lt;br /&gt;&lt;em&gt;One of the goals is to redesign my portfolio&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This site will also need some work and the focus will be on my portfolio. Currently it says nothing about design processes and decisions I've taken on projects so I find it more or less useless. Also it lacks most of the recent work. Each project in portfolio will consist of a short case study and sreenshots that will reveal more details.&lt;/p&gt;
&lt;p&gt;It will probably be hard, but more important is that it will be fun, and I am determined to do something really good. We'll see how it goes.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=V9Pn6BX3VrU:F4BlmJa1ZBs:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=V9Pn6BX3VrU:F4BlmJa1ZBs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=V9Pn6BX3VrU:F4BlmJa1ZBs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=V9Pn6BX3VrU:F4BlmJa1ZBs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=V9Pn6BX3VrU:F4BlmJa1ZBs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=V9Pn6BX3VrU:F4BlmJa1ZBs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=V9Pn6BX3VrU:F4BlmJa1ZBs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2011/12/13/Starting-my-own-business.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2011/12/13/Starting-my-own-business.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=2fa1d18b-cc91-40ba-be0f-0ea7f04d7aef</guid>
      <pubDate>Tue, 13 Dec 2011 08:00:00 +0100</pubDate>
      <category>Process &amp; practice</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=2fa1d18b-cc91-40ba-be0f-0ea7f04d7aef</pingback:target>
      <slash:comments>184</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=2fa1d18b-cc91-40ba-be0f-0ea7f04d7aef</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2011/12/13/Starting-my-own-business.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=2fa1d18b-cc91-40ba-be0f-0ea7f04d7aef</wfw:commentRss>
    </item>
    <item>
      <title>Innovation is all about iteration and refinement</title>
      <description>&lt;p&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;here's a popular belief that innovation can only come straight from the mind of a genius. &lt;/span&gt;After the article &lt;span&gt;&lt;a href="http://www.fastcodesign.com/1663220/user-led-innovation-cant-create-breakthroughs-just-ask-apple-and-ikea"&gt;User-Led Innovation Can't Create Breakthroughs; Just Ask Apple and Ikea&lt;/a&gt; has been published &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;ome people have taken it as proof that processes like User Centric Design (UCD) stand in way of innovation. I've spoken to my colleagues designers, developers and managers and it seems as if many (but not all, luckily) agree with this belief. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I believe this is wrong.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;First and foremost, I think many people don't understand what innovation is. Innovation is  not just something that is new, more creative and radically different.  Rather, it is something that is better, something that has &lt;strong&gt;proven its  worth for the people&lt;/strong&gt;. If you invent something new, that is just  an invention. If your invention is accepted and used by people, that's an  innovation. Lightbulb, for instance, is an innovation. We know that  because it changed lives of generations for the better.&lt;/p&gt;
&lt;p&gt;Innovation doesn't come straight from a mind of a genius. Something new, creative and different might be a consequence of one brilliant moment of &lt;span id="result_box" class="short_text" lang="en"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;enlightenment. That's an invention. But to create an invention that is useful and that makes sense, one would need to evaluate and refine many different concepts. Some of them completely crazy. Most of them completely wrong. But we know which ones to dismiss and which one to refine only through&lt;strong&gt; iterations of trials and errors&lt;/strong&gt;. &lt;/span&gt;&lt;/span&gt;Lightbulb, that I mentioned before became a useful invention only after 10,000 iterations.&lt;/p&gt;
&lt;p&gt;Then there's a huge and important misconception about the UCD process. The misconception is that UCD, by focusing on users, forces designers to answer their wishes, stifles creativity and limits their ability to create something substantially different. UCD does focus on users, but it focuses on recognition of their  &lt;strong&gt;needs, limitations, tasks, and goals&lt;/strong&gt;. It's about understanding people which will help designers make the right decisions. It isn't about what people want - it is well  known that &lt;a href="http://uxmyths.com/post/746610684/myth-21-people-can-tell-you-what-they-want"&gt;people can't tell you what they want&lt;/a&gt;.  Rather, it's about what designers want to make in order to meet users'  needs or create something new and unimaginable for users.&lt;/p&gt;
&lt;p&gt;Can you really make something better for the people if you don't understand them? Not &lt;em&gt;listen &lt;/em&gt;to them as the article says, but &lt;em&gt;understand &lt;/em&gt;them. Can you increase value for them if you are unaware of their goals? Can you predict the future if you don't know the past or presence? Highly unlikely. An innovation might be a sparkle in a mind of a genius, but I would argue that innovation is a consequence of a very hard, iterative process.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=J325sUv2pAY:2bpXQPJ67VE:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=J325sUv2pAY:2bpXQPJ67VE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=J325sUv2pAY:2bpXQPJ67VE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=J325sUv2pAY:2bpXQPJ67VE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=J325sUv2pAY:2bpXQPJ67VE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=J325sUv2pAY:2bpXQPJ67VE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=J325sUv2pAY:2bpXQPJ67VE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2011/02/23/innovation-iteration-refinement.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2011/02/23/innovation-iteration-refinement.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=b718ec61-b12e-4e46-9703-32cde281a558</guid>
      <pubDate>Wed, 23 Feb 2011 09:00:00 +0100</pubDate>
      <category>Process &amp; practice</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=b718ec61-b12e-4e46-9703-32cde281a558</pingback:target>
      <slash:comments>22</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=b718ec61-b12e-4e46-9703-32cde281a558</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2011/02/23/innovation-iteration-refinement.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=b718ec61-b12e-4e46-9703-32cde281a558</wfw:commentRss>
    </item>
    <item>
      <title>Prevent feature-creep by focusing on users' goals</title>
      <description>&lt;blockquote&gt;There are two ways of constructing a software design; one way is to make  it so simple that there are obviously no deficiencies, and the other  way is to make it so complicated that there are no obvious deficiencies.  The first method is far more difficult.&lt;/blockquote&gt;
&lt;p style="text-align: right;"&gt;&amp;mdash; Charles Antony Richard Hoare&lt;/p&gt;
&lt;p&gt;Feature-creep or featuritis is a tendency to constantly add features which inevitably leads to complex products that are confusing and hard to use. To make matters worse, by adding features we move the product away from solving primary issues - the reason for making the product in the first place. Some products are even conceived with featuritis.&lt;/p&gt;
&lt;p&gt;Adding features is the easiest to do in the world of software. There is no need for physical changes plus they are quick and easy to accomplish. Thus, most software products suffer from this disease.&lt;/p&gt;
&lt;h2&gt;What causes feature creep?&lt;/h2&gt;
&lt;p&gt;Most software suffering from feature creep are technologically rich solutions which arise from user and business people requests, as well as from marketing research. Engineers add features because they want to create a technologically better product. Because they are the ones controling the development process, we get a technologically advanced software which fullfils the business requirements, but is very difficult to use. On the other hand, business people want a product filled with features believing that would make it more competitive and wanted on the market. However, it must meet client requirements as well. Everything is about quantity with them: requirements, time and resources.&lt;/p&gt;
&lt;p&gt;By asking the wrong questions like "Wouldn't it be cool to add this feature?", development teams add functionalities which are unnecessary for basic software purpose, the one that supports users' primary activities. As we know, intermediate users use only a part of software functionality, so a large part of the added features is not going to be used at all. Even when the team agrees to focus on core functionalities only, no one is quite sure what these are. There are only assumptions and guesses which easily lead to feature creep.&lt;/p&gt;
&lt;h2&gt;Users and their goals&lt;/h2&gt;
&lt;p&gt;Features are important - they present a picture of software capabilities and value. However, there is something more important which is usually left out - people. People who use the software. Without users in mind, without knowing why they do something, you only ask &lt;em&gt;what &lt;/em&gt;are we building and &lt;em&gt;how&lt;/em&gt;. The &lt;em&gt;why &lt;/em&gt;is left out. Nobody is wandering if there is a need to build something. The users have goals and needs different from those whose create or sell software.&lt;/p&gt;
&lt;p&gt;When user goals are not recognized, the only thing that we can focus on is individual activities and tasks. Tasks and activities, however, are only steps a user takes in order to achieve their goals. A task is uploading a CV, an activity would be applying for a job, but the goal is to get a good job. Since goals are what motivates people their tasks and activities will serve in achieving their goals; and as tasks and activities map onto features, it is clear they too are serving this purpose. If we don't know what the goals are, there is no limit to adding new functionality. This is where the true nature of featuritis lies.&lt;/p&gt;
&lt;h2&gt;Missing design process&lt;/h2&gt;
&lt;p&gt;A successful product requires not only good technology platform and satisfaction of business needs but also an adequate design process, which is usually missing. Instead of non-designers asking questions about cool features and making decisions based on that professional designers should, as an integral part of the team, seek answers to who the users are, how do they act, which activities they wish to perform and how the software should behave in order to meet their requirements.&lt;/p&gt;
&lt;p&gt;Answers to these questions are available through &lt;a href="http://www.uxbooth.com/blog/complete-beginners-guide-to-design-research/"&gt;various research methods&lt;/a&gt;, which should come before the development process begins. Research results should be modeled into &lt;a href="http://www.uie.com/articles/personas/"&gt;Personas&lt;/a&gt; - presenting the central point for design process. Personas will always remind us of who we are designing (and developing) the software for and keep features under control.&lt;/p&gt;
&lt;p&gt;Furthermore, various ideas will be researched and validated, iteratively, through people testing thus allowing us to create software accommodated to users rather than forcing them to accommodate to a software product filled with fancy features. So, an iterative, user-centric design keeps the users in focus throughout the design process and enables us to meet users' needs and goals. Thus keeping non-important features out of scope.&lt;/p&gt;
&lt;h2&gt;Good and bad (and very ugly) example&lt;/h2&gt;
&lt;p&gt;Take &lt;a href="https://www.dropbox.com/"&gt;Dropbox&lt;/a&gt; for example - Dropbox does one thing and it's doing it well - it synchronizes your offline data with their online copy. No fancy features here. Dropbox is focused on what the users need. By answering the question "Why is Dropbox popular and not something similar, like Windows Live Sync, which is free?", Michael Wolfe &lt;a href="http://www.quora.com/Why-is-Dropbox-popular-and-not-something-similar-like-Windows-Live-Sync-which-is-free/answer/Michael-Wolfe"&gt;explains in a short and effective way&lt;/a&gt; what's standing behind Dropbox success.&lt;/p&gt;
&lt;p&gt;To much regret, it is far easier and cheaper to build a feature-rich software than to satisfy the needs and goals of users. We know this due to a large number of bad examples. I once came across an article (can't remember which or where, if anyone knows, please share) explaining how the problem of featuritis was solved by adding a feature which let's you choose a mode: beginner or expert. Another feature to cure featuritis! Unfortunately, this is how many software products look like today - difficult to maintain metastasized mutants, which scare the users.&lt;/p&gt;
&lt;p&gt;Looks like something you saw recently?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=huz1Y2w8kr8:YXTKFcIRLV0:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=huz1Y2w8kr8:YXTKFcIRLV0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=huz1Y2w8kr8:YXTKFcIRLV0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=huz1Y2w8kr8:YXTKFcIRLV0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=huz1Y2w8kr8:YXTKFcIRLV0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=huz1Y2w8kr8:YXTKFcIRLV0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=huz1Y2w8kr8:YXTKFcIRLV0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/12/23/feature-creep-users-goals.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/12/23/feature-creep-users-goals.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=e13d19e5-9e1e-453d-852c-3c75f9a2954d</guid>
      <pubDate>Thu, 23 Dec 2010 09:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=e13d19e5-9e1e-453d-852c-3c75f9a2954d</pingback:target>
      <slash:comments>19</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=e13d19e5-9e1e-453d-852c-3c75f9a2954d</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/12/23/feature-creep-users-goals.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=e13d19e5-9e1e-453d-852c-3c75f9a2954d</wfw:commentRss>
    </item>
    <item>
      <title>Opera mobile window chooser, recreated with jQuery</title>
      <description>&lt;p&gt;&lt;img src="../../image.axd?picture=2010%2f11%2fopera-windows.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;It's always fun to play with jQuery especially when you are trying to recreate something that you enjoy using. One such thing is window chooser in Opera Mobile browser where opened windows are positioned below each other and only a portion of each window is visible. The one on the top is current window that is fully visible. Clicking on those windows is followed by some nice effect.&lt;/p&gt;
&lt;p&gt;&lt;a class="demo" href="http://www.jankoatwarpspeed.com/examples/opera-windows/"&gt;View demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our "windows" are nothing more than simple unordered list. Each LI element can have any content, as you can see in the demo. Initially the first LI element will be "the chosen window".&lt;/p&gt;
&lt;pre&gt;&amp;lt;ul id="container"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li class="current"&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;
&lt;p&gt;On the very beginning we define how much each window will be hidden and how much it will slide to the left and right. Next, we assign ID to each window that will be needed later in the process and position them below each other.&lt;/p&gt;
&lt;pre&gt;var itemWidth = $("#container li").width();&lt;br /&gt;// hide 50% of each window&lt;br /&gt;var itemPosition = itemWidth * 50 / 100;&lt;br /&gt;// slide each window 60% if its width&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;var itemMove = itemWidth * 60 / 100;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;// move windows below each other and assign ID to each&lt;br /&gt;$("#container li").each(function(i) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).attr("id", i).css("z-index", 100 - i).css("left", itemPosition * i);&lt;br /&gt;});&lt;/pre&gt;
&lt;p&gt;Now the main part. When user clicks on a window, several things should happen. First we determine the position of a clicked window and the previsouly chosen one. If clicked window is on the left side of the chosen window, all windows before the clicked one will slide to the left. Analogously, if clicked one is on the right side of the chosen window, all windows after the clicked one will slide to the right.&lt;/p&gt;
&lt;pre&gt;$("#container li").click(function(e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get id's of the current window and the one that user clicked on&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var currentID = parseInt($(".current").attr("id"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var clickedID = parseInt($(this).attr("id"));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (currentID != clickedID) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (clickedID &amp;gt; currentID) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // slide windows to the left&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // slide windows to the right&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;});&lt;/pre&gt;
&lt;p&gt;Here's how we slide windows to the right. We take the ID of the clicked window (and add 1 to prevent clicked window to slide) and loop through the collection of windows to the end. We then first slide each windows to the right, move them behind clicked window (with z-index) and slide them back to the left.&lt;/p&gt;
&lt;pre&gt;var i = 1;&lt;br /&gt;var total = $("#container li").length;&lt;br /&gt;for (j = clickedID + 1; j &amp;lt;= total; j = j + 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + j).animate({ "left": "+=" + itemMove * i + "px" }, 500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + j).animate({ "left": "-=" + itemMove * i + "px" }, 300);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + j).css("z-index", currentZ - i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = i + 1;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Believe it or not, left sliding is more complex than right sliding. The reason for this is in the fact that windows will be sent to the back immediately upon clicking, so we need to postpone changing z-index for sliding windows to the moment when they are on the leftmost position. Then we can slide them back. We do this in the loop that will iterate from the first window one the left of the clicked one, all to the fist window in the collection.&lt;/p&gt;
&lt;pre&gt;var i = 1;&lt;br /&gt;var total = clickedID - currentID + 1;&lt;br /&gt;for (j = clickedID - 1; j &amp;gt;= 0; j = j - 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + j).animate({ "left": "-=" + itemMove * (i) + "px" }, 500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + j).animate({ "left": "+=" + itemMove * (i) + "px" }, 300);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = i + 1;&lt;br /&gt;}&lt;br /&gt;var i = 1;&lt;br /&gt;setTimeout(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j = clickedID - 1; j &amp;gt;= 0; j = j - 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + j).css("z-index", total - i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = i + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}, 500);&lt;/pre&gt;
&lt;p&gt;Now, before we slide windows, we need to remove class .current from the old "chosen one" and assign it to the clicked window. We'll also postpone this to the moment when windows reach their leftmost/rightmost positions.&lt;/p&gt;
&lt;pre&gt;var currentZ = 99;&lt;br /&gt;var current = $(this);&lt;br /&gt;setTimeout(function() { $(".current").removeClass("current"); current.css("z-index", currentZ).addClass("current"); }, 500);&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;At the end, we have one issue here. If windows contain links user might think they can click on the link even ehen they are semi-hidden. In order to fix this issue we prevent default click action by adding e.preventDefault() just below the if statement.&lt;/p&gt;
&lt;pre&gt;if (currentID != clickedID) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.preventDefault();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/pre&gt;
&lt;p&gt;We can also style links as normal text so that there's no doubt if there's anything clickable in semi-hidden windows. This way users can access the content in chosen window only.&lt;/p&gt;
&lt;p&gt;&lt;a class="demo" href="http://www.jankoatwarpspeed.com/examples/opera-windows/"&gt;View demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am somehow sure that this can be optimized so if you know the way, shoot it! If I find some free time (which is unlikely) I will create a plugin. Above all it was fun to play with jQuery after such a long time.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=GJ-CTvKzLi0:KseMfklWEuM:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=GJ-CTvKzLi0:KseMfklWEuM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=GJ-CTvKzLi0:KseMfklWEuM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=GJ-CTvKzLi0:KseMfklWEuM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=GJ-CTvKzLi0:KseMfklWEuM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=GJ-CTvKzLi0:KseMfklWEuM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=GJ-CTvKzLi0:KseMfklWEuM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/11/18/opera-mobile-jquery.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/11/18/opera-mobile-jquery.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=838a4242-9fd5-4985-8fe9-ed6d65d12faf</guid>
      <pubDate>Thu, 18 Nov 2010 09:00:00 +0100</pubDate>
      <category>Tutorials</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=838a4242-9fd5-4985-8fe9-ed6d65d12faf</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=838a4242-9fd5-4985-8fe9-ed6d65d12faf</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/11/18/opera-mobile-jquery.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=838a4242-9fd5-4985-8fe9-ed6d65d12faf</wfw:commentRss>
    </item>
    <item>
      <title>Empathy and web design</title>
      <description>&lt;p&gt;Although different people assume different things when it comes to design, the fact is that good design is often thought to be decorative and aesthetic. This applies to design in general so web design is no different. We admire beautiful design solutions that are mostly nothing more than eye-candy. Seems as if primary goals of many web designers are creating beauty and satisfying clients' needs where the client is often mistakenly considered to be an actual user.&lt;/p&gt;
&lt;p&gt;Too often the essence of web design comes down to "Genius design" where everything depends on the designer's experience, appraisal and sensibility. It is not uncommon that web designers are people who have&amp;nbsp;large egos. On one hand, ego is useful because it implies self-confidence, pride and expertise, but on the other it is very damaging because it also implies arrogance and selfishness which is contrary to the nature of design. One of the statements by a web designer/developer I have heard recently, explains this in an explicit way:&lt;/p&gt;
&lt;blockquote&gt;There is a warning... if people don't bother to read it, it's not my problem. I made it red, should be spotted better now."&lt;/blockquote&gt;
&lt;p&gt;If it is not our problem then it becomes a problem of our users and that is bad design. Design should solve problems rather than create them.&lt;/p&gt;
&lt;p&gt;Also, the fact is that low barriers to entry allow large number of people to easily become web designers or developers which creates the impression that everyone can do it with minimum effort. One can relatively quickly gain solid Photoshop or HTML skills (and even master them), but that is not enough for a good design.&lt;/p&gt;
&lt;h2&gt;What's missing?&lt;/h2&gt;
&lt;p&gt;A good design requires knowledge of various design techniques, design principles, business requirements, technical constraints and the most important, understanding users, their problems, motifs and eventually goals. Understanding people (in this case users) to the extent that we can understand and share their emotions is empathy. That is an essential characteristic needed for a successful design, yet many web designers miss it. I would go even further and say that humility and overcoming your own ego are necessities. At least, it is necessary to create a balance between ego and empathy.&lt;/p&gt;
&lt;p&gt;In order to understand users we need to understand their needs and goals that are often hidden - the&amp;nbsp;user is not aware of them. It's designer's imperative to discover those goals. The best way to understand the users (and probably most popular among designers) is observation. By observing how people use products in their natural environments, a designer is able to get into other peoples' shoes and see what otherwise would be incomprehensible.&lt;/p&gt;
&lt;p&gt;Observation, careful listening and talking with people give us insights into a completely different perspective. Through analysis of data obtained by observation we are able to explore various solutions, develop prototypes and evaluate them through testing. This is the basis for User-centric design. And it all begins with&amp;nbsp;empathy.&lt;/p&gt;
&lt;p&gt;Fortunately, there are attempts to emphasize the importance of users and show that &lt;a href="http://designinformer.com/giving-users-some-credit/"&gt;users are not idiots&lt;/a&gt; but we need even more than that. Always keep in mind that we are advocates for the users &lt;a href="http://www.robotregime.com/index.php/articles/view/give_the_client_what_they_want/index.php#clientDemand"&gt;instead of being&amp;nbsp;advocates for the clients&lt;/a&gt;. Empathy comes after walking a mile in someone&amp;rsquo;s shoes. Get in those shoes.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=KXvUxcfMAtM:sC-_6HlzWMo:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=KXvUxcfMAtM:sC-_6HlzWMo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=KXvUxcfMAtM:sC-_6HlzWMo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=KXvUxcfMAtM:sC-_6HlzWMo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=KXvUxcfMAtM:sC-_6HlzWMo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=KXvUxcfMAtM:sC-_6HlzWMo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=KXvUxcfMAtM:sC-_6HlzWMo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/08/25/empathy-and-web-design.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/08/25/empathy-and-web-design.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=b7fa666a-3989-476b-b428-d1d20589b6da</guid>
      <pubDate>Wed, 25 Aug 2010 09:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=b7fa666a-3989-476b-b428-d1d20589b6da</pingback:target>
      <slash:comments>38</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=b7fa666a-3989-476b-b428-d1d20589b6da</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/08/25/empathy-and-web-design.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=b7fa666a-3989-476b-b428-d1d20589b6da</wfw:commentRss>
    </item>
    <item>
      <title>Rethinking form validation</title>
      <description>&lt;p&gt;We all know how important form validation is. Users &lt;em&gt;must &lt;/em&gt;provide required information, users &lt;em&gt;must &lt;/em&gt;provide information in specific format, user must... Right. But imagine the scenario in which user saves a form even if validation fails. That is, when inappropriate formats are provided or required fields are left blank. Sounds ridiculous? To kill validation? Well, no - we just might rethink the validation process.&lt;/p&gt;
&lt;p&gt;My team had a debate about this topic when we first read Alan Cooper's suggestions on data saving. We decided to try it in one of the projects. Developers hated it. Designers endorsed it. Users loved it. Let's see why.&lt;/p&gt;
&lt;h2&gt;How should this work?&lt;/h2&gt;
&lt;p&gt;Here's the scenario: user, who works in one of the bank branches, fills in the same forms every day. She deals with different forms, from simple to complex, such as leasing requests. If a customer doesn't provide all the information necessary to approve the leasing request, which happens often, she won't be able to submit the form and store it in central database. Sounds correct? Let's try again.&lt;/p&gt;
&lt;p&gt;User, who works in one of the bank branches, fills in the same forms every day. She deals with different forms, from simple to complex, such as leasing requests. If a customer doesn't provide all the information necessary to approve the leasing request, which happens often,&lt;strong&gt; she can enter whatever information she has at the moment and store it in the central database&lt;/strong&gt;. If some of the required fields are missing she is notified with inline validation that she needs to provide it later in order to process&amp;nbsp;the request. If she enters some information in the&amp;nbsp;wrong format she is also notified by inline validation that it should be corrected in order to process the request. But she saves the request. Incomplete, but she can save it.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f7%2fvalidate-later.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;User becomes more confident because &lt;strong&gt;she feels that she can't make a mistake&lt;/strong&gt;. No errors, no popups, no interruptions. She can easily save an incomplete leasing request and complete it later. When she opens the request again inline validation will show which "required" information is missing and what data is in the wrong format. Of course, the leasing request can't be processed without information that is absolutely needed for calculations, so it can be processed once the form is completed.&lt;/p&gt;
&lt;h2&gt;Is required really required?&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;I deliberately placed the term &lt;em&gt;required &lt;/em&gt;in quotation marks here, because required information isn't required in the way we perceive it. Information is required for successful leasing request approval but not for storing the same request in the database. Same applies to data format. So, think again why some information is required - to defend database integrity or to support users' goals.&lt;/p&gt;
&lt;h2&gt;Don't take this literally&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;This can't be applied to every single form. Of course, this makes sense mostly in so called &lt;a href="http://www.smashingmagazine.com/2010/02/25/designing-user-interfaces-for-business-web-applications/"&gt;enterprise web applications&lt;/a&gt;. For instance, it wouldn't make much sense to submit a comment on my blog without providing the comment and name. So I'm not suggesting that you should make &lt;a href="http://www.electricfairground.com/2009/11/20/the-worst-example-of-web-form-validation-ever/"&gt;the worst example of web form validation ever&lt;/a&gt;. You get the point.&lt;/p&gt;
&lt;p&gt;One thing is certain - this would be a headache for developers. Not only because they love to defend the&amp;nbsp;database in any possible way, but also because such approach would require much more work on their side. But more important is that there would be fewer headaches for users.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=9H9aW1WfkRE:GWHRyf9sLns:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=9H9aW1WfkRE:GWHRyf9sLns:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=9H9aW1WfkRE:GWHRyf9sLns:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=9H9aW1WfkRE:GWHRyf9sLns:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=9H9aW1WfkRE:GWHRyf9sLns:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=9H9aW1WfkRE:GWHRyf9sLns:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=9H9aW1WfkRE:GWHRyf9sLns:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/07/21/rethinking-form-validation.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/07/21/rethinking-form-validation.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=4ccd64e0-2cbd-469f-8e28-5553c05c1a64</guid>
      <pubDate>Wed, 21 Jul 2010 09:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=4ccd64e0-2cbd-469f-8e28-5553c05c1a64</pingback:target>
      <slash:comments>46</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=4ccd64e0-2cbd-469f-8e28-5553c05c1a64</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/07/21/rethinking-form-validation.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=4ccd64e0-2cbd-469f-8e28-5553c05c1a64</wfw:commentRss>
    </item>
    <item>
      <title>Issues with modal overlays on the web</title>
      <description>&lt;p&gt;Seems as if modal overlays are quite popular on the Web lately. A large number of easy to use plugins such as Lightbox, contributed to the expansion of overlays on the Web. Two years ago lightbox was named a &lt;a href="Interaction Design Technique of the Year"&gt;dialog design technique of the year&lt;/a&gt;. Since then, overlays became a common way to show forms, feedback and other content.&lt;/p&gt;
&lt;p&gt;But despite the fact that overlays are popular and easy to implement they should be used&amp;nbsp;carefully. It is not necessarily true that &lt;a title="Improving The User Experience Of Your Website  With Modal  Windows" href="http://spyrestudios.com/improving-the-user-experience-of-your-website-with-modal-windows/"&gt;modal windows improve user experience&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Issues&lt;/h2&gt;
&lt;p&gt;While modal overlay is visible, the page behind it (parent) is disabled and dimmed. This prevents users to interact with the parent and to refer to any information except that shown in overlay. If users need information in the background, this becomes a problem. Even worse, most overlays are not movable and cover the central part of the viewport. In such situations users are forced to switch back and forth between parent and overlay.&lt;/p&gt;
&lt;p&gt;The least you can do in such cases is to make sure that information in the background is readable and the overlay is movable. The latter means that you should take affordance into consideration. Many lightbox plugins don't have a titlebar - an area that suggests that element is moveable. It should also contain a close button, positioned consistently across the site or application, preferably in the top right corner.&lt;/p&gt;
&lt;p&gt;The other thing I noticed during usability testing sessions confirms what was said many times before - it might break back button functionality. Some users, mostly the ones that are not tech-savvy, just don't understand that they are on the same page. This is typically the case when overlay covers a large portion of the viewport.&lt;/p&gt;
&lt;p&gt;So, if you want to use an&amp;nbsp;overlay, what should you be paying attention to? Besides issues I mentioned in previous paragraphs, I'd include some of the recommendations stated in (a bit older) article &lt;a href="http://www.usabilitynews.com/news/article1673.asp"&gt;A Farewell to Pop-Ups&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The user expects new content, and expects that content to be a diversion from the current task rather than intrinsic to it.&lt;/li&gt;
&lt;li&gt;There is some advantage to the user in seeing the new content on screen at the same time as the existing content.&lt;/li&gt;
&lt;li&gt;The pop up size is between one quarter and one third of existing window size. (If the size is less than one quarter, then the content should be moved onto the main page. If the size is more than one third, then you break the rule of context).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I would add that modal overlays shouldn't be used to show feedback messages in any case - there are some misconceptions that overlays are actually an ideal tool for this. &lt;a href="http://www.lukew.com/ff/entry.asp?999"&gt;Among some other mistakes&lt;/a&gt;, this is a common mistake in web form design. As addition to this, you should avoid using overlays to simulate &lt;a href="http://ignorethecode.net/blog/2008/10/31/nobody-reads/"&gt;confirmation dialog boxes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Are there any alternatives?&lt;/h2&gt;
&lt;p&gt;Aza Raskin suggests &lt;a href="http://www.azarask.in/blog/post/designing-without-modal-overlays/"&gt;two alternative solutions&lt;/a&gt;: a tray and a slide (sidebar or sliding bar). Both solutions are quite good alternatives for overlays. One of my favorite variations of a sidebar - &lt;a href="http://www.jankoatwarpspeed.com/post/2009/06/01/Advanced-docking-using-jQuery.aspx"&gt;docking sidebar&lt;/a&gt; is very efficient because it allows immediate interaction without breaking the flow or covering the area users are working with. Developers and designers should be familiar with such sidebars, as they are heavily used in development environments.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f6%2foverlay-sidebar.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;But, does all of this mean that you shouldn't use overlays at all? Well, least you can do is&amp;nbsp;use them sparingly. What do you think?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=63_tTz8hYmI:4wKIQ-unMKY:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=63_tTz8hYmI:4wKIQ-unMKY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=63_tTz8hYmI:4wKIQ-unMKY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=63_tTz8hYmI:4wKIQ-unMKY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=63_tTz8hYmI:4wKIQ-unMKY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=63_tTz8hYmI:4wKIQ-unMKY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=63_tTz8hYmI:4wKIQ-unMKY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/06/17/modal-overlays.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/06/17/modal-overlays.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=ba4ba69d-d0d3-432d-bbd5-972e7cbdf8e8</guid>
      <pubDate>Thu, 17 Jun 2010 14:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=ba4ba69d-d0d3-432d-bbd5-972e7cbdf8e8</pingback:target>
      <slash:comments>26</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=ba4ba69d-d0d3-432d-bbd5-972e7cbdf8e8</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/06/17/modal-overlays.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=ba4ba69d-d0d3-432d-bbd5-972e7cbdf8e8</wfw:commentRss>
    </item>
    <item>
      <title>Autosave my work, please</title>
      <description>&lt;p&gt;I was in the middle of writing a long text in one online web application (made in Silverlight) when my FireFox crashed (Firefox is doing a great job in restoring your work, but in case of silverlight or desktop apps, you just can't count on your browser). I lost the most of what I wrote just because the Silverlight application didn't have one simple function - autosave. This functionality periodically saves user's work and thus &lt;strong&gt;prevents data loss, or at least minimizes it&lt;/strong&gt; - in case of software crash, only changes that are made after the last save will be lost. Although it seems as if it is quite simple function, there are some issues that need to be considered.&lt;/p&gt;
&lt;h2&gt;Frequency&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;Software crash doesn't have to be the only reason for data loss. Sometimes the internet connection breaks or user simply presses the wrong button - she closes Firefox window instead of one tab. This means that autosave should happen often enough to minimize the effect of unpredictable events. Alan Cooper suggests that, if possible, autosave should be performed &lt;strong&gt;after each keystroke&lt;/strong&gt; or, in other case, &lt;strong&gt;when user stops interacting with the interface&lt;/strong&gt;. When choosing autosave frequency one should always consider application performance and responsiveness, though.&lt;/p&gt;
&lt;h2&gt;Enable autosave by default&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;If an application implements autosave, &lt;strong&gt;it should be enabled by default.&lt;/strong&gt; If autosave isn't enabled, chances are that beginners and perpetual intermediaries will never discover it. I believe I fall into&amp;nbsp; intermediaries when it comes to &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt; and I didn't even know it has autosave. But it &lt;em&gt;has &lt;/em&gt;autosave functionality which is &lt;strong&gt;disabled &lt;/strong&gt;by default. And since it crashes quite often, it happens that I lose hours of work. Although I am trigger-happy when it comes to saving, I tend to be carried away with design work and simply forget to save.&lt;/p&gt;
&lt;h2&gt;Unobtrusiveness&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;Besides this,&lt;strong&gt; &lt;/strong&gt;autosave should be unobtrusive, which means that it should be &lt;strong&gt;performed in background without interrupting user's work&lt;/strong&gt;. Here's an example of how things can go wrong for users when autosave isn't unobtrusive. I was typing an extremely important email in my webmail client when suddenly a green message box appeared - the same message box which appears after email is successfully sent. I instantly started to look for cancel/discard action and pressed it once I found it. Only seconds after I realized that was an autosave message. But the draft was deleted and I was quite frustrated.&lt;/p&gt;
&lt;p&gt;Among many others, Google Docs is &lt;a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=6e040d5f9cdc3c71&amp;amp;hl=en"&gt;another example of obtrusiveness&lt;/a&gt; - after each autosave the cursor moves to the top of the text. I am sure this is a bug that will be solved but currently it is obviously more than annoying. Besides this bug, Google docs is a good example of how autosave should be done.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f6%2fautosave-google.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;When document isn't saved there is information about the last save and enabled &lt;em&gt;Save &lt;/em&gt;button next to it. After autosave the message changes and &lt;em&gt;Save &lt;/em&gt;button become disabled. Also, autosave is being performed after each keystroke which eliminates the need for "&lt;span lang="EN-GB"&gt;Do you want to save changes?&amp;rdquo; popups.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span lang="EN-GB"&gt;A problem&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span lang="EN-GB"&gt;However, autosave raises one important question - with each save, &lt;strong&gt;all previous versions of the same document become unavailable&lt;/strong&gt; (undo can sometimes be helpful but not enough). Autosave overwrites the same document over and over again. For instance, user might want to edit some template and just print it without saving it at any moment, but autosave might overwrite the template. Some applications use &lt;strong&gt;versioning &lt;/strong&gt;to fix this issue (by adding timestamp to a file name for example). Some, on the other hand, keeps the history of actions where each action refers to one of the previous document versions. But those solutions tends to be complicated and seems as if there's no definite solution to this problem. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN-GB"&gt;In any case, if you are not sure about autosave functionality, don't think anymore and implement it - and keep the common save functionality and unavoidable keyboard support.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=3ZTAK9cHMZc:3Ii_Il0ZLDA:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=3ZTAK9cHMZc:3Ii_Il0ZLDA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=3ZTAK9cHMZc:3Ii_Il0ZLDA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=3ZTAK9cHMZc:3Ii_Il0ZLDA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=3ZTAK9cHMZc:3Ii_Il0ZLDA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=3ZTAK9cHMZc:3Ii_Il0ZLDA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=3ZTAK9cHMZc:3Ii_Il0ZLDA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/06/02/Autosave.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/06/02/Autosave.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=29ddbe86-ae3b-42c9-b077-3e5b48ab3721</guid>
      <pubDate>Wed, 02 Jun 2010 00:10:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=29ddbe86-ae3b-42c9-b077-3e5b48ab3721</pingback:target>
      <slash:comments>50</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=29ddbe86-ae3b-42c9-b077-3e5b48ab3721</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/06/02/Autosave.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=29ddbe86-ae3b-42c9-b077-3e5b48ab3721</wfw:commentRss>
    </item>
    <item>
      <title>Why and how to create Microsoft Office Minibar with jQuery and CSS3</title>
      <description>&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f5%2fminibar.jpg" alt="" width="600" height="98" /&gt;&lt;/p&gt;
&lt;p&gt;Although many will argue that Microsoft products are an example of a good design, Minibar was one of design refreshments  that came out with the Office 2007. It is a variation of a toolbar that &lt;strong&gt;exposes context-related &lt;/strong&gt;&lt;strong&gt;functionality&lt;/strong&gt;. In case of MS Word, context is a text selection. Since Minibar always pops up near the mouse pointer it enables users to quickly perform actions related to a selection.&lt;/p&gt;
&lt;p&gt;&lt;a class="demo" href="http://www.jankoatwarpspeed.com/examples/minibar/"&gt;Check out demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So how it works? When user makes a selection in input field Minibar pops up, semi-transparent, above the selection. When user hovers the Minibar it fades out. It disappears when user clicks anywhere in the input field or performs an action by clicking on a Minibar button.&lt;/p&gt;
&lt;p&gt;Quite simple Minibar will be shown in this tutorial - it has only &lt;em&gt;bold&lt;/em&gt;, &lt;em&gt;underline&lt;/em&gt;, &lt;em&gt;italic&lt;/em&gt;, and &lt;em&gt;link &lt;/em&gt;buttons.&lt;/p&gt;
&lt;pre&gt;&amp;lt;textarea id="description" rows="8" cols="50"&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;div id="menu"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="#" id="bold"&amp;gt;b&amp;lt;/a&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="#" id="italic"&amp;gt;i&amp;lt;/a&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="#" id="underline"&amp;gt;u&amp;lt;/a&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="#" id="link"&amp;gt;Link&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;We need to make Minibar semi-transparent initially, and solid-color on hover.&lt;/p&gt;
&lt;pre&gt;#menu {padding:5px; background-color:#f5f5f5;&lt;br /&gt;       background-color:rgba(245, 245, 245, 0.6);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; display:none; position:absolute; top:0px; left:0px; overflow:hidden;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; border:solid 1px #929292; border-radius:3px; -moz-border-radius:3px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -webit-border-radius:3px; box-shadow: 5px 5px 5px #888;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -moz-box-shadow: 1px 1px 3px #555; -webkit-box-shadow: 5px 5px 5px #888;}
#menu:hover {background-color:rgba(245, 245, 245, 1);}&lt;/pre&gt;
&lt;h2&gt;Fade it in and out&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;To be able to control Minibar position we will need to track the mouse position and use &lt;em&gt;x&lt;/em&gt; an &lt;em&gt;y&lt;/em&gt; coordinate to set top and left properties of its container. To show Minibar&amp;nbsp;upon selection we will use &lt;em&gt;.select()&lt;/em&gt; event, where its container will be faded in at the specific location. We also need to handle &lt;em&gt;.mousedown()&lt;/em&gt; event in order to fade the Minibar out when user click somewhere else.&lt;/p&gt;
&lt;pre&gt;$(document).ready(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var mouseX = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var mouseY = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#description").mousemove(function(e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // track mouse position&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseX = e.pageX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseY = e.pageY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Fade out the menu on any click&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#description").mousedown(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#menu").fadeOut("1000");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#description").select(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get the mouse position an show the menu&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#menu").css("top", mouseY - 30)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .css("left", mouseX + 10).fadeIn("1000");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;});&lt;/pre&gt;
&lt;h2&gt;Handling clicks&lt;/h2&gt;
&lt;p&gt;Now when we know how to handle fading in and out, we can add some functionality. If we want to make a selection bold, we can wrap it with &lt;em&gt;&amp;lt;strong&amp;gt;&lt;/em&gt; and &lt;em&gt;&amp;lt;/strong&amp;gt;&lt;/em&gt; tags (of course, it can be done with &lt;em&gt;span &lt;/em&gt;element and some CSS but for the purpose of this tutorial I will wrap selection with tags).&lt;/p&gt;
&lt;pre&gt;function wrapText(startText, endText){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the text before the selection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var before = $("#description").val().substring(0, $("#description").caret().start);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the text after the selection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var after = $("#description").val().substring($("#description").caret().end, $("#description").val().length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // merge text before the selection, a selection wrapped with inserted text and a text after the selection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#description").val(before + startText + $("#description").caret().text + endText + after);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;This function, which relies on &lt;a href="http://jquery-plugin.buss.hk/my-plugins/jquery-caret-plugin"&gt;jCaret plugin&lt;/a&gt; wraps the selection with tags and merge it with text before and after the selection. Quite simple, when you have useful plugin such as jCaret. We only need to handle click events for each Minibar button.&lt;/p&gt;
&lt;pre&gt;$("#bold").click(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wrapText("&amp;lt;strong&amp;gt;", "&amp;lt;/strong&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#menu").fadeOut("1000");&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$("#italic").click(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wrapText("&amp;lt;em&amp;gt;", "&amp;lt;/em&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#menu").fadeOut("1000");&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$("#underline").click(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wrapText("&amp;lt;u&amp;gt;", "&amp;lt;/u&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#menu").fadeOut("1000");&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$("#link").click(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url = prompt("Enter URL", "http://");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (url != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wrapText("&amp;lt;a href='" + url + "'&amp;gt;", "&amp;lt;/a&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#menu").fadeOut("1000");&lt;br /&gt;});&lt;/pre&gt;
&lt;p&gt;Handling click events for bold, italic and underline actions is more than simple. We just call wrapText() function, pass it appropriate start and end tags and fade Minibar out. Handling click for &lt;em&gt;link &lt;/em&gt;button is a bit different - we first need to prompt users to enter URL and then pass the URL inside opening tag.&lt;/p&gt;
&lt;p&gt;&lt;a class="demo" href="http://www.jankoatwarpspeed.com/examples/minibar/"&gt;Check out demo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As a regular Word user I am so used to this small toolbar and I am missing it on the web. I would really like to see it as a feature in WYSIWYG editors such as TinyMCE. It can also be a part of comment/contact forms. In order to play around with it more I will add it to my comment form as a part of the current blog realign.&lt;/p&gt;
&lt;p&gt;Although it works in all major browsers, the code is everything but perfect - it can be optimized and more features can be seen here. Feel free to play with it and if you find any bug, please drop me a line.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=YJX7-YfJVAM:Ln17zlOPZvg:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=YJX7-YfJVAM:Ln17zlOPZvg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=YJX7-YfJVAM:Ln17zlOPZvg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=YJX7-YfJVAM:Ln17zlOPZvg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=YJX7-YfJVAM:Ln17zlOPZvg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=YJX7-YfJVAM:Ln17zlOPZvg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=YJX7-YfJVAM:Ln17zlOPZvg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/05/23/microsoft-office-minibar-jQuery-CSS3.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/05/23/microsoft-office-minibar-jQuery-CSS3.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=19179625-dd34-442d-b759-34c4eac1b03b</guid>
      <pubDate>Sun, 23 May 2010 21:00:00 +0100</pubDate>
      <category>Tutorials</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=19179625-dd34-442d-b759-34c4eac1b03b</pingback:target>
      <slash:comments>55</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=19179625-dd34-442d-b759-34c4eac1b03b</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/05/23/microsoft-office-minibar-jQuery-CSS3.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=19179625-dd34-442d-b759-34c4eac1b03b</wfw:commentRss>
    </item>
    <item>
      <title>Poka-Yoke in UI design</title>
      <description>&lt;p&gt;As I mentioned before &lt;a href="http://www.jankoatwarpspeed.com/post/2009/11/17/Forgiveness-UI-design.aspx"&gt;forgiveness&lt;/a&gt; is very important principle in UI design. But error prevention is even  more important - &lt;strong&gt;whenever possible try to prevent an error instead of  recovering from it&lt;/strong&gt;. Preventing an error to happen is known as &lt;a href="http://en.wikipedia.org/wiki/Poka-yoke"&gt;Poka-Yoke principle&lt;/a&gt;. The first time I heard of it was in the book &lt;em&gt;Designing for Interaction&lt;/em&gt; by Dan Saffer, but it is just another term for "fail-safe".&lt;/p&gt;
&lt;p&gt;The purpose of  Poka-Yoke is, according to Wikipedia "to eliminate product defects by  preventing, correcting,  or drawing attention to human errors as they  occur. The concept was formalized, and the term adopted, by Shigeo   Shingo as part of the Toyota Production System. It was originally  described as &lt;em&gt;baka-yoke&lt;/em&gt;,  but as this means "fool-proofing" (or  "idiot-proofing")  the name was changed to the milder &lt;em&gt;poka-yoke&lt;/em&gt;."&lt;/p&gt;
&lt;p&gt;If you search for Poka-Yoke you will find some nice examples such as 3.5" floppy disks, where the shape of disks prevents people from inserting them improperly. But Poka-Yoke can be used in user interface design as well. Applying it to UI design means to prevent an error using constraints and correction, and to warn/inform users about the reasons for prevention.&lt;/p&gt;
&lt;h2&gt;Prevent actions and disable elements&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;Naturally, forms are ideal for applying Poka-Yoke. Its most obvious usage is preventing an action to begin until all of the conditions necessary to perform that action are met. For instance, don't allow form submission until all required fields are filled in. Disable &lt;em&gt;submit &lt;/em&gt;button if input field is empty. Disable &lt;em&gt;Delete all&lt;/em&gt; link if less than two items in the list are selected. Examples are numerous.&lt;/p&gt;
&lt;p&gt;I'd recommend you to read (a bit old but good) discussion on ixda.org &lt;a href="http://www.ixda.org/node/17364"&gt;Hiding and Disabling Menu Items&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Restrict user's input&lt;/h2&gt;
&lt;p&gt;You can restrict user's input in many ways - allow only numeric characters, disallow special characters, limit user's input to a specific range or limit the size of user's input. This is usually done by rejecting user's input if invalid characters are detected. You should always make clear to the user why rejection happened (e.g. "You can enter only numbers"). Plugins like &lt;a href="http://www.itgroup.com.ph/alphanumeric/"&gt;alphanumeric&lt;/a&gt; can be a good choice here.&lt;/p&gt;
&lt;h2&gt;Mask user's input&lt;/h2&gt;
&lt;p&gt;Similar to previous technique, masking forces users to enter information in a specific format. It is a good practice to &lt;a href="http://www.lukew.com/ff/entry.asp?756"&gt;reveal mask in input field upfront&lt;/a&gt; and make it clear to the user which format is allowed. The problem with masking is that help text is not always clear enough - would users know what "~9.99 ~9,999.99" means? In case when masking pattern is not easily understandable, it is better to show users an example of usage.&lt;/p&gt;
&lt;h2&gt;Correct user's input&lt;/h2&gt;
&lt;p&gt;In some cases, the application will be able to correct the user's input automatically without interrupting her/him. For instance, the application can automatically add "http://" to an URL if user omitted it. Another example is when user enters a value that is larger than maximum allowed. In this case the application can replace the user's input with maximum allowed value while letting the user accept it or change to another value.&lt;/p&gt;
&lt;h2&gt;Other helpful techniques&lt;br /&gt;&lt;/h2&gt;
&lt;h3&gt;Use defaults&lt;/h3&gt;
&lt;p&gt;In some cases defaults can help further in error prevention. If user wants to book a  flight and have to choose a number of passengers, you can set 1 as default (instead of leaving this field empty which will  trigger validation later). Another good example I can think of is my android-based mobile phone. Each time user starts a new SMS message, upper-case button is turned on. When user types the first letter it turns off.&lt;/p&gt;
&lt;h3&gt;Use appropriate controls&lt;/h3&gt;
&lt;p&gt;Another good way to provide fail safe is to use specialized controls.  Instead of using input fields for dates, use date picker controls and  disable associated input fields.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Those were just some of the examples of how to apply Poka-Yoke in user interface design. The important thing to remember is that whenever an error is detected, make sure you provide a clear explanation of why the process is stopped.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ABShumWhckU:3f3vACH6C4M:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ABShumWhckU:3f3vACH6C4M:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ABShumWhckU:3f3vACH6C4M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=ABShumWhckU:3f3vACH6C4M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ABShumWhckU:3f3vACH6C4M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=ABShumWhckU:3f3vACH6C4M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ABShumWhckU:3f3vACH6C4M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/05/10/Poka-Yoke-in-UI-design.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/05/10/Poka-Yoke-in-UI-design.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=de8a9a01-211c-4ebe-bf12-aa8d8772928c</guid>
      <pubDate>Mon, 10 May 2010 21:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=de8a9a01-211c-4ebe-bf12-aa8d8772928c</pingback:target>
      <slash:comments>12</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=de8a9a01-211c-4ebe-bf12-aa8d8772928c</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/05/10/Poka-Yoke-in-UI-design.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=de8a9a01-211c-4ebe-bf12-aa8d8772928c</wfw:commentRss>
    </item>
    <item>
      <title>On design process</title>
      <description>&lt;p&gt;After publishing the article &lt;a href="http://www.jankoatwarpspeed.com/post/2010/02/16/redesigning-jankoatwarpspeed.aspx"&gt;Redesign process of JankoAtWarpSpeed&lt;/a&gt;, I was criticized by some people that I used Scrum "improperly". This related to uneven iterations, non adequate documentation and the fact that I was alone in the project. All of these claims are accurate. But I didn't use Scrum. It was rather an iterative design combined with some Scrum techniques and artifacts. Honestly, &lt;strong&gt;I  don't believe that &lt;span style="text-decoration: line-through;"&gt;there is a proper way to use a process and&lt;/span&gt; that one process&lt;/strong&gt;&lt;strong&gt; (or, more formal - a methodology) &lt;/strong&gt;&lt;strong&gt; can be used in all situations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So what I did was that I chose techniques that were appropriate for that project. Iterations allowed me to have testable prototypes and feedbacks, despite the fact that they didn't last for 2-4 weeks as it is defined by Scrum. Lightweight documentation (such as user stories) helped me save time and  stay focused. Product backlog was a nice tool to keep the project under control since I was able to work only when I had some free time.&lt;/p&gt;
&lt;p&gt;Formal methodology or process in this case would probably contribute to a never ending project. Although this was a personal project, this can be applied to any project you normally do for your customers. Each one is different and carries its own constraints and uncertainty. Sometimes the problem is tight deadline. Sometimes it's resources. And sometimes it could be the scope. Therefore designers should be able to &lt;strong&gt;adapt their processes to circumstances&lt;/strong&gt; on each particular project.&lt;/p&gt;
&lt;p&gt;The problem is present in large teams also. Teams often have their own processes or apply some of known methodologies, and they stick to them regardless of circumstances (of course, some practice only ad-hoc approach which is nonsense on its own). It is not rare that teams adopt a process after successful completion of a project. This becomes their one-size-fits-all processes. It is also not rare to see that methodology turns into a pure bureaucracy. Seems as if some companies adore ginormous, heavyweight methodologies.&lt;/p&gt;
&lt;p&gt;If we say that a process is a set of steps and rules that we take to accomplish our goals, it becomes clear that these steps can't be used always and in every situation. Following steps of some process really doesn't guarantee success. It only guarantees that you will follow the steps. And, very likely, not repeating previous success using the same steps.&lt;/p&gt;
&lt;p&gt;In his speech from 2008, &lt;a href="http://www.uie.com/brainsparks/2008/04/23/ia-summit-keynote-journey-to-the-center-of-design/"&gt;Journey to the center of design&lt;/a&gt; Jared Spool compares process with methodology and eventually a dogma. But he also emphasizes the importance of tricks and techniques, or toolbox of each team member. The success of efficient teams (and individuals) is in knowing the &lt;strong&gt;wide range of techniques&lt;/strong&gt; that can be used in different situations.&lt;/p&gt;
&lt;p&gt;For the end I would quote Joshua Porter (taken from the article &lt;a title="permanent link to this post" rel="bookmark" href="http://52weeksofux.com/post/531355908/the-process-police"&gt;The Process Police&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote&gt;No process guarantees success. If there were a process that guaranteed  happy users everyone would be using it. But design doesn&amp;rsquo;t work like  that: it&amp;rsquo;s iterative, responsive, ever-changing. You have to &lt;em&gt;react&lt;/em&gt; as much as &lt;em&gt;plan&lt;/em&gt;. You have to change your process on the fly to  react to the marketplace. That&amp;rsquo;s why we need to optimize for what&amp;rsquo;s  most important, a happy user, and do whatever it takes to make it  happen, process be damned.&lt;/blockquote&gt;
&lt;p&gt;My dear Scrum fanatics, &lt;strong&gt;Scrum is not always the answer&lt;/strong&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=A0b1SKZbWUw:PT6roiBeutg:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=A0b1SKZbWUw:PT6roiBeutg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=A0b1SKZbWUw:PT6roiBeutg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=A0b1SKZbWUw:PT6roiBeutg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=A0b1SKZbWUw:PT6roiBeutg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=A0b1SKZbWUw:PT6roiBeutg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=A0b1SKZbWUw:PT6roiBeutg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/05/04/On-design-process.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/05/04/On-design-process.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=90742497-8d62-48b0-bb5e-23c43910eb21</guid>
      <pubDate>Tue, 04 May 2010 09:00:00 +0100</pubDate>
      <category>Process &amp; practice</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=90742497-8d62-48b0-bb5e-23c43910eb21</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=90742497-8d62-48b0-bb5e-23c43910eb21</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/05/04/On-design-process.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=90742497-8d62-48b0-bb5e-23c43910eb21</wfw:commentRss>
    </item>
    <item>
      <title>Create Windows 7 start menu using CSS3 only</title>
      <description>&lt;p&gt;I am fascinated with how much you can do with so little using CSS3. Many user interface elements that require images in order to have appropriate visual appearance now can be styled only with CSS3. In order to prove that I assigned myself a task to create Windows 7 start menu only with CSS3 (and some icons).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f4%2fwin7startmenu.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;If we decompose the menu we'll get one div, two unordered lists with a  couple of links each and a few icons. Let's see how each  one of those  is styled. &lt;/p&gt;
&lt;p&gt;&lt;a class="demo" href="http://www.jankoatwarpspeed.com/examples/windows7menu/"&gt;Check out the demo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Container&lt;/h2&gt;
&lt;p&gt;The container named &lt;em&gt;startmenu &lt;/em&gt;holds two unordered lists that act as menus. It has linear gradient with three color stops: light blue at the top, dark blue in the middle, and another shade of light blue at the bottom. Transparency is achieved using &lt;em&gt;rgba()&lt;/em&gt; which has four parameters. The first three represent red, green and blue color values and the last one is opacity. Two borders are created with &lt;em&gt;border &lt;/em&gt;and &lt;em&gt;box-shadow&lt;/em&gt; properties.&lt;/p&gt;
&lt;pre&gt;#startmenu { border:solid 1px #102a3e; overflow:visible; display:inline-block; margin:60px 0 0 20px;&lt;br /&gt;             -moz-border-radius:5px;-webkit-border-radius:5px; position:relative;&lt;br /&gt;             box-shadow: inset 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;&lt;br /&gt;             background-color:#619bb9;&lt;br /&gt;             background: -moz-linear-gradient(top, rgba(50, 123, 165, 0.75), rgba(46, 75, 90, 0.75) 50%, rgba(92, 176, 220, 0.75));&lt;br /&gt;             background: -webkit-gradient(linear, center top, center bottom, from(#327aa4),color-stop(45%, #2e4b5a), to(#5cb0dc)); }&lt;br /&gt;&lt;/pre&gt;
&lt;h2&gt;Programs menu&lt;/h2&gt;
&lt;p&gt;This unordered list has white background and two borders created with &lt;em&gt;border &lt;/em&gt;and&lt;em&gt; box-shadow&lt;/em&gt; properties. Its links, which contain icons and program names, uses gradients and box shadows in &lt;em&gt;hover &lt;/em&gt;state.&lt;/p&gt;
&lt;pre&gt;#programs, #links {float:left; display:block; padding:0; list-style:none;}&lt;br /&gt;#programs { background:#fff; border:solid 1px #365167; margin:7px 0 7px 7px;&lt;br /&gt;            box-shadow: 0 0 1px #fff; -moz-box-shadow: 0 0 1px #fff; -webkit-box-shadow: 0 0 1px #fff;&lt;br /&gt;            -moz-border-radius:3px;-webkit-border-radius:3px;}&lt;br /&gt;#programs a { border:solid 1px transparent; display:block; padding:3px; margin:3px; &lt;br /&gt;              color:#4b4b4b; text-decoration:none; min-width:220px;}&lt;br /&gt;#programs a:hover {border:solid 1px #7da2ce; &lt;br /&gt;             -moz-border-radius:3px; -webkit-border-radius:3px;&lt;br /&gt;             box-shadow: inset 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;&lt;br /&gt;             background-color:#cfe3fd;&lt;br /&gt;             background: -moz-linear-gradient(top, #dcebfd, #c2dcfd);&lt;br /&gt;             background: -webkit-gradient(linear, center top, center bottom, from(#dcebfd), to(#c2dcfd));}&lt;br /&gt;#programs a img {border:0; vertical-align:middle; margin:0 5px 0 0;}             &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;h2&gt;Links menu&lt;/h2&gt;
&lt;p&gt;As in the previous case, links menu is quite simple. But the interesting part comes in &lt;em&gt;hover &lt;/em&gt;state. Each link has horizontal gradient with three stops: dark blue on the left and right side, and a bit lighter blue in the middle. Now, unlike &lt;em&gt;programs menu&lt;/em&gt; links, here, every links has inner &amp;lt;span&amp;gt; element which contains text. This span element has one more gradient - vertical linear gradient. It is transparent in the upper half and the lower part goes from very dark blue to almost transparent light blue. The combination of two transparent gradients gives exactly the same look as buttons in Windows 7 link menu.&lt;/p&gt;
&lt;pre&gt;#links {margin:7px; margin-top:-30px;}&lt;br /&gt;#links li.icon {text-align:center;}&lt;br /&gt;#links a {border:solid 1px transparent; display:block; margin:5px 0; position:relative;&lt;br /&gt;              color:#fff; text-decoration:none; min-width:120px;}&lt;br /&gt;#links a:hover {border:solid 1px #000;&lt;br /&gt;             -moz-border-radius:3px; -webkit-border-radius:3px;&lt;br /&gt;             box-shadow: 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;&lt;br /&gt;             background-color:#658da0;&lt;br /&gt;             background: -moz-linear-gradient(center left, rgba(81,115,132,0.55), rgba(121,163,184,0.55) 50%, rgba(81,115,132,0.55));&lt;br /&gt;             background: -webkit-gradient(linear, 0% 100%, 100% 100%, from(#517384), color-stop(50%, #79a3b8), to(#517384)); &lt;br /&gt;             }&lt;br /&gt;#links a span { padding:5px; display:block; }&lt;br /&gt;#links a:hover span  { background: -moz-linear-gradient(center top, transparent, transparent 49%, rgba(2,37,58,0.5) 50%, rgba(63,111,135,0.5));&lt;br /&gt;            background: -webkit-gradient(linear, center top, center bottom, from(transparent), color-stop(49%, transparent), &lt;br /&gt;            color-stop(50%, rgba(2,37,58,0.5)), to(rgba(63,111,135,0.5))); }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Here is the preview, but I suggest you to &lt;a href="http://www.jankoatwarpspeed.com/examples/windows7menu/"&gt;check out the demo&lt;/a&gt;. You can play with backgrounds and see how transparency works.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f4%2fwin7preview.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The code works fine in Firefox 3.6+, Safari and Chrome. It degrades gracefully in Opera and IE. I guess I could optimize it a bit so if you have any suggestions please let me know.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ZTNe-hVJugU:V9lr-cqnKwQ:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ZTNe-hVJugU:V9lr-cqnKwQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ZTNe-hVJugU:V9lr-cqnKwQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=ZTNe-hVJugU:V9lr-cqnKwQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ZTNe-hVJugU:V9lr-cqnKwQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=ZTNe-hVJugU:V9lr-cqnKwQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ZTNe-hVJugU:V9lr-cqnKwQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/04/06/windows-7-start-menu-css3.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/04/06/windows-7-start-menu-css3.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=b411d865-80f3-4c89-b662-2bdd1f71a573</guid>
      <pubDate>Tue, 06 Apr 2010 23:00:00 +0100</pubDate>
      <category>Tutorials</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=b411d865-80f3-4c89-b662-2bdd1f71a573</pingback:target>
      <slash:comments>73</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=b411d865-80f3-4c89-b662-2bdd1f71a573</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/04/06/windows-7-start-menu-css3.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=b411d865-80f3-4c89-b662-2bdd1f71a573</wfw:commentRss>
    </item>
    <item>
      <title>Creating a software product - are you doing it wrong?</title>
      <description>&lt;p&gt;The goal of software, be it web, mobile or desktop applications, is to help achieve business goals.&amp;nbsp;However, without achieving&amp;nbsp;people's goals,&amp;nbsp;and with that the ones of&amp;nbsp;software users, it is very unlikely that the business will achieve its own goals.&amp;nbsp;This is why &lt;strong&gt;software projects should start with design, not programming&lt;/strong&gt;. User centric design, that is, where accent is on understanding users and especially their activities.&amp;nbsp;Not to diminish the value of other aspects, the quality of user experience is&amp;nbsp;the most important.&lt;/p&gt;
&lt;p&gt;You would think this is obvious? Absolutely not.&amp;nbsp;The fact is that a large number of software projects neglect design completely and this inevitably brings about bad user experience. After posting &lt;a href="http://www.smashingmagazine.com/2010/02/25/designing-user-interfaces-for-business-web-applications/"&gt;Designing User Interfaces For Business Web Applications&lt;/a&gt; on&amp;nbsp;Smashing Magazine and a large number of comments and e-mails that followed, I realised that problems I faced&amp;nbsp;are still there and little is done to understand them and&amp;nbsp;solve them.&amp;nbsp;And, what are these problems?&lt;/p&gt;
&lt;p&gt;The first problem is competency and responsibility. Most companies don't have a person in charge of making design decisions. That's what&amp;nbsp;Bill Buxton calls Chief Design Officer (CDO) in his book&amp;nbsp;Sketching User Experiences. Instead of having a person who'll make decisions and understand why they were made and what the consequences are, design is often everybody's and nobody's responsibility.&lt;/p&gt;
&lt;p&gt;The next problem follows on to the first, and this is the&amp;nbsp;work process. Although it is very ungrateful to generalise things, we could say that the process of developing a typical software project is oriented almost entirely at its functionality. By this I mean implementing business requirements.&amp;nbsp;The problem is that&amp;nbsp;business requirements describe only what and how the system should do (business rules), leaving out the fact that software will be used by people.&lt;/p&gt;
&lt;p&gt;The process looks something like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Project starts by gathering requirements and writing a specification&lt;/li&gt;
&lt;li&gt;Based on this, resources are planned and estimates given&lt;/li&gt;
&lt;li&gt;Further decomposition happens to get from abstract to necessary implementation documentation&lt;/li&gt;
&lt;li&gt;Backend and frontend are implemented&lt;/li&gt;
&lt;li&gt;Designer is found to create a "theme" for the application (when I hear something like this my left eye starts to twitch)&lt;/li&gt;
&lt;li&gt;Software is delivered (with a huge delay)&lt;/li&gt;
&lt;li&gt;Users start using the software, after which starts a series of usability issues, complaints and a lot of work for support staff&lt;/li&gt;
&lt;li&gt;After a while, it turns out that only&amp;nbsp;20% of delivered software is being used and sometimes it's not even used at all.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Although I've caricatured a little, you get the point. Many of us have taken part in this type of projects. Where are the users? Where is the interaction with people? Software is used by&amp;nbsp;users and not analysts, project managers, or developers. Most project stakeholders create&amp;nbsp;the software to suit their own needs i.e. for themselves. Most developers, for instance, just don't have the knowledge necessary to design&amp;nbsp;a UI for  humans. Just because it makes technical sense, it doesn't mean that it will help user experience.&amp;nbsp;The technology is there to help people and not to make them its slaves.&lt;/p&gt;
&lt;p&gt;To avoid these catastrophic scenarios, it's necessary to change the whole idea of software development, root and branch. So, instead of creating a "clean, professional and good looking theme" for a completed software it is necessary to design the behaviour of user inteface before the software is created. This includes various aspects of design, from determining the scope to interaction and interface design. Thus, decisions on user interface should affect the behaviour of the system and not vice&amp;nbsp;versa. Technical contraints and business rules permitting,&amp;nbsp;UI behaviour should not be stipulated by system backend implementation.&lt;/p&gt;
&lt;p&gt;As&amp;nbsp;Jessy James Garett says in his book&amp;nbsp;The elements of user experience:&lt;/p&gt;
&lt;blockquote&gt;Everything user experiences should be the result of a conscious decision on your part. Realistically, you might have to make a compromise here and there because of the time or expense involved in creating a better solution. But a user centric design process ensures that those compromises don't happen by accident. ... It can be easy to fall into the trap of thinking that we are designing  our site for one idealized user - someone exactly like us. But we aren't  designing for ourselves; we're designing for other people, and if those  other people are going to like and use what we create, we need to  understand who they are and what they need.&lt;/blockquote&gt;
&lt;p&gt;This is certainly easier said than done, because as I&amp;nbsp;have already said in the SM article - a good software product takes harmonization between needs and goals of both the business and the&amp;nbsp;users. To achieve this you need to harmonize management, design and development. Otherwise, we come to a situation where everybody is frustrated, from developers and managers to clients and users.&lt;/p&gt;
&lt;p&gt;Since this subject is somewhat neglected, I'd like to hear your experiences and opinions.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=8RXuGpTZgmk:aODGMaLgAaA:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=8RXuGpTZgmk:aODGMaLgAaA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=8RXuGpTZgmk:aODGMaLgAaA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=8RXuGpTZgmk:aODGMaLgAaA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=8RXuGpTZgmk:aODGMaLgAaA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=8RXuGpTZgmk:aODGMaLgAaA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=8RXuGpTZgmk:aODGMaLgAaA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/04/04/software-product-doing-it-wrong.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/04/04/software-product-doing-it-wrong.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=0b26fb0e-fda9-4f8d-8438-c3380c8054f3</guid>
      <pubDate>Sun, 04 Apr 2010 23:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=0b26fb0e-fda9-4f8d-8438-c3380c8054f3</pingback:target>
      <slash:comments>37</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=0b26fb0e-fda9-4f8d-8438-c3380c8054f3</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/04/04/software-product-doing-it-wrong.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=0b26fb0e-fda9-4f8d-8438-c3380c8054f3</wfw:commentRss>
    </item>
    <item>
      <title>The real value of undo</title>
      <description>&lt;p&gt;The true value of undo lies not only in the ability to correct mistakes but also in encouraging exploration and learning which affects confidence in work. It is especially important that Web interfaces be &lt;a href="http://www.jankoatwarpspeed.com/post/2009/11/17/Forgiveness-UI-design.aspx"&gt;forgiving&lt;/a&gt; and allow the users to get confidence since they mostly don't have it.&lt;/p&gt;
&lt;p&gt;Although this topic was discussed earlier, a recent debate with colleagues lead me to once again, briefly, point out the importance of undo feature. Back in 2007, A List Apart published &lt;a href="http://www.alistapart.com/articles/neveruseawarning/"&gt;Never Use a Warning When you Mean&amp;nbsp;Undo&lt;/a&gt;, and we are still not there yet. It is a shame that in 2010 this feature is almost ignored on the Web. The problem is that designers overlook the possibility to undo things on Web. Except for a few examples, all you can have are confirmation dialogs. Forgiving, but not enough.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Users make easy decisions and perform fast actions when they know they are correctable. They are confident in using such systems. For instance, they easily add a product&amp;nbsp;to shopping cart but they are not even closely confident when placing the order.&lt;/p&gt;
&lt;p&gt;In his book &lt;em&gt;The Laws of Simplicity&lt;/em&gt;, John Maeda writes about undoable purchases:&lt;/p&gt;
&lt;blockquote&gt;Knowing that a purchase is correctable later makes the shopping process simpler because you know that any decision made is not final. Indeed, today's customers don't expect to be held accountable for their purchase. Eager to build consumer trust in their brands, companies are willing to assume the extra risk inherent in a returnable purchase. The losses incurred by the cost of returned goods are outweighed by the gains in customer trust. That is the power of undo.&lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;So let's not forget that undo (and forgiveness in general) is much more than possibility to correct an error. It's much more than Ctrl-Z.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=O0JRuB56wzg:UZ9lNfXgLdo:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=O0JRuB56wzg:UZ9lNfXgLdo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=O0JRuB56wzg:UZ9lNfXgLdo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=O0JRuB56wzg:UZ9lNfXgLdo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=O0JRuB56wzg:UZ9lNfXgLdo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=O0JRuB56wzg:UZ9lNfXgLdo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=O0JRuB56wzg:UZ9lNfXgLdo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/03/16/value-of-undo.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/03/16/value-of-undo.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=94f32078-994e-4058-b5e4-3ce8ef20e4b8</guid>
      <pubDate>Tue, 16 Mar 2010 23:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=94f32078-994e-4058-b5e4-3ce8ef20e4b8</pingback:target>
      <slash:comments>36</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=94f32078-994e-4058-b5e4-3ce8ef20e4b8</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/03/16/value-of-undo.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=94f32078-994e-4058-b5e4-3ce8ef20e4b8</wfw:commentRss>
    </item>
    <item>
      <title>Win a free license for FlairBuilder, wireframing and prototyping tool</title>
      <description>&lt;p&gt;The importance of &lt;strong&gt;wireframing and prototyping&lt;/strong&gt; in designing process is more than significant. These tools enable you to explore different ideas and test them before proceeding with next stages in the process. &lt;a href="http://www.flairbuilder.com/"&gt;FlairBuilder&lt;/a&gt;, a tool for wireframing and prototyping can ease the job of creating interactive, testable prototypes. You have the chance to win a free license of FlairBuilder, thanks to its creator, Cristian Pascu.&lt;/p&gt;
&lt;p style="color: #f00;"&gt;Important note: the giveaway is closed.&lt;/p&gt;
&lt;h2&gt;A quick introduction to the tool&lt;/h2&gt;
&lt;p&gt;It is a prototyping tool that helps you create interactive and testable wireframes and prototypes with ease. With more than 50 available elements you will have more than needed to easily create wireframes. But the real power of FlairBuilder is in interactivity. You can define custom events for some of the elements and quickly create interactive, testable prototype.&lt;/p&gt;
&lt;p&gt;Creating a project structure is very easy which will enable you to stay organized even with very complex prototypes. You can easily change between sketch and line art mode at any point of time which give you the ability to emphasize the fidelity of wireframes. Once you are finished, you can just switch to preview mode and test your prototypes. No compilation, no browsers.&lt;/p&gt;
&lt;p&gt;I recommend you the check out &lt;a href="http://www.flairbuilder.com/features/coming-soon-roadmap/"&gt;coming soon&lt;/a&gt; page and see some nice features that will make this tool even more powerful in the future.&lt;/p&gt;
&lt;p&gt;There is more to say about FlairBuilder but I will suggest you to &lt;a href="http://www.flairbuilder.com/home/install/"&gt;download the trial version&lt;/a&gt; and explore its &lt;a href="http://www.flairbuilder.com/features/"&gt;features&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The contest and how to participate&lt;/h2&gt;
&lt;p&gt;I am giving away &lt;strong&gt;two licenses for FlairBuilder&lt;/strong&gt; to readers who leave the comment at the end of this post and share their experiences with wireframing and prototyping. If you don't have any experience, that is just fine - it is the right time to learn about it. You can also &lt;a href="http://twitter.com/home?status=Win%20a%20free%20license%20for%20FlairBuilder%2C%20wireframing%20and%20prototyping%20tool%20(via%20%40jankowarpspeed)%20http%3A%2F%2Fbit.ly%2F9EF4iy"&gt;tweet about this contest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two winners will be selected randomly with help from random.org and announced on &lt;strong&gt;Monday, March 8th 2010 12:00PM (GMT +1)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good luck!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: The winners are&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jankoatwarpspeed.com/post/2010/03/05/flairbuilder-wireframing-prototyping-contest.aspx#id_054d4781-f757-446c-99b9-9f42c2cd81fc"&gt;&lt;span class="url fn"&gt;Henrik Stenb&amp;aelig;k&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jankoatwarpspeed.com/post/2010/03/05/flairbuilder-wireframing-prototyping-contest.aspx#id_79d61f63-89ef-4017-8401-e73bd21e6c56"&gt;Dino Rastoder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Congratulations to the winners, and I hope we will hear their impressions soon :) Thanks everyone for participating and leaving valuale comments. It was really great to see different stories regarding wireframing and prototyping process.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=48J8kn-FYaQ:RAgTFnVZ3kA:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=48J8kn-FYaQ:RAgTFnVZ3kA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=48J8kn-FYaQ:RAgTFnVZ3kA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=48J8kn-FYaQ:RAgTFnVZ3kA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=48J8kn-FYaQ:RAgTFnVZ3kA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=48J8kn-FYaQ:RAgTFnVZ3kA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=48J8kn-FYaQ:RAgTFnVZ3kA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/03/05/flairbuilder-wireframing-prototyping-contest.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/03/05/flairbuilder-wireframing-prototyping-contest.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=920964a9-8bde-46b7-bdc5-f7f84027b935</guid>
      <pubDate>Fri, 05 Mar 2010 21:18:00 +0100</pubDate>
      <category>Internet</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=920964a9-8bde-46b7-bdc5-f7f84027b935</pingback:target>
      <slash:comments>67</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=920964a9-8bde-46b7-bdc5-f7f84027b935</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/03/05/flairbuilder-wireframing-prototyping-contest.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=920964a9-8bde-46b7-bdc5-f7f84027b935</wfw:commentRss>
    </item>
    <item>
      <title>Ultimate guide to table UI patterns</title>
      <description>&lt;p&gt;Many agree that &lt;a href="http://uipatternfactory.com/p=data-table/"&gt;tables&lt;/a&gt; are a phenomenon in user interface design: they are very important parts of user interfaces but often overlooked. Tables show structured data and their purpose is to make that data readable, scannable and easily comparable. The thing is that in many cases tabular data is obscured. This is why tables have &lt;strong&gt;bad reputation&lt;/strong&gt; and many find them boring.&lt;/p&gt;
&lt;p&gt;The truth is that the are everything but boring. For people who need tables in everyday work they are hated element that makes them scream. And it shouldn't be this way. Here are some of the patterns that can help in creating less evil tables.&lt;/p&gt;
&lt;h2&gt;Alternating rows styling&lt;/h2&gt;
&lt;p&gt;Ok, this one is pretty obvious. But is it? Take a look at the web applications (and websites) today and you will see that many don't apply it. So it is &lt;em&gt;not &lt;/em&gt;obvious and that's why it's first in the list here.&lt;/p&gt;
&lt;p&gt;By styling alternating rows differently you increase the ability of users to distinguish between overcrowded data in multiple rows and columns. You can use background color or background image. If background color is used it should be just slightly lighter/darker than a page background. For background images you should choose subtle gradients that match your color scheme. You can also combine background colors/images with table borders. Table header and footer should be easily recognizable and to achieve that you can use darker (or lighter) colors than table row colors.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fblinkcampaign.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.blinkcampaign.com"&gt;BlinkCampaign&lt;/a&gt; uses subtle green color for alternate rows while keeping the header a bit darker.&lt;/p&gt;
&lt;h2&gt;Full row selection&lt;/h2&gt;
&lt;p&gt;If there is a single action that can be performed on a specific row, you can make the entire row clickable. This expands clickable area and declutters an interface. This can be used if, for instance, the only action you can perform on each row is &lt;em&gt;view details&lt;/em&gt;. Each row should have hover state styled differently. There are several ways to achieve this effect, among which I would recommend you &lt;a href="http://plugins.jquery.com/project/rowSelect"&gt;RowSelect&lt;/a&gt; jQuery plugin.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fcrazyegg.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://crazyegg.com/"&gt;CrazyEgg&lt;/a&gt; uses full row selection to expand the details of the current selection (we'll talk about this pattern a bit later). Row which is being hovered is slightly lighter. I really like how they designed this area (as well as the rest of the application).&lt;/p&gt;
&lt;h2&gt;Table sections&lt;/h2&gt;
&lt;p&gt;When you need to group related rows you can consider using table sections (or table grouping). A section is a part of the table that groups related data. All groups shares same set of columns. For example, in a table that shows list of countries, regions are natural way to group rows. Each section should be styled differently and can be collapsible/expandable. Under each section you can show summarized data, if needed.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fpulseapp.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pulseapp.com/"&gt;PulseApp&lt;/a&gt; uses table sections to show income and expenses details, but also to group data in subsections that will show even more details. Each section and subsection is expandable.&lt;/p&gt;
&lt;h2&gt;Sorting&lt;/h2&gt;
&lt;p&gt;Sorting is used for cases when users have difficulties in finding a row they want in a very large set of data but they don't know any keyword that can be searched by. Users also sort tables by columns when they want to compare adjacent information.&lt;/p&gt;
&lt;p&gt;The common practice for enabling sorting on tables is to make header labels clickable. A column by which the table is sorted should be marked. This is usually done by placing an arrow next to column name, indicating in which order the column is sorted (ascending or descending). Clicking on a column that is already sorted should just reverse the order.&lt;/p&gt;
&lt;p&gt;There has to be a clear difference between sortable columns and the others that aren't. It is a good practice to sort table by default by one of the key columns.&lt;/p&gt;
&lt;p&gt;Quite usable plugin is &lt;a href="http://tablesorter.com/docs/"&gt;TableSorter&lt;/a&gt; which is very simple to use. It sorts many known data types and you can define your own as well. It also supports multi-column sorting, but I a not big fan of it anyway.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fonehub.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://onehub.com/"&gt;OneHub&lt;/a&gt; application clearly marks the sorted column and sorting order. What I like about this design is that it uses realism even in such small details.&lt;/p&gt;
&lt;h2&gt;Filtering&lt;/h2&gt;
&lt;p&gt;Filtering is very useful when you deal with large amount of data. Use dropdowns, radio buttons or checkboxes to make filter selection. In the example below, &lt;a href="http://builditwith.me/"&gt;builditwith.me&lt;/a&gt; uses dropdowns to filter the list of people by profession, interest and availability.&lt;/p&gt;
&lt;p&gt;However, you can perform filtering only by predefined set of values. For instance, you can filter a list of jobs by it's type: full-time/freelance or by type: design/development. This means you can't filter by First/Last name because there is infinite number of variations. In this case you can use live filter which uses keywords to filter data. For live filter you use input field where users can type any keyword and list is filtered by keywords found in any column.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fbuildwithme.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.builditwith.me/"&gt;Builditwith.me&lt;/a&gt; has several filter options above the list and live filtering below it.&lt;/p&gt;
&lt;h2&gt;Pagination&lt;/h2&gt;
&lt;p&gt;When dealing with large amount of data it is a good practice to split them in pages. Pagination is commonly used pattern but in many cases it is ineffective. This works for search engines but that doesn't mean it will work in all cases.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fproductplanner.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://productplanner.com/gallery/"&gt;Product Planner&lt;/a&gt; implements pagination in a common way - with page numbers and prev and next links. But can you tell what is on page 2? Page 3? Sure you can't. But standard pagination can be improved. Take &lt;a href="http://la.everyblock.com/streets/"&gt;EveryBlock&lt;/a&gt; example shown below. Since it is a large addressbook, they used numbers and letters to define pages. Although in their case all pages are shown this would work well with hiding pages as well. You can use the similar approach for other criteria by which tables are sorted. If table is sorted by date, you can show date ranges instead of page numbers (Page 1 can be shown as &lt;em&gt;Feb 10 - Feb 12&lt;/em&gt;, and so on).&lt;/p&gt;
&lt;p&gt;If pagination links become too wide, you can use common page numbers (as seen in previous example) and show additional information while hovering over links.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2feveryblock.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Continiuos scrolling&lt;/h2&gt;
&lt;p&gt;As a contrast to pagination, continuous scrolling reveals new sets of data while you scroll down the list. There is no option to go to a specific set of data as it is the case with paging. Instead, new set of data is being added to a list. During the load time a progress indicator should be shown. In the example below, a progress indicator on &lt;a href="http://dzone.com/"&gt;dzone.com&lt;/a&gt; is showing how many items are loaded.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fscrolling.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;There are certain usability and accessibility issues with this pattern so you should test if this work with your users. You can read more about this pattern on &lt;a href="http://ui-patterns.com/pattern/ContinuousScrolling"&gt;UI Patterns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is a variation of this pattern (or actually another pattern) that doesn't have such issues. Instead of revealing new set of data while scrolling, users can get the next set of data by clicking on &lt;em&gt;more&lt;/em&gt; button, positioned at the end of the list. A good example of this can be seen on &lt;a href="http://dzone.com/"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2ftwitter.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Fixed table header&lt;/h2&gt;
&lt;p&gt;This is a nice simple trick you can use to keep table header always visible. You can use it on fairly large and complex data sets to help users distinguish between many columns. I don't have any live example so if you know one, please share! &lt;a href="http://fixedheadertable.mmalek.com/"&gt;FixedHeaderTable&lt;/a&gt; plugin can be a good example.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2ffixedheadertable.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Headerless table&lt;/h2&gt;
&lt;p&gt;If data in a table if self-explanatory there is no need for table header. A table that shows emails can be a good example - email subject, sender and date sent are self-explanatory and distinctive data which doesn't require table header. However, there are cases when you won't be able to remove table header. If there are ambiguous data, such as two dates, you would need a header description for these columns.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2frivalmap.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.rivalmap.com/"&gt;Rivalmap&lt;/a&gt; dashboard is a good example of headerless table. The information in the table is obvious and formatted in such way that no table header is needed.&lt;/p&gt;
&lt;h2&gt;Expandable rows&lt;/h2&gt;
&lt;p&gt;I already &lt;a href="http://www.jankoatwarpspeed.com/post/2009/07/20/Expand-table-rows-with-jQuery-jExpand-plugin.aspx"&gt;wrote about this pattern&lt;/a&gt; and created a &lt;strong&gt;small jQuery plugin&lt;/strong&gt; that you can easily implement. The key point of this pattern is to enable adding additional information or functionality to tables. &lt;a href="http://buysellads.com/buy"&gt;BuySellAds&lt;/a&gt;, for example, uses this pattern to show advertising details about each publisher, while keeping the most important information always visible in master rows.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fbsa.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Row actions&lt;/h2&gt;
&lt;p&gt;Tables are often much more than a plain placeholder for endless data. They also can be interactive elements that can perform specific actions. Actions are usually performed on a single row (they can be also performed on multiple rows, see next pattern). Actions can be shown inline, they can be revealed on hover or shown as a menu.&lt;/p&gt;
&lt;h3&gt;Inline actions&lt;/h3&gt;
&lt;p&gt;The simplest way to show actions is to place them in line with row data, at the beginning or the end of the row. In the example below, &lt;a href="http://www.mixx.com/"&gt;Mixx&lt;/a&gt; shows voting action at the end of each row which makes voting quite easy.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fmixx.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Hover actions&lt;/h3&gt;
&lt;p&gt;This is variation of the previous pattern that can be used in cases when you have multiple actions. By hiding them and revealing them on hover you declutter interface and make more space for data. &lt;a href="http://estimator.astuteo.com/"&gt;Project Estimator by Astuteo&lt;/a&gt; shows edit and delete action on hovering each row.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2festimator.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Menu actions&lt;/h3&gt;
&lt;p&gt;If there are a lot of actions you can perform on each row, you can show them as a many that can be revealed on hover or click. &lt;a href="https://www.dropbox.com/"&gt;DropBox&lt;/a&gt; utilizes this pattern very effectively. Since there are a lot of actions you can perform on each file, they show them as a context menu.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fdropbox.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Actions on multiple rows&lt;/h2&gt;
&lt;p&gt;A good approach in many cases is to enable users to perform actions on multiple rows. Users can select rows by clicking on a checkbox, usually placed at the beginning of each row, and perform group action by pressing one of the available group action links or buttons. I will use DropBox in example also. Users can select multiple files and perform one of the group actions available from menu.&lt;/p&gt;
&lt;p&gt;It is also a good practice to enable select all/deselect all functionality which instantly select or deselect all visible rows.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fdropbox2.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;The article covered the basics of the most common table patterns and some live examples. If I missed something please let me know! I also recommend you reading two more articles about tables: &lt;a href="http://www.8164.org/the-big-table-issue/"&gt;Big Table issue&lt;/a&gt; that tries to find an solution for tables that are so big they no longer fit in the viewport, and &lt;a href="http://designshack.co.uk/articles/css/15-tips-for-designing-terrific-tables"&gt;15 Tips for Designing Terrific Tables&lt;/a&gt; that shows many different contexts in which tables can be used.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;strong&gt;Theresa Neil&lt;/strong&gt;, one of the authors of Designing Web Interfaces, you can &lt;a href="http://designingwebinterfaces.com/ultimate-guide-to-table-ui-patterns"&gt;read about three more patterns&lt;/a&gt; that she documented: Inline Editing, Super Wide Tables and In-column Filtering.&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=hvAmJR4A8DQ:qujsHCZzHaI:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=hvAmJR4A8DQ:qujsHCZzHaI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=hvAmJR4A8DQ:qujsHCZzHaI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=hvAmJR4A8DQ:qujsHCZzHaI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=hvAmJR4A8DQ:qujsHCZzHaI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=hvAmJR4A8DQ:qujsHCZzHaI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=hvAmJR4A8DQ:qujsHCZzHaI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/02/26/table-ui-patterns.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/02/26/table-ui-patterns.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=7744c902-1a46-4618-958d-d9806c4e81ab</guid>
      <pubDate>Fri, 26 Feb 2010 12:00:00 +0100</pubDate>
      <category>User experience</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=7744c902-1a46-4618-958d-d9806c4e81ab</pingback:target>
      <slash:comments>74</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=7744c902-1a46-4618-958d-d9806c4e81ab</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/02/26/table-ui-patterns.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=7744c902-1a46-4618-958d-d9806c4e81ab</wfw:commentRss>
    </item>
    <item>
      <title>Process of redesigning Janko At Warp Speed, explained</title>
      <description>&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fredesign.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Since I put a lot of efforts and time into the redesign of JankoAtWarpSped (it wasn't fast as warp speed, it was rather a snail speed) I would like to share my experience, thoughts and working process. The redesign process took several months (I can't even remember when exactly I started) because I am always overloaded with work and often have only a couple of hours weekly to work on blog.&lt;/p&gt;
&lt;h2&gt;The old site&lt;/h2&gt;
&lt;p&gt;I think the old site is a good point to start the story. The issues with the old site triggered the thoughts about redesign. I performed several different tests and collected a large amount of feedback and it became obvious that it has some serious usability issues. Dark background and poor readability, for example. There were issues with navigation. Many widgets cluttered the interface. A commenting experience wasn't so great neither, and in some cases it was quite confusing. Personally, I was far from satisfied with aesthetics. Those and some other issues was a clear sign for me that I should go with total redesign.&lt;/p&gt;
&lt;p&gt;So the main goal were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Declutter interface&lt;/li&gt;
&lt;li&gt;Improve reading experince&lt;/li&gt;
&lt;li&gt;Improve commenting experience to help have more people involved in conversation&lt;/li&gt;
&lt;li&gt;Improve aesthetics&lt;/li&gt;
&lt;li&gt;Provide enough space for new content&lt;/li&gt;
&lt;li&gt;Create design that can be aligned later without a need for total redesign&lt;/li&gt;
&lt;li&gt;Drop support for IE6&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The importance of Agile&lt;/h2&gt;
&lt;p&gt;I am big fan of Agile principles. As the matter of fact I am working according to Agile for a couple of years, lately only with Scrum. Since I was &lt;em&gt;a team of one&lt;/em&gt;, I decided to adapt Scrum to the needs of this project. I certainly couldn't have daily scrum meetings, but I took the advantage of iterations, user stories and product and sprint backlogs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dzovan/4355433255/"&gt;&lt;img src="http://farm3.static.flickr.com/2686/4355433255_d20e3bcf3b.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The image above was my product backlog and, along with several sketches, a complete requirements specification. I realized I will only lose time with traditional specifications and usage scenarios so I started with first sprint as soon as I identified main goals. At the end of each sprint (iteration) I had something that I could use for testing. Either sketches, wireframes or prototypes. However, I tested only with html/css prototypes.&lt;/p&gt;
&lt;p&gt;Throughout many iterations I explored different ideas and concepts. Many proved to be bad ideas. And I am happy with that because the ideas I incorporated in the final design were the ones that proved to be the best.&lt;/p&gt;
&lt;h2&gt;The new design&lt;/h2&gt;
&lt;p&gt;My first thoughts about new design was about keeping it light and minimalistic. I started with classic sidebar at first, but I decided to remove it completely and go with the current solution. My main focus in the beginning was on the article view and not on the home page. Although home page is the first most visited page on my blog, &lt;strong&gt;about 90% of visitors land on article pages&lt;/strong&gt; either from search engines or referring sites.&lt;/p&gt;
&lt;p&gt;I wanted to combine hand-drawn elements (because I draw a lot and I wanted the design to reflect this) and minimalistic style.&lt;/p&gt;
&lt;p class="imageshow"&gt;&lt;a href="http://www.flickr.com/photos/dzovan/4355433373/"&gt;&lt;img src="http://farm5.static.flickr.com/4048/4252558866_35d9563037.jpg" alt="" /&gt;&lt;/a&gt; &lt;span&gt;One of the early sketches of article view and home page shows many element that proved to be bad ideas&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Header and main navigation&lt;/h3&gt;
&lt;p&gt;I was playing a lot with header and main navigation. I tried with categories and rss box in header, with different background images (and without images), with many different layouts and the one I chose is the one with the minimum elements on it. Categories are no longer the part of the navigation. Readers access other articles through &lt;em&gt;articles &lt;/em&gt;link, breadcrumb or categories in footer.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid 1px #dcdcdc;" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fheader.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Links in navigation have a hand drawn hover background which I also use to mark the current page (other than posts). I also modified the logo a bit, so you can always see the actual logo if hover over it.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid 1px #dcdcdc;" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fmenu_hover.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Breadcrumb separator is just one of hand-drawn elements.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid 1px #dcdcdc;" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fbreadcrumb.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Content&lt;/h3&gt;
&lt;p&gt;One of the main tasks was, as I mentioned earlier, to improve the reading experience. A light background with a lot of whitespace was a good choice. I organized 125x125 ads in one vertical column. Some may find this distracting, but it is a compromise between the needs and wishes. The intention of the left column is not just to hold meta data about the post but also to enable showing images and other content that is wider than the post width (the previous sketch shows an example of this).&lt;/p&gt;
&lt;p&gt;Post footer shows information about the author, tags, categories and share options. There is no stupid related post widget anymore. I will create a list of related posts manually if needed.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid 1px #dcdcdc;" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fpost_footer.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Comments&lt;/h3&gt;
&lt;p&gt;Since commenting experience was one of my main goals I spent a lot of time thinking about the look of comment section and interactions with comment form. After many tries, I end up with the design shown below. The left column is used to show comment meta data ant the rest of the space for comment text and gravatar. This widens each comment and saves vertical space. Since I hate comments replies indentation, I was thinking a lot about how to indent replies but keep all comments aligned. I came up with the idea to indent only meta data and add small arrow before name. It turned out it was a nice solution. Since many readers scan through comment in searching for replies only, I added pale background to author's comments.&lt;/p&gt;
&lt;p&gt;Trackbacks are placed below the comment form and are initially hidden, but can be easily revealed if needed.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid 1px #dcdcdc;" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fcomments.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The previous comment form design was confusing. It wasn't clear that comments are moderated and what is happening with the comment once submitted, there were no reply to comments and there was one unnecessary field. A new solution clearly shows what is happening with the system. Once you click on submit button, the form is submitted through Ajax. A huge hourglass is visible during the request after which the page is moved to the position of your newly added comment (this is animated with jQuery). There is a clear message above newly added comment that comments are moderated.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid 1px #dcdcdc;" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fcomment-form.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The image below is a sketch that shows what happens when you submit a comment, reply to comment or cancel a reply.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dzovan/4355433373/"&gt;&lt;img src="http://farm5.static.flickr.com/4013/4355433373_a15f02c191.jpg" alt="" width="500" height="338" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Home page&lt;/h3&gt;
&lt;p&gt;The home page is even more minimalistic. The last article is styled differently with meta data in the left column, image and &lt;em&gt;continue reading&lt;/em&gt; link. All other articles contain only title and meta data below the title. A link at the end of the list redirects to a page where you can browse all articles. Although I tried several layouts, different features and traditional &lt;em&gt;older and newer&lt;/em&gt; pagination (which I dislike, btw) it turned out that this design works just fine. Until some next realignment.&lt;/p&gt;
&lt;h3&gt;Articles page&lt;/h3&gt;
&lt;p&gt;The purpose of &lt;em&gt;Articles &lt;/em&gt;page is to help readers find the content of interest by filtering articles by category or tag. By default, it shows latest 10 articles. If reader come from home page this will be a redundancy since they already saw a list of latest 10 articles, so I might think of some better solution for this (even though readers mostly come to &lt;em&gt;articles &lt;/em&gt;page from pages other than home page).&lt;/p&gt;
&lt;h3&gt;Footer&lt;/h3&gt;
&lt;p&gt;The role of the footer is supportive. Readers can browse categories, subscribe, join me on social network sites, check out some of my work or read different books that I will recommend from time to time. A different styling should easily grab the attention while scrolling.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2ffooter.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Technical details&lt;/h3&gt;
&lt;p&gt;The blog runs on the latest version of BlogEngne.NET, which I modified a lot to meet my needs. I use a touch of jQuery on several places. Color scheme is minimal, with shades of gray and blue. Visited links are a bit lighter than regular links. Lucida sans is one of the my favorite fonts on the web so there was no doubt about typography.&lt;/p&gt;
&lt;p&gt;I decided to use grid system and &lt;strong&gt;I regret after a while&lt;/strong&gt;. Not because the grid is bad (it certainly isn't bad) but rathar because it complicated things during the front-end development. I could achieve the same result with less time spent. The HTML and CSS inherited from the latest prototype so the code isn't perfect, but I really don't care much about that. I use one large image with CSS sprites for many details. For comment form and search box I use CSS3 borders that enables the level of details I wanted to have on forms, without affecting load time.&lt;/p&gt;
&lt;h2&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;There is always a large number of things that influence and inspire. This is what inspired me the most during the redesign.&lt;/p&gt;
&lt;p&gt;1. The Universe itself, but especially &lt;em&gt;The Universe&lt;/em&gt; series on History channel and similar shows on National Geographic.&lt;/p&gt;
&lt;p&gt;2. Drawings of Michelangelo Buonarotti and Leonardo Da Vinci.&lt;/p&gt;
&lt;p&gt;3. Faith No More for fantastic music. Too bad I missed their concert in Budapest last year.&lt;/p&gt;
&lt;p&gt;4. Sushi and robots website&lt;/p&gt;
&lt;p&gt;5. David DeSandro's site&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;I hope that I succeeded in explaining the reasons behind the redesign and each design decision. Thanks everyone for the feedback so far. I am looking forward to hear your comments and thoughts.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=bdVAwdsfqfg:wY4iP9eRepc:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=bdVAwdsfqfg:wY4iP9eRepc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=bdVAwdsfqfg:wY4iP9eRepc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=bdVAwdsfqfg:wY4iP9eRepc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=bdVAwdsfqfg:wY4iP9eRepc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=bdVAwdsfqfg:wY4iP9eRepc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=bdVAwdsfqfg:wY4iP9eRepc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/02/16/redesigning-jankoatwarpspeed.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/02/16/redesigning-jankoatwarpspeed.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=47c270a4-0ca3-48f5-85d4-8faf7ef2e054</guid>
      <pubDate>Tue, 16 Feb 2010 08:00:00 +0100</pubDate>
      <category>Process &amp; practice</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=47c270a4-0ca3-48f5-85d4-8faf7ef2e054</pingback:target>
      <slash:comments>75</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=47c270a4-0ca3-48f5-85d4-8faf7ef2e054</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/02/16/redesigning-jankoatwarpspeed.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=47c270a4-0ca3-48f5-85d4-8faf7ef2e054</wfw:commentRss>
    </item>
    <item>
      <title>JankoAtWarpSpeed redesigned and a giveaway begins</title>
      <description>&lt;p&gt;After almost two years of its existence JankoAtWarpSpeed has been redesigned, this time dramatically. There were several reasons for total redesign among which are usability issues discovered in testing, feedback from readers and aligning the design with the goals for the future.&lt;/p&gt;
&lt;p style="color: #ff0000;"&gt;Update: The giveaway is closed on February 15th 2010, 12:00PM (+1 GMT), winners are announced at the end of the post.&lt;/p&gt;
&lt;p&gt;Since I was occupied with many things at the same time, the redesign took much longer then it should, so I am very satisfied (and very happy) it is finally live! I am currently writing an article that will explain &lt;strong&gt;reasons and the process of redesign&lt;/strong&gt; in more details. I will share my analysis results, thoughts, sketches and activities.&lt;/p&gt;
&lt;p&gt;Feel free to explore the site. As always, I am looking forward to hearing your feedback!&lt;/p&gt;
&lt;h2&gt;Giveaway&lt;/h2&gt;
&lt;p&gt;To celebrate the new design I am giving away some cool stuff here.&lt;/p&gt;
&lt;h3&gt;1. &lt;a href="http://www.happywebbies.com/"&gt;One Happy Webbies T-shirt&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fhappywebbies-shirts.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to Lori from nGenWorks you might win a &lt;strong&gt;fantastic T-shirt&lt;/strong&gt; with one of the most famous interwebbers,such as Jakob Nielsen, Jeffrey Zeldman, Molly Holzschlag and many more (see the image above). The winner will be able to choose the t-shirt and desired size. While you are here you might also want to download some of their awesome wallpapers.&lt;/p&gt;
&lt;p&gt;Happywebbies are very professional, t-shirts are of a high quality so if you don't win one, I recommend you &lt;a href="http://www.happywebbies.com/"&gt;visiting their site&lt;/a&gt; and buy one for yourself.&lt;/p&gt;
&lt;h3&gt;2.&lt;a href="http://www.amazon.com/gp/product/0321657292?ie=UTF8&amp;amp;tag=jank0a-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321657292"&gt;One "Rocket Surgery Made Easy" Book&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2frocket_surgery.jpg" alt="" vspace="10" width="120" height="157" align="left" /&gt;I guess that many of you read legendary &lt;em&gt;Don't Make Me Think&lt;/em&gt; from Steve Krug. His new book, &lt;strong&gt;Rocket Surgery Made Easy&lt;/strong&gt; goes deeper into the usability testing - how to find and, what is even more important, fix usability problems. The goal of this book is to introduce usability testing to non-usability professionals and guide them on how to organize and perform, what is know as discount usability testing.&lt;/p&gt;
&lt;p&gt;If you are not an usability expert, this might be very useful book for you.&lt;/p&gt;
&lt;h3&gt;3. &lt;a href="http://www.amazon.com/gp/product/8883701054?ie=UTF8&amp;amp;tag=jank0a-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=8883701054"&gt;One Moleskine Sketchbook Pocket&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fmoleskine-sketch.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I think that many know what Moleskine is but for those who don't, it is a brand of notebooks, sketchbooks, addressbooks, planners, etc. made by company named Moleskine. They are the choice of many designers and artists who use them to capture ideas, concepts and thoughts. It is a tool that you must have. I am giving away one pocket size sketchbook.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Thanks to Topher from &lt;a href="http://htmlrockstars.com/"&gt;HTML Rockstars&lt;/a&gt; you might also win these two great books:&lt;/p&gt;
&lt;h3&gt;4. &lt;a href="http://www.sitepoint.com/books/sexy1/"&gt;Sexy Web Design&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fsexywd.jpg" alt="" align="left" /&gt;&lt;/p&gt;
&lt;p&gt;Sexy Web Design is a book published by SitePoint. "&lt;strong&gt;&lt;em&gt;Sexy Web Design&lt;/em&gt;&lt;/strong&gt; is an easy-to-follow guide that reveals the secrets of how to build your own breathtaking web interfaces from scratch. You&amp;rsquo;ll be guided through the entire process of creating a gorgeous, usable web site by applying the timeless principles of user-centered design."&lt;/p&gt;
&lt;h3&gt;5. &lt;a href="http://www.sitepoint.com/books/javascript1/"&gt;Simply JavaScript&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f2%2fsimplyjs.jpg" alt="" align="left" /&gt;&lt;/p&gt;
&lt;p&gt;Simply JavaScript is a book also published by SitePoint. "Packed with examples, Simply JavaScript is all you need to start programming in JavaScript the right way. Learn how easy it is to use JavaScript to solve real-world problems, build smarter forms, track user events (such as mouse clicks and key strokes), and design eye-catching animations. Then move on to more powerful techniques using the DOM and Ajax."&lt;/p&gt;
&lt;p&gt;These two also can come as an aplogize, because my blog was down fo a couple of hours.&lt;/p&gt;
&lt;h2&gt;How to participate&lt;/h2&gt;
&lt;p&gt;Just &lt;strong&gt;leave a comment&lt;/strong&gt; at the end of this post &lt;a href="http://twitter.com/home?status=JankoAtWarpSpeed%20redesigned%20and%20a%20giveaway%20begins%20(via%20%40jankowarpspeed)%20http%3A%2F%2Fbit.ly%2Fa3H27c"&gt;or tweet about this giveaway&lt;/a&gt;. If you leave a comment, feel free to leave your thoughts about the new design. The winners will be announced on &lt;strong&gt;Monday, February 15th 12:00PM GMT +1&lt;/strong&gt; as the update on this post. To make it more uncertain, the selection of winners AND prizes will be random. Good luck!&lt;/p&gt;
&lt;h2&gt;Update: Winners announcement&lt;/h2&gt;
&lt;p&gt;The giveaway is finished, and here is the list of winners.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Happy Webbies t-shirt: &lt;strong&gt;Markus B&amp;uuml;rgler &lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rocket Surgery Made Easy: &lt;strong&gt;Ashok &lt;/strong&gt;(no lastname)&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Moleskine Sketchbook Pocket: &lt;strong&gt;&lt;span class="url fn"&gt;Chris Maynard&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sexy Web Design: &lt;strong&gt;&lt;span class="url fn"&gt;David &lt;/span&gt;&lt;/strong&gt;&lt;span class="url fn"&gt;(no lastname)&lt;/span&gt;&lt;strong&gt;&lt;span class="url fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Simply JavaScript: &lt;strong&gt;@desizntech &lt;/strong&gt;(via twitter)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Winners will be contacted via emails in order to provide their shipping addresses. &lt;strong&gt;Congrats to all the winners&lt;/strong&gt; and thanks everyone for the feedback!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=-8b__3W-r0E:qihG3w-ZJY4:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=-8b__3W-r0E:qihG3w-ZJY4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=-8b__3W-r0E:qihG3w-ZJY4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=-8b__3W-r0E:qihG3w-ZJY4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=-8b__3W-r0E:qihG3w-ZJY4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=-8b__3W-r0E:qihG3w-ZJY4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=-8b__3W-r0E:qihG3w-ZJY4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/02/10/JankoAtWarpSpeed-redesigned-giveaway.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/02/10/JankoAtWarpSpeed-redesigned-giveaway.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=b6cf5fe3-35de-4639-8304-6dedadd785e7</guid>
      <pubDate>Wed, 10 Feb 2010 10:39:00 +0100</pubDate>
      <category>Internet</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=b6cf5fe3-35de-4639-8304-6dedadd785e7</pingback:target>
      <slash:comments>176</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=b6cf5fe3-35de-4639-8304-6dedadd785e7</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/02/10/JankoAtWarpSpeed-redesigned-giveaway.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=b6cf5fe3-35de-4639-8304-6dedadd785e7</wfw:commentRss>
    </item>
    <item>
      <title>Dynamic tabs using jQuery - why and how to create it</title>
      <description>&lt;p&gt;This tutorial will show you how to use jQuery to create tabs that can be added and removed dynamically. Although the example looks bulletproof, there are some questions I will raise about how to use tabs and in which context should&amp;nbsp;they be used in order to make them meaningful and usable.&lt;/p&gt;
&lt;p&gt;&lt;a class="demo" href="http://www.jankoatwarpspeed.com/examples/dynamic_tabs/"&gt;View demo &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When we talk about tabs on web we usually think about &lt;a href="http://ui-patterns.com/pattern/NavigationTabs"&gt;tabs used for navigation&lt;/a&gt;. However, in this case I'd like to use them in a different context. I want to use them for showing different entities on the same page. By entities I mean anything from plain text to web forms. Actually, I will&amp;nbsp;try to simulate tabs as seen in browsers. Well, at least to some extent. Take Google docs for example, instead of opening each document in a new window (or browser tab), you could open them in page tabs.&lt;/p&gt;
&lt;h2&gt;Questions&lt;/h2&gt;
&lt;p&gt;What kind of information makes sense to be shown in page tabs? This is probably the most important question to ask. I would say that you should use page tabs in cases when there is a set of actions that you can perform on all tabs&amp;nbsp;at the same time. For example, you can search and replace text in all tabs with a single action and then save it again with one action. Next, read only information such as text and reports can also be used in this context. But what about web forms? What if I want to create an application that will allow management of&amp;nbsp;different data at the same time? In one tab, I could edit inventory data, while in other I can view related data. Sounds interesting, but seems as if implementation would be too complex. What are your thoughts on this one?&lt;/p&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Ok, before I raise more questions, let's see how to create tabs. In this tutorial, we will assume that we have a list of documents that can be opened in separate tabs. Tabs with their content can be removed by clicking on "x" sign located at the right side of each tab. The constraint is that one document can be opened only once.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f1%2ftabs_states.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;This is the HTML structure needed for the example. We'll use &lt;em&gt;rel &lt;/em&gt;attribute&amp;nbsp;for creating ids of elements and &lt;em&gt;title &lt;/em&gt;attribute to create content. Please note that instead of using &lt;em&gt;title &lt;/em&gt;attribute, you can load content in other ways,&amp;nbsp;using Ajax for example.&lt;/p&gt;
&lt;pre&gt;&amp;lt;div id="doclist"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h2&amp;gt;Documents&amp;lt;/h2&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul id="documents"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#" rel="Document1" title="This is the content of Document1"&amp;gt;Document1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#" rel="Document2" title="This is the content of Document2"&amp;gt;Document2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#" rel="Document3" title="This is the content of Document3"&amp;gt;Document3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#" rel="Document4" title="This is the content of Document4"&amp;gt;Document4&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#" rel="Document5" title="This is the content of Document5"&amp;gt;Document5&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div id="wrapper"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul id="tabs"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Tabs go here --&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="content"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Tab content goes here --&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;So, the usage should go like this: When I click on Document1 link, a new tab will be shown with the title "Document1" and content "This is the content of Document1". It will contain a red cross on the right side of the tab title which will remove the tab and its content.&lt;/p&gt;
&lt;pre&gt;$("#documents a").click(function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; addTab($(this));
});
&lt;/pre&gt;
&lt;p&gt;This code will add a click event on each document link, and will pass the link itself to &lt;em&gt;addTab &lt;/em&gt;function.&lt;/p&gt;
&lt;pre&gt;function addTab(link) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // hide other tabs
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#tabs li").removeClass("current");
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#content p").hide();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add new tab and related content
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#tabs").append("&amp;lt;li class='current'&amp;gt;&amp;lt;a class='tab' id='" +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(link).attr("rel") + "' href='#'&amp;gt;" + $(link).html() +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;/a&amp;gt;&amp;lt;a href='#' class='remove'&amp;gt;x&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;");
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#content").append("&amp;lt;p id='" + $(link).attr("rel") + "_content'&amp;gt;" +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(link).attr("title") + "&amp;lt;/p&amp;gt;");
&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the newly added tab as curren
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + $(link).attr("rel") + "_content").show();
}
&lt;/pre&gt;
&lt;p&gt;The addTab function will first hide all tabs (if there&amp;nbsp;are any) and remove class current from&amp;nbsp;all tabs. This class sets a&amp;nbsp;different color for the current tab. Then, it will create a new tab (&lt;em&gt;li&lt;/em&gt; element) that will contain a link for tab title and another one for removing the tab. The content is added in a similar way. At the end, the code will set the new tab as current.&lt;/p&gt;
&lt;p&gt;So far so good, but this will be pretty much static - we have to add functionality to tabs. When tab header is clicked&amp;nbsp;related content should be shown. Also, when red cross is clicked tab with its content should be removed. For these two scenarios, we will use &lt;em&gt;live&lt;/em&gt; method that will bind events to existing elements, but also to all elements that will be added later to HTML dom.&lt;/p&gt;
&lt;pre&gt;$('#tabs a.tab').live('click', function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the tab name
&amp;nbsp;&amp;nbsp;&amp;nbsp; var contentname = $(this).attr("id") + "_content";
&amp;nbsp;&amp;nbsp;&amp;nbsp; // hide all other tabs
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#content p").hide();
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#tabs li").removeClass("current");
&amp;nbsp;&amp;nbsp;&amp;nbsp; // show current tab
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + contentname).show();
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).parent().addClass("current");
});
$('#tabs a.remove').live('click', function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the tab name
&amp;nbsp;&amp;nbsp;&amp;nbsp; var tabid = $(this).parent().find(".tab").attr("id");
&amp;nbsp;&amp;nbsp;&amp;nbsp; // remove tab and related content
&amp;nbsp;&amp;nbsp;&amp;nbsp; var contentname = tabid + "_content";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + contentname).remove();
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).parent().remove();
});
&lt;/pre&gt;
&lt;p&gt;The first function will add the content while the&amp;nbsp;second will remove tab content. Now, there are a few more things to do. First, we need to implement a constraint which says that one document can only&amp;nbsp;be opened once. To do so, we will extend addTab function with this code:&lt;/p&gt;
&lt;pre&gt;// If tab already exist in the list, return
if ($("#" + $(link).attr("rel")).length != 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp; return;
&lt;/pre&gt;
&lt;p&gt;The last thing we need to handle is the case when a tab is removed. With the current code, no tab will be the current one, and no content will be displayed. What should be done next? In this case I will assume that it will be the best to set the first tab as the current one, although we could also set next or previous one from the one removed.&lt;/p&gt;
&lt;p&gt;We need to extend the function that removes the tab with this code (put it at the end of the function):&lt;/p&gt;
&lt;pre&gt;// if there is no current tab and if there are still tabs left, show the first one
if ($("#tabs li.current").length == 0 &amp;amp;&amp;amp; $("#tabs li").length &amp;gt; 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // find the first tab
&amp;nbsp;&amp;nbsp;&amp;nbsp; var firsttab = $("#tabs li:first-child");
&amp;nbsp;&amp;nbsp;&amp;nbsp; firsttab.addClass("current");
&amp;nbsp;&amp;nbsp;&amp;nbsp; // get its link name and show related content
&amp;nbsp;&amp;nbsp;&amp;nbsp; var firsttabid = $(firsttab).find("a.tab").attr("id");
&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + firsttabid + "_content").show();
}&amp;nbsp;
&lt;/pre&gt;
&lt;h2&gt;Conclusion&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;Although the technical implementation is fine, the main thing you should think about is context. Used in wrong context this can add unnecessary complexity and usability problems. There are also several other things that need to be considered. What if we have large number of tabs? How&amp;nbsp;should this&amp;nbsp;be handled? The way Firefox handles it or some other way? Then, should one tab always be visible (same as Firefox, again)? Then, what about adding new tabs? Should they be added to the end or next to currently shown tab?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What are your thoughts about this? Have you used this concept before and where do you see its usage?&lt;/strong&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ILO45TO6ZyM:muVbaittQZ0:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ILO45TO6ZyM:muVbaittQZ0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ILO45TO6ZyM:muVbaittQZ0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=ILO45TO6ZyM:muVbaittQZ0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ILO45TO6ZyM:muVbaittQZ0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=ILO45TO6ZyM:muVbaittQZ0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=ILO45TO6ZyM:muVbaittQZ0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/01/26/dynamic-tabs-jquery.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/01/26/dynamic-tabs-jquery.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=0c977b81-2de6-470c-be1e-26ed4361ab73</guid>
      <pubDate>Tue, 26 Jan 2010 21:00:00 +0100</pubDate>
      <category>Tutorials</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=0c977b81-2de6-470c-be1e-26ed4361ab73</pingback:target>
      <slash:comments>44</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=0c977b81-2de6-470c-be1e-26ed4361ab73</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/01/26/dynamic-tabs-jquery.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=0c977b81-2de6-470c-be1e-26ed4361ab73</wfw:commentRss>
    </item>
    <item>
      <title>Homo Universalis</title>
      <description>&lt;p&gt;Let me get straight to the point: it would be great if all of us, somehow connected to design, aimed at being &lt;a href="http://en.wikipedia.org/wiki/Polymath"&gt;Homo Universalis&lt;/a&gt;, or as it's commonly referred to today a "Jack of all trades". To go a little further, &lt;strong&gt;many of us already are&lt;/strong&gt;. As much as we regard ourselves specialists in some field, I think that various interests and every day activities show that we are not specialists at all. But, let's go back a little.&lt;/p&gt;
&lt;h2&gt;A story from the 15th century&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;To explain and corroborate my claim, I'd like to go back some 500 years to r&lt;span class="mw-redirect"&gt;enaissance Italy&lt;/span&gt;. In the time of humanism and renaissance in Italy, a thought emerged that "a man can do all things if he will". The chief idea was that men have the potential for immense education and improvement in various areas. Ideally, this would encompass all known areas of arts and science. This is where we get the terms&amp;nbsp;&lt;strong&gt;Polymath, Renaissance man or &lt;/strong&gt;&lt;strong&gt;Homo Universalis. &lt;/strong&gt;Today, a more accepted term is &lt;strong&gt;Generalist or &lt;/strong&gt;&lt;strong&gt;Jack of all trades&lt;/strong&gt;, even though these terms are often used in the wrong context, sometimes even negative one. You can read about &lt;a href="http://en.wikipedia.org/wiki/Polymath"&gt;Renaissance Man&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Renaissance_humanism"&gt;Renaissance humanism&lt;/a&gt; on Wikipedia.&lt;/p&gt;
&lt;p&gt;&lt;img title="Leonardo da Vinci" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f1%2fLeonardo_self.jpg" alt="Leonardo da Vinci" hspace="10" width="120" height="160" align="left" /&gt;Typical representatives of that movement are &lt;a href="http://en.wikipedia.org/wiki/Leonardo_da_Vinci"&gt;Leonardo da Vinci&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Michelangelo"&gt;Michaelangelo Buonarotti&lt;/a&gt;. The first association to da Vinci is the picture of &lt;a href="http://en.wikipedia.org/wiki/Mona_Lisa"&gt;Mona Lisa&lt;/a&gt;, but it is definitely not his most significant work. He wasn't only a painter but a sculptor, architect, musician, scientist, mathematician, engineer, &lt;span class="mw-redirect"&gt;inventor&lt;/span&gt;, &lt;span class="mw-redirect"&gt;anatomist&lt;/span&gt;, geologist, &lt;span class="mw-redirect"&gt;botanist&lt;/span&gt; and writer.&lt;strong&gt; And he was good at most of these&lt;/strong&gt;. If this sounds incredible, then you will be amazed by the fact that his inventions were hundreds of years ahead of his time. He drew blueprints for airplanes, helicopters, submarines, tanks, even concentrated solar power! It would take 500 years for his ideas to see the light of day.&lt;/p&gt;
&lt;p&gt;Another "giant"&amp;nbsp;of that time was Michaelangelo Buonarotti. According to Wikipedia, he was a painter, &lt;span class="mw-redirect"&gt;sculptor&lt;/span&gt;, architect, poet, and engineer. Those, a little more versed in Michaelangelo's life, will know that this is a sin he would never forgive - to call him a painter before sculptor. Michaelangelo, apparently, hated painting, publicly criticized and deprecated it. The irony is that he is mostly known for his painting and one of the greatest painting feats in the history of mankind - the painted walls and ceiling of the &lt;a href="http://en.wikipedia.org/wiki/Sistine_Chapel"&gt;Sistine Chapel&lt;/a&gt;. He was, however, an excellent sculptor. His works are the pinnacle of sculpting world wide. Also, he was a very successful architect, just look at the dome of &lt;a title="St. Peter's Basilica" href="http://en.wikipedia.org/wiki/St._Peter%27s_Basilica"&gt;St. Peter's Basilica&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Although these two are the most famous, they are certainly not an exception, which is the point of my story. Almost every artist of that time had the same idea and aimed at achieving universal knowledge. Some had more success than others, but the want and craving existed which affected the art of the period and left tremendous heritage to posterity.&lt;/p&gt;
&lt;h2&gt;Back to 2010&lt;/h2&gt;
&lt;p&gt;So, what does this have to do with today? Everything. Rennaissance Humanism&amp;nbsp;is based on rebirth of Latin and ancient Greek values, which are the foundation of modern civilization. People like da Vinci and Michaelangelo have left us not only the greatest works and ideas but also a model where "universal knowledge" is undoubtedly possible.&lt;/p&gt;
&lt;p&gt;However, universal knowledge must be put in today's context. Although, during the Renaissance the Polymath had knowledge in arts and sciences, today it is a very large set of areas which is impossible to master. Industrial, technological and later information revolution have expanded the man's complete knowledge to unthinkable limits. Therefore, a Polymath of today would be a man (or a woman) possessing &lt;strong&gt;the knowledge of related fields&lt;/strong&gt;. Da Vinci of today would, apart from web design, have the skills&amp;nbsp;in UI design, interaction design, UX design, usability, front-end development and so on.&lt;/p&gt;
&lt;h2&gt;Diversification of knowledge helps, not obstructs&lt;/h2&gt;
&lt;p&gt;It certainly doesn't mean that a Polymath should be an expert in all fields, just as it wasn't the case with renaissance Italy artists. He could be a top UI designer, web designer and front-end developer and also have solid knowledge in other areas. This is how I look at this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f1%2fdiagram.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I believe that many can draw a similar diagram of their knowledge. How ever subjective, it will contain several specialties which you&amp;nbsp;work with&amp;nbsp;and&amp;nbsp;possess a&amp;nbsp;certain amount of knowledge in them. Secondary skills, summed up, can be greater than one primary area. I know what you are about to say, that someone's knowledge in total is not a simple sum of skills from other areas. And you're right. Someone's total knowledge is actually a &lt;strong&gt;synergy of their co-effects&lt;/strong&gt;, meaning that by leaving out secondary skills you lose the big picture of someone's actual knowledge. Therefore, if you have other skills, don't discard them in fear of being characterized as "Jack of all trades, master of none".&lt;/p&gt;
&lt;h2&gt;Master of one or none?&lt;/h2&gt;
&lt;p&gt;&lt;img title="Michaelangelo Buonarotti" src="http://www.jankoatwarpspeed.com/image.axd?picture=2010%2f1%2fMichelango_Portrait.jpg" alt="Michaelangelo Buonarotti" hspace="10" width="120" height="160" align="left" /&gt;The point is not to be a master of none. But, neither is it&amp;nbsp;to be the master of one. The point is to expand your skills to become richer, more experienced and better because you have the ability to see the bigger picture. So, you can be a master in some areas and very good in others. Is there a law of nature that says that you can be a master of only one? Where's the limit? What's stopping you? Living in the fast lane? Lack of time? Social guidelines? Money? Commercializing all values? Think again as to what are the real obstacles and what are the excuses?&lt;/p&gt;
&lt;p&gt;In the end, isn't it human nature to research and expand one's skills? Wasn't exactly that that allowed us to become who we are now - sensible, rational beings? Many species which have specialized in one area of life or nutrition have become extinct and, even today, are an easy prey of the evolution. We are where we are, the ultimate surviving machines.&lt;/p&gt;
&lt;h2&gt;You don't agree?&lt;/h2&gt;
&lt;p&gt;I know that many will not agree with what I'm saying and that for some specialization is the right choice. There were attempts to stand &lt;a href="http://www.webdesignerdepot.com/2009/10/in-defense-of-the-jack-of-all-trades/"&gt;in defense of the jack of all trades&lt;/a&gt;. Still, my impression is that the predominant opinion is that specialization is the only right choice. And it's ok if you think so. However, I know that most of us can do it. If you have taken the &lt;a href="http://www.smashingmagazine.com/2009/12/22/design-something-every-day/"&gt;Design something every day&lt;/a&gt; challenge, it's a good start. You could also learn something every day. Buy a book. If you are, for example a designer, learn usability. If you are a graphic designer, learn web design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why don't we renew these values lost somewhere along the road of universal human progress? What's stopping us? &lt;/strong&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=kh-fLulNVrM:bezYvnqRfcw:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=kh-fLulNVrM:bezYvnqRfcw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=kh-fLulNVrM:bezYvnqRfcw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=kh-fLulNVrM:bezYvnqRfcw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=kh-fLulNVrM:bezYvnqRfcw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?i=kh-fLulNVrM:bezYvnqRfcw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?a=kh-fLulNVrM:bezYvnqRfcw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JankoAtWarpSpeed?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.jankoatwarpspeed.com/post/2010/01/10/Homo-Universalis.aspx</link>
      <comments>http://www.jankoatwarpspeed.com/post/2010/01/10/Homo-Universalis.aspx#comment</comments>
      <guid>http://www.jankoatwarpspeed.com/post.aspx?id=e19a79d4-d68a-4c4f-9062-4d4798b33798</guid>
      <pubDate>Sun, 10 Jan 2010 08:00:00 +0100</pubDate>
      <category>Process &amp; practice</category>
      <dc:publisher>Janko</dc:publisher>
      <pingback:server>http://www.jankoatwarpspeed.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jankoatwarpspeed.com/post.aspx?id=e19a79d4-d68a-4c4f-9062-4d4798b33798</pingback:target>
      <slash:comments>43</slash:comments>
      <trackback:ping>http://www.jankoatwarpspeed.com/trackback.axd?id=e19a79d4-d68a-4c4f-9062-4d4798b33798</trackback:ping>
      <wfw:comment>http://www.jankoatwarpspeed.com/post/2010/01/10/Homo-Universalis.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jankoatwarpspeed.com/syndication.axd?post=e19a79d4-d68a-4c4f-9062-4d4798b33798</wfw:commentRss>
    </item>
  </channel>
</rss>

