<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HCoder.org &#187; Computers</title>
	<atom:link href="http://hcoder.org/category/computers/feed/" rel="self" type="application/rss+xml" />
	<link>http://hcoder.org</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 15 Apr 2012 21:43:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Small experiments with Cherokee</title>
		<link>http://hcoder.org/2012/03/10/small-experiments-with-cherokee/</link>
		<comments>http://hcoder.org/2012/03/10/small-experiments-with-cherokee/#comments</comments>
		<pubDate>Sat, 10 Mar 2012 20:28:17 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[cherokee]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1343</guid>
		<description><![CDATA[A couple of weeks ago I decided to move my wiki (see Wiki-Toki on GitHub) and my package repository (see Arepa on CPAN) over to a new machine. The idea was to move it to some infrastructure I &#8220;controlled&#8221; myself and was paying for (mainly inspired by the blog post &#8220;A Set of Tenets I [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago I decided to move my wiki (see <a href="https://github.com/emanchado/Wiki-toki">Wiki-Toki</a> on GitHub) and my package repository (see <a href="https://metacpan.org/module/Arepa">Arepa</a> on CPAN) over to a new machine. The idea was to move it to some infrastructure I &#8220;controlled&#8221; myself and was paying for (mainly inspired by the blog post &#8220;<a href="http://camendesign.com/blog/tenets">A Set of Tenets I Have Set Myself</a>&#8220;). As I was curious about <a href="http://www.cherokee-project.com/">Cherokee</a> and this was an excellent opportunity to learn it, I decided to use it as the web server.</p>
<p>I have to say I was pretty impressed by how easy it was to set it up. Although I did have several small problems, most of them were less related to Cherokee itself, and more related to me not being very familiar with Node application configuration outside of Joyent&#8217;s environment, or FastCGI configuration. In particular, the web-based configuration is brilliant: you don&#8217;t have to open or know the format of any configuration files, but instead configure everything from a pretty powerful UI (which in the end writes a text configuration file of course, so you can always automate or generate the configuration if you need to). I even knew this already, but seeing it in action was pretty impressive. To avoid security problems with people accessing that configuration interface, there&#8217;s this little tool called <a href="http://www.cherokee-project.com/doc/other_bundle_cherokee-admin.html">cherokee-admin</a> that starts <em>another</em> web server with the configuration interface (tip: pass the <tt>-b</tt> option without parameters if you want to connect to it from a different machine, which is the case unless you&#8217;re installing Cherokee in your own PC). On start it generates a random admin password, which you use to login.</p>
<p>Static content serving, CGI, FastCGI, specifying certain error codes for certain paths, and reverse proxying was all very easy to set up. There was only a small problem I bumped into: tweaking URLs in reverse-proxied responses. In my situation, I was doing reverse proxying from port 443 to port 3000. As the final application didn&#8217;t know about the proxy, it generated URL redirections to &#8220;http://&#8230;:3000/&#8221; instead of &#8220;https://&#8230;/&#8221;, so part of the process of proxying was fixing those URLs. Cherokee, of course, supports this out of the box, in a section called &#8220;URL Rewriting&#8221;. Each entry in that section takes a regular expression and a substitution string. My first attempt (&#8220;http://example.com:3000/&#8221; -&gt; &#8220;https://example.com/&#8221;) didn&#8217;t work: all URL redirections were changed to &#8220;https://example.com/&#8221;, disregarding the rest of the URL. After some time trying different things, I decided to try with &#8220;http://example.com:3000/(.*)&#8221; and &#8220;https://example.com/$1&#8243;. As it turns out, that worked like a charm! The documentation does mention that it uses Perl-compatible regular expressions, but I thought the <a href="http://www.cherokee-project.com/doc/modules_handlers_proxy.html">HTTP reverse proxy documentation</a> could have been more explicit in this regard.</p>
<p>But apart from that detail, everything was very smooth and I&#8217;m very, very happy with it :-)</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1343&amp;md5=81ec40c5b566d3d808ec8bf984de36d2" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2012/03/10/small-experiments-with-cherokee/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2012%2F03%2F10%2Fsmall-experiments-with-cherokee%2F&amp;language=en_GB&amp;category=text&amp;title=Small+experiments+with+Cherokee&amp;description=A+couple+of+weeks+ago+I+decided+to+move+my+wiki+%28see+Wiki-Toki+on+GitHub%29+and+my+package+repository+%28see+Arepa+on+CPAN%29+over+to+a+new+machine.+The+idea...&amp;tags=admin%2Ccherokee%2Cproxy%2Cservers%2Cweb%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Unit testing advice for seasoned hackers (2/2)</title>
		<link>http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/</link>
		<comments>http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 22:24:42 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[automated tests]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1322</guid>
		<description><![CDATA[This is the second part of my unit testing advice. See the first part on this blog. If you need any introduction you should really read the first part. I&#8217;ll just present the other three ideas I wanted to cover. Focusing on common cases This consists of testing only/mostly common cases. These tests rarely fail [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is the second part of my unit testing advice. See the <a href="http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/">first part</a> on this blog.</em></p>
<p>If you need any introduction you should really read the first part. I&#8217;ll just present the other three ideas I wanted to cover.</p>
<h2>Focusing on common cases</h2>
<p>This consists of testing only/mostly common cases. These tests rarely fail and give a false sense of security. Thus, tests are better when they also include less common cases, as they&#8217;re much more likely to break inadvertently. Common cases not only break far less often, but will probably be caught reasonably fast once someone tries to use the buggy code, so testing them has comparatively <em>less value</em> than testing less common cases.</p>
<p>The best example I found was in the <a href="https://github.com/emanchado/tor/commit/46bbf6c015fac412b47ca56279002129a1c2b278#L0L720"><code class="syntax c">wrap_string</code> tests</a>. The relevant example was adding the string &#8220;A test of string wrapping&#8230;&#8221;, which wraps not to two lines, but three (the wrapping is done only on spaces, so &#8220;wrapping&#8230;&#8221; is taken as a single unit; in this sense, my test case could have been clearer and use a very long word, instead of a word followed by ellipsis). Most of the cases we&#8217;ll deal with will simply wrap a given word in two lines, but wrapping in three must work, too, and it&#8217;s much more likely to break if we decide to refactor or rewrite the code in that function, with the intention to keep the functionality intact.</p>
<p>See other examples of this in <a href="https://github.com/emanchado/tor/commit/aa20bce8006c9dccd8213db789855b59aee33ef4#L0L2084">aa20bce</a> (no tests with more than one consecutive newline, no tests with lines of only non-printable characters), <a href="https://github.com/emanchado/tor/commit/b248b3f#L0L1665">b248b3f</a> (no tests with just dots, no valid cases with more than one consecutive slash, no invalid cases with content other than slashes), <a href="https://github.com/emanchado/tor/commit/5e771ab4f3b3f91f1aaff8db0284d4a1700954a7#L0L1606">5e771ab</a> (no directories or hidden files), <a href="https://github.com/emanchado/tor/commit/f8ecac5#L0L303">f8ecac5</a> (invalid hex characters don&#8217;t fail, but produce strange behaviour instead; this test actually discovered a bug), <a href="https://github.com/emanchado/tor/commit/7856643#L0R321">7856643</a> (broken escaped content) and <a href="https://github.com/emanchado/tor/commit/87e9f89#L0R256">87e9f89</a> (trailing garbage).</p>
<h2>Not trying to make the tests fail</h2>
<p>This is related to the previous one, but the emphasis is on trying to choose tests that we think will fail (either now or in the future). My impression is that people often fail to do this because they are trying to prove that the code <em>works</em>, which misses the point of testing. The point is trying to prove the code <em>doesn&#8217;t</em> work. And <em>hope</em> that you fail at it, if you will.</p>
<p>The only example I could find was in the <a href="https://github.com/emanchado/tor/commit/03876f0a721ced6ffebb0c61134d5b8396d7600e#L0L616"><code class="syntax c">strcasecmpend</code> tests</a>. Note how there&#8217;s a test that checks that the last three characters of string &#8220;abcDEf&#8221; (ie. &#8220;DEf&#8221;) is less than &#8220;deg&#8221; when compared case-insensitively. That&#8217;s almost pointless, because if we made that same comparison case-sensitively (in other words, if the &#8220;case&#8221; part of the function breaks) the test still passes! Thus it&#8217;s much better to compare the strings &#8221;abcdef&#8221; and &#8220;Deg&#8221;.</p>
<h2>Addendum: trying to cover all cases in the tests</h2>
<p>There&#8217;s another problem I wanted to mention. I have seen several times before, although not in the Tor tests. The problem is making complicated tests that try to cover many/all cases. This seems to stem from the idea that having more test cases is good <em>by itself</em>, when actually more tests are only useful when they <em>increase the chances</em> to catch bugs. For example, if you write tests for a &#8220;sum&#8221; function and you&#8217;re <em>already</em> testing <code class="syntax python">[5, 6, 3, 7]</code>, it&#8217;s probably pointless to add a test for <code class="syntax python">[1, 4, 6, 5]</code>. A test that would increase the chances of catching bugs would probably look more like <code class="syntax python">[-4, 0, 4, 5.6]</code> or <code class="syntax python">[]</code>.</p>
<p>So what&#8217;s wrong with having more tests than necessary? The problem is they make the test suite slower, harder to understand at a glance and harder to review. If they don&#8217;t contribute anything to the chance of catching bugs anyway, why pay that price? But the biggest problem is when we try to cover so many test cases than the code <em>produces</em> the test data. In this cases, we have all the above problems, <em>plus</em> that the test suite becomes almost as complex as production code. Such tests become much easier to introduce bugs in, harder to follow the flow of, etc. The tests are our safety net, so we should be fairly sure that they work as expected.</p>
<p>And that&#8217;s the end of the tips. I hope they were useful :-)</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1322&amp;md5=9727c1870ad1435396033a337cef555b" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2012%2F02%2F15%2Funit-testing-advice-for-seasoned-hackers-22%2F&amp;language=en_GB&amp;category=text&amp;title=Unit+testing+advice+for+seasoned+hackers+%282%2F2%29&amp;description=This+is+the+second+part+of+my+unit+testing+advice.+See+the+first+part+on+this+blog.+If+you+need+any+introduction+you+should+really+read+the+first+part.+I%26%238217%3Bll...&amp;tags=automated+tests%2Cfree+software%2Copen+source%2Cprojects%2Csoftware%2Ctesting%2Ctests%2Ctips%2Ctor%2Cunit%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Unit testing advice for seasoned hackers (1/2)</title>
		<link>http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/</link>
		<comments>http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 23:48:23 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[automated tests]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1301</guid>
		<description><![CDATA[When reviewing tests written by other people I see patterns in the improvements I would make. As I realise that these &#8220;mistakes&#8221; are also made by experienced hackers, I thought it would be useful to write about them. The extra push to write about this now was having concrete examples from my recent involvement in Tor, [...]]]></description>
			<content:encoded><![CDATA[<p>When reviewing tests written by other people I see patterns in the improvements I would make. As I realise that these &#8220;mistakes&#8221; are also made by experienced hackers, I thought it would be useful to write about them. The extra push to write about this <em>now</em> was having concrete examples from my recent involvement in <a href="http://torproject.org/">Tor</a>, that will hopefully illustrate these ideas.</p>
<p>These ideas are presented in no particular order. Each of them has a brief explanation, a concrete example from the Tor tests, and, if applicable, pointers to other commits that illustrate the same idea. Before you read on, let me explicitly acknowledge that (1) I know that many people know these principles, but writing about them is a nice reminder; and (2) I&#8217;m fully aware that sometimes <em>I</em> need that reminder, too.</p>
<p><strong>Edit:</strong>  see the <a href="http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/">second part</a> of this blog.</p>
<h2>Tests as spec</h2>
<p>Tests are more useful if they can show how the code is supposed to behave, including safeguarding against future misunderstandings. Thus, it doesn&#8217;t matter if you <em>know</em> the current implementation will pass those tests or that those test cases won&#8217;t add more or different &#8220;edge&#8221; cases. If those test cases show better how the code behaves (and/or could catch errors if you rewrite the code from scratch with a different design), they&#8217;re good to have around.</p>
<p>I think the clearest example were the <a href="https://github.com/emanchado/tor/commit/8db0f914bfa1aeebed463dc2aa438ca8c87f73a0#L0L2279">tests for the <code class="syntax c">eat_whitespace*</code> functions</a>. Two of those functions end in <code class="syntax c">_no_nl</code>, and they only eat initial whitespace (except newlines). The other two functions eat initial whitespace, including newlines&#8230; but also eat comments. The tests from line 2280 on are clearly targeted at the second group, as they don&#8217;t really represent an interesting use case for the first. However, without those tests, a future maintainer could have thought that the <code class="syntax c">_no_nl</code> functions were supposed to eat whitespace too, and break the code. That produces confusing errors and bugs, which in turn make people fear touching the code.</p>
<p>See other examples in commits <a href="https://github.com/emanchado/tor/commit/b7b3b99acbeb29258e071b8f6c2a7d257a94ad99#L0L1552">b7b3b99</a> (escaped &#8216;%&#8217;, negative numbers, %i format string), <a href="https://github.com/emanchado/tor/commit/618836b3bb643db4af457a32cd8f2338153b5e88#L0L1516">618836b</a> (should an empty string be found at the beginning, or not found at all? does &#8220;\n&#8221; count as beginning of a line? can &#8220;\n&#8221; be found by itself? what about a string that expands more than one line? what about a line including the &#8220;\n&#8221;, with and without the haystack having the &#8220;\n&#8221; at the end?), <a href="https://github.com/emanchado/tor/commit/63b018eecea37ea5a09381157624a507a4a9187a">63b018ee</a> (how are errors handled? what happens when a %s gets part of a number?), <a href="https://github.com/emanchado/tor/commit/2210f18cee86cf17817b386aeca1af2cd0b1f249#L0L1131">2210f18</a> (is a newline only \r\n or \n, or any combination or \r and \n?) and <a href="https://github.com/emanchado/tor/commit/46bbf6c015fac412b47ca56279002129a1c2b278#L0L654">46bbf6c</a> (check that all non-printable characters are escaped in octal, even if they were originally in hex; check that characters in octal/hex, when they&#8217;re printable, appear directly and not in octal).</p>
<h2>Testing boundaries</h2>
<p>Boundaries of different kinds are a typical source of bugs, and thus are among the best points of testing we have. It&#8217;s also good to test <em>both</em> sides of the boundaries, both as an example and because bugs can appear on both sides (and not necessarily at once!).</p>
<p>The best example are the <a href="https://github.com/emanchado/tor/commit/770fd9f#L0R1484">tor_strtok_r_impl tests</a> (a function that is supposed to be compatible with <code class="syntax c">strtok_r</code>, that is, it chops a given string into &#8220;tokens&#8221;, separated by one of the given separator characters). In fact, these extra tests discovered an actual bug in the implementation (ie. an incompatibility with <code class="syntax c">strtok_r</code>). Those extra tests asked a couple of interesting questions, including &#8220;when a string <em>ends</em> in the token separator, is there an empty token in the end?&#8221; in the &#8220;howdy!&#8221; example. This test can also be considered valuable as in &#8220;tests as spec&#8221;, if you consider that the answer to be above question is not obvious and both answers could be considered correct.</p>
<p>See other examples in commits <a href="https://github.com/emanchado/tor/commit/5740e0fc1f00fa91be107ee6c4315d114c5ffdc4#L0L598">5740e0f</a> (checking if <code class="syntax c">tor_snprintf</code> correctly counts the number of bytes, as opposed the characters, when calculating if something can fit in a string; also note my embarrassing mistake of testing <code class="syntax c">snprintf</code>, and not <code class="syntax c">tor_snprintf</code>, later in the same commit), <a href="https://github.com/emanchado/tor/commit/46bbf6c015fac412b47ca56279002129a1c2b278#L0L637">46bbf6c</a> (check that character 21 doesn&#8217;t make a difference, but 20 does) and <a href="https://github.com/emanchado/tor/commit/725d6ef37909080a3d2c5bc25245ea0e951882f2#L0L2217">725d6ef</a> (testing 129 is very good, but even better with 128—or, in this case, 7 and 8).</p>
<h2>Testing implementation details</h2>
<p>Testing implementation details tends to be a bad idea. You can usually argue you&#8217;re testing implementation details if you&#8217;re not getting the test information from the APIs provided by whatever you&#8217;re testing. For example, if you test some API that inserts data in a database by checking the database directly, or if you test the result of a method call was correct by checking the object&#8217;s internals or calling protected/private methods. There are two reasons why this is a bad idea: first, the more implementation details you tests depend on, the less implementation details you can change without breaking your tests; second, your tests are typically less readable because they&#8217;re cluttered with details, instead of <em>meaningful</em> code.</p>
<p>The only example I encountered of this in Tor were the <a href="https://github.com/emanchado/tor/commit/c4c1d56d96623a45775ec2544c0c6951fbfa2d9f#L0L968">compression tests</a>. In this case it wasn&#8217;t a big deal, really, but I have seen this before in much worse situations and I feel this illustrates the point well enough. The problem with that deleted line is that it&#8217;s not clear what&#8217;s it&#8217;s purpose (it needs a comment), plus it uses a magic number, meaning if someone ever changes that number by mistake, it&#8217;s not obvious if the problem is the code or the test. Besides, <em>we are already checking that the magic number is correct</em>, by calling the <code class="syntax c">detect_compression_method</code>. Thus, the deleted <code class="syntax c">memcmp</code> doesn&#8217;t add any value, and makes our tests harder to read. Verdict: delete!</p>
<p><em>I hope you liked the examples so far. My next post will contain the second half of the tips.</em></p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1301&amp;md5=f51edc2b2e4df2bc4e424b096b2bbe01" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2012%2F02%2F13%2Funit-testing-advice-for-seasoned-hackers-12%2F&amp;language=en_GB&amp;category=text&amp;title=Unit+testing+advice+for+seasoned+hackers+%281%2F2%29&amp;description=When+reviewing+tests+written+by+other+people+I+see+patterns+in+the+improvements+I+would+make.+As+I+realise+that+these+%26%238220%3Bmistakes%26%238221%3B+are+also+made+by+experienced+hackers%2C+I+thought...&amp;tags=automated+tests%2Cfree+software%2Copen+source%2Cprojects%2Csoftware%2Ctesting%2Ctests%2Ctips%2Ctor%2Cunit%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Book summary: Designing with the Mind in Mind</title>
		<link>http://hcoder.org/2012/01/10/book-summary-designing-with-the-mind-in-mind/</link>
		<comments>http://hcoder.org/2012/01/10/book-summary-designing-with-the-mind-in-mind/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 23:10:26 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Book summaries]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[uxbookclub]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1259</guid>
		<description><![CDATA[This is my summary of &#8220;Designing with the Mind in Mind&#8221; by Jeff Johnson, a book about user interface design that explores the reasons why those principles work. Introduction How valuable are UI design guidelines depends on who applies them. They often describe goals, not actions, so they can&#8217;t be followed like a recipe. They [...]]]></description>
			<content:encoded><![CDATA[<p>This is my summary of &#8220;Designing with the Mind in Mind&#8221; by Jeff Johnson, a book about user interface design that explores the reasons why those principles work.</p>
<h2>Introduction</h2>
<p>How valuable are UI design guidelines depends on who applies them. They often describe goals, not actions, so they can&#8217;t be followed like a recipe. They also often conflict with each other. This book tries to give rationale to make them easier to apply.</p>
<h2>Visual content</h2>
<ul>
<li><em>Structure</em>: Gestalt principles (proximity, similarity, continuity, closure, symmetry, figure/ground, common fate), see on p. 11-22. They act together, and sometimes they produce effects we <em>don&#8217;t</em> want: review designs with each of these principles in mind to see if they suggest a relationship that shouldn&#8217;t be there.</li>
<li><em>Text</em>: we&#8217;re wired for language, but not for reading. Typical text-related mistakes: geek-speak, tiny fonts (if the text is hard to read, it probably won&#8217;t be read, so you might as well remove it), burying important information in repetition, and using just too much text (use just enough to help most users get to their intended goals).</li>
<li><em>Colour</em>: our vision is optimised to detect contrasts (edges), and our ability to distinguish colours depends on how they are presented (colours are harder to distinguish if they&#8217;re pale, in small/thin patches or separated from each other). Guidelines for colour: (1) distinguish by saturation/brightness, not only hue, (2) use distinctive colours (red, green, yellow, blue, black and white), (3) avoid colour pairs that colour-blinds can&#8217;t distinguish (tips on p.59-60, including <a href="http://www.vischeck.com/">http://www.vischeck.com/</a>), (4) don&#8217;t rely on colour alone, and (5) don&#8217;t place strong opponent colours next to each other (see p. 62).</li>
<li><em>Peripheral vision</em>: we only have good resolution in the centre of wherever we&#8217;re looking. Peripheral vision (1-2 centimetres from peripheral vision) mostly only provides cues for our eye movement (good example of bad error message, based on this, on p. 71). To make an error message visible: (1) put it where users are looking, (2) mark it (often it&#8217;s enough placing it next to what it refers to), (3) use an error symbol/icon, and (4) reserve red for errors. Heavy artillery (use with care!): (1) pop-ups, (2) sound (makes users scan the screen for errors; make sure they can hear it!), (3) motion or blinking (but not for more than a quarter- or half-second).</li>
<li><em>Visual hints</em>: use pictures where possible to convey function (quicker to recognise; memorable icons hint at their meaning, are distinguishable from others and consistently mean the same even across applications); thumbnails depict full-sized images effectively if they keep features; use visual cues to let users recognise where they are (distinctive visual style, colours, etc).</li>
</ul>
<h2>Expectations</h2>
<p>Our perception is biased by our experience, current context and goals. Implications: (1) test your design to make sure different users interpret it in the same way; (2) be consistent with position, colours and font for elements that serve the same function; and (3) understand your users&#8217; goals (they can be different, too!) and make sure you support them by making relevant information clearly visible at every stage.</p>
<h2>Memory</h2>
<p>We&#8217;re much better at recognising than at remembering (&#8220;see and choose&#8221; is easier than &#8220;recall and type&#8221;). Tips: (1) avoid modes, or if you can&#8217;t, show the current mode clearly; (2) show search terms when showing search results (they&#8217;re easy to forget if we get interrupted for whatever reason); (3) when showing instructions for a multi-step process, make sure the instructions are there while following the steps.</p>
<h2>Attention and goals</h2>
<p>When people focus their attention on their tools, it is pulled away from the details of the task. Software applications should not call attention to themselves. Short-term memory and attention are very limited, so don&#8217;t rely on them. Instead indicate what users have done versus what they have not yet done, and/or allow users to mark or move objects to indicate which ones they have worked on versus the rest.</p>
<p>Support people&#8217;s goal-execute-evaluate cycle: provide clear paths, including initial steps, for the <em>goal</em>; software concepts should be focused on the task rather than implementation, for the <em>execution</em>; provide feedback and status information to show users their progress towards their goal, and allow users to back out of tasks that didn&#8217;t take them toward their goal, for <em>evaluation</em>.</p>
<p>While pursuing a goal, people only notice things that seem related to it, and take familiar paths whenever possible rather than exploring new ones, esp. when working under deadlines. After they&#8217;re done, they often forget cleanup steps: design software so that users don&#8217;t need to remember, or at least to remind them.</p>
<p>Misc. tips:</p>
<ul>
<li>Don&#8217;t expect users to deduce information, tell them explicitly what they need to know.</li>
<li>Don&#8217;t make users diagnose system problems. They don&#8217;t have the skills.</li>
<li>Minimise the number and complexity of settings. People are really bad at optimising combinations of settings.</li>
<li>Let people use perception rather than calculation, when possible (some problems, when presented graphically, allow people to achieve their goals with quick perceptual estimates instead of calculations).</li>
<li>Make the system familiar (concepts, terminology, graphics), by following industry standards, by making the software work like an older application the user know, or by basing the design on metaphors.</li>
<li>Let the computer do the math, don&#8217;t make people calculate things the computer can calculate for them.</li>
</ul>
<h2>Learning</h2>
<p>We learn faster when operation and vocabulary is task-focused, and when risk is low:</p>
<ul>
<li>Task-focused operation: you have to understand the users&#8217; goals in order to reduce the gap between what the user wants and the operations supported by the tool is called &#8220;the gulf of execution&#8221;. To understand goals: perform a task analysis (checklist on p. 135) and design a task-focused conceptual model (the list of objects/actions analysis the user should know about).  The second should be as simple as possible (ie. less concepts), avoid overlapping concepts, and not have things &#8220;just in case&#8221;. Only then sketch and design a user interface, based strictly on the task analysis.</li>
<li>Task-focused vocabulary: it should be familiar and consistent (&#8220;same name, same thing; different name, different thing&#8221;), mapped 1:1 to the concepts.</li>
<li>Low risk: often people are afraid of being &#8220;burned&#8221; and don&#8217;t learn or explore. People make mistakes, so systems should try to prevent errors where possible, make errors easy to detect by showing users what they have done, and allow users to undo/reverse easily.</li>
</ul>
<h2>Responsive systems</h2>
<p>Responsiveness is not the same as performance, it can&#8217;t be fixed by having faster machines/software. Principles:</p>
<ul>
<li>Let you know immediately your input was received</li>
<li>Provide some indication of how long operations will take</li>
<li>Free you to do other things while waiting</li>
<li>Manage queued events intelligently</li>
<li>Perform housekeeping and low-priority tasks in the background</li>
<li>Anticipate your most common requests</li>
</ul>
<p>When showing progress indicators (always an operation takes longer than a few seconds): show work <em>remaining</em>; total progress, not progress on the current step; start percentages at 1%, not 0% (and display 100% only briefly at the end); show smooth, linear progress, not erratic bursts; use human-scale precision, not computer precision (&#8220;about 4 minutes&#8221; better than &#8220;240 seconds&#8221;).</p>
<p>Display important information first. Don&#8217;t wait to have all the information to show everything at once.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1259&amp;md5=0525456523d019080ee5bc3839bedfaf" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2012/01/10/book-summary-designing-with-the-mind-in-mind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2012%2F01%2F10%2Fbook-summary-designing-with-the-mind-in-mind%2F&amp;language=en_GB&amp;category=text&amp;title=Book+summary%3A+Designing+with+the+Mind+in+Mind&amp;description=This+is+my+summary+of+%26%238220%3BDesigning+with+the+Mind+in+Mind%26%238221%3B+by+Jeff+Johnson%2C+a+book+about+user+interface+design+that+explores+the+reasons+why+those+principles+work.+Introduction+How...&amp;tags=books%2Cux%2Cuxbookclub%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Emacs adventures</title>
		<link>http://hcoder.org/2011/11/28/emacs-adventures/</link>
		<comments>http://hcoder.org/2011/11/28/emacs-adventures/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 00:09:46 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1232</guid>
		<description><![CDATA[I have been using Emacs for over a year now. I actually didn&#8217;t learn a lot when I started using it (just the basics to get going and then some relatively common keyboard shortcuts), but lately I have been reading and learning much more about it. I&#8217;m so grateful by everything I&#8217;ve learned from different [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using <a href="http://www.gnu.org/software/emacs/">Emacs</a> for over a year now. I actually didn&#8217;t learn a lot when I started using it (just the basics to get going and then some relatively common keyboard shortcuts), but lately I have been reading and learning much more about it. I&#8217;m so grateful by everything I&#8217;ve learned from different people on the net that I wanted to share a couple of things I&#8217;ve learned, and a simple major mode for editing <a href="http://www.methods.co.nz/asciidoc">AsciiDoc</a> documents.</p>
<p>As a long-time VIM user, I feel it&#8217;s my duty to make a micro-introduction to Emacs to VIM users (skip this whole paragraph if you&#8217;re not one of them). Emacs is so different than VIM that the comparison doesn&#8217;t even make complete sense, but Emacs does have many sweet, sweet features that might tempt VIM users. And let me make this clear: Emacs, in its default configuration, is <em>rubbish</em>. If you don&#8217;t like the idea of customising your editor, learning about it, discovering new tricks, &#8220;plugins&#8221; and shortcuts and maybe even writing your own extensions&#8230; use a different editor (eg. I find VIM way better than Emacs on the default configuration). Likewise, if you don&#8217;t learn VIM properly and don&#8217;t learn the gazillion shortcuts to fly around your code while you stay on the home row&#8230; use a different editor. With that out of the way&#8230;</p>
<p>A lot of what I&#8217;ve learned lately I&#8217;ve learned from a handful of websites and Twitter accounts, listed here:</p>
<ul>
<li><a href="http://emacswiki.org/">EmacsWiki</a>: you probably already know this one, but it&#8217;s pretty useful for a variety of reasons.</li>
<li><a href="http://www.emacsrocks.com/">EmacsRocks</a> / <a href="https://twitter.com/#!/emacsrocks">@Emacsrocks</a>: it&#8217;s a series of screencasts showing off cool, advanced Emacs features. Each screencast is very short and focused on one thing. Instant awesome.</li>
<li><a href="http://emacsrookie.com/">EmacsRookie</a> / <a href="https://twitter.com/#!/emacsrookie">@EmacsRookie</a>: a blog with articles about different Emacs trips &amp; tricks and features. More geared towards beginners (but my impression is that many people stay &#8220;beginners&#8221; of Emacs for quite a long time).</li>
<li>Steve Yegge described &#8220;<a href="http://sites.google.com/site/steveyegge2/effective-emacs">10 Specific Ways to Improve Your Productivity With Emacs</a>&#8220;. In particular, I&#8217;d recommend making Caps-Lock behave as an extra Control key (I didn&#8217;t swap, I just have one more Control key), invoke M-x without the Meta key (both C-x C-m and C-c C-m) and being comfortable with the buffer commands. For navigation, apart from incremental search, you can also use <a href="http://www.emacswiki.org/emacs/AceJump">ace-jump</a>.</li>
<li>Christian Johansen has an <a href="http://cjohansen.no/an-introduction-to-elisp">interesting intro article to Emacs Lisp</a>.</li>
<li>Other Twitter accounts worth following are <a href="https://twitter.com/#!/emacs_knight">@emacs_knight</a>, <a href="https://twitter.com/#!/dotemax">@dotemax</a> and <a href="https://twitter.com/#!/learnemacs">@learnemacs</a>.</li>
</ul>
<p>In particular, things I have learned that I thought would be cool to share:</p>
<ul>
<li>The <a href="https://github.com/bbatsov/zenburn-emacs">zenburn</a> colour theme. I didn&#8217;t really like any of the colour themes that come with Emacs. And although I did see <a href="http://ethanschoonover.com/solarized">solarized</a>, I thought it looked like crap on Emacs (<em>very</em> different from the screenshots, maybe it only works properly on Emacs 24?).</li>
<li><a href="http://www.emacswiki.org/emacs/HippieExpand">hippie-expand</a> is a pretty cool completion system, familiarise yourself with it.</li>
<li>If you code Perl, you should be using <a href="http://www.emacswiki.org/emacs/CPerlMode">cperl-mode</a>, not the default Perl mode.</li>
<li>If you code Javascript, you should be using <a href="https://github.com/mooz/js2-mode">js2-mode</a>, not the default Javascript mode. Also have a look at <a href="https://github.com/emanchado/Emacs-directory/blob/master/dot-emacs#L162">my js2-mode configuration</a>, you might want to do some of the same tweaks.</li>
<li>If you have to do anything with XML, make sure you use <a href="http://www.emacswiki.org/emacs/NxmlMode">nxml-mode</a>, including its awesome feature to validate an XML document against a schema.</li>
<li><a href="http://www.emacswiki.org/emacs/Yasnippet">yasnippet</a>. Very cool snippet system. Just have a look at the <a href="http://www.emacsrocks.com/e06.html">EmacsRocks screencast on yasnippet</a>.</li>
<li><a href="http://www.emacswiki.org/emacs/KeyChord">key-chord</a>. Allows you to assign shortcuts to &#8220;key chords&#8221; (two keys pressed at the same time). Very comfy esp. if you miss some VIM shortcuts and want certain operations more VIM-like. Also seen on EmacsRocks, and again just check out the <a href="http://www.emacsrocks.com/e07.html">EmacsRocks screencast on key-chord</a>.</li>
<li>And speaking of VIM, have a look at <a href="http://www.emacswiki.org/emacs/IyGoToChar">iy-go-to-char</a>, again seen in EmacsRocks (on <a href="http://www.emacsrocks.com/e04.html">episode 4</a>). Hint: this works best when combined with key chords.</li>
</ul>
<p>And last but not least, I have been writing an <a href="https://github.com/emanchado/asciidoc-mode">Emacs major mode for editing AsciiDoc</a> documents (it currently only implements syntax highlighting, which I think is the most important part of a format like AsciiDoc). For that I basically followed the <a href="http://www.emacswiki.org/emacs-es/ModeTutorial">major mode tutorial</a> and then tweaked the multi-line region matching code (for code blocks and such) by setting the <code>font-lock-extend-region-functions</code> variable to a function that appropriately extends the region to be highlighted. If you&#8217;re interested, just have a look at my function <a href="https://github.com/emanchado/asciidoc-mode/blob/master/asciidoc-mode.el#L46">asciidoc-font-lock-extend-region</a>, essentially copied from some other mode. As a last tip for writing syntax highlighting for major modes, don&#8217;t miss <a href="http://www.emacswiki.org/emacs/ReBuilder">re-builder</a>, it&#8217;s pure gold for testing your regular expressions!</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1232&amp;md5=8e7b0e966d58de1126d62db68b482323" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/11/28/emacs-adventures/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2011%2F11%2F28%2Femacs-adventures%2F&amp;language=en_GB&amp;category=text&amp;title=Emacs+adventures&amp;description=I+have+been+using+Emacs+for+over+a+year+now.+I+actually+didn%26%238217%3Bt+learn+a+lot+when+I+started+using+it+%28just+the+basics+to+get+going+and+then+some...&amp;tags=editors%2Cemacs%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Pragmatic Thinking &amp; Learning, Wikis and Javascript</title>
		<link>http://hcoder.org/2011/10/24/pragmatic-thinking-learning-wikis-and-javascript/</link>
		<comments>http://hcoder.org/2011/10/24/pragmatic-thinking-learning-wikis-and-javascript/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 21:36:25 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[markdown]]></category>
		<category><![CDATA[pet]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[wikis]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1207</guid>
		<description><![CDATA[After so much &#8220;slacking&#8221; (just posting book summaries) I&#8217;m trying to go back to regular blogging. Remember my summary of Pragmatic Thinking &#38; Learning? There are many exercises and pieces of advice in that book that I have been trying to practice. One of the things I decided to go for was having a personal [...]]]></description>
			<content:encoded><![CDATA[<p>After so much &#8220;slacking&#8221; (just posting book summaries) I&#8217;m trying to go back to regular blogging. Remember <a href="http://hcoder.org/2011/10/10/book-summary-pragmatic-thinking-learning/">my summary of Pragmatic Thinking &amp; Learning</a>? There are many exercises and pieces of advice in that book that I have been trying to practice. One of the things I decided to go for was having a <a href="http://en.wikipedia.org/wiki/Personal_wiki">personal wiki</a>. One of the reasons being, in all honesty, that I had always wanted to have one. Another reason being that my pet TODO application, <a href="https://bitbucket.org/emanchado/bubug/wiki/Home">Bubug</a>, had finally died after some Debian update (some retarded Ruby module broke compatibility with the version I was using, or something; couldn&#8217;t care to investigate). And yet another reason, well, to have a new small pet project and follow my obsession with learning Javascript, and especially <a href="http://nodejs.org/">Node</a>. And that I wanted to give <a href="https://no.de/">Joyent&#8217;s free Node service</a> a try!</p>
<p>But enough with the reasons. It&#8217;s starting to look like it was a pretty useful mini-project. Not just because I learned a bit more Javascript, the excellent <a href="http://expressjs.com/">express</a> web development framework and other things, but also because the result itself, even though it didn&#8217;t take long to develop (and it was pretty fun, even!), feels useful. It feels like a nice place to put all my notes, TODOs, random ideas for projects, etc. A similar feeling of freedom as when I started using my first <a href="http://en.wikipedia.org/wiki/Moleskine">Moleskine</a>. Not that I would ditch paper for computer-<em>anything</em>, but it&#8217;s useful and freeing in its own way, for specific purposes.</p>
<p>About the technology, I used the <a href="http://en.wikipedia.org/wiki/Markdown">Markdown</a> format for the pages thanks to the <a href="https://github.com/evilstreak/markdown-js">markdown-js library</a> (it&#8217;s really nice that the module has an intermediate tree format that you can parse to add your own stuff before converting to HTML, like e.g. wikipage links!), <a href="http://expressjs.com/">express</a> for the whole application structure and <a href="http://code.google.com/p/js-test-driver/">js-test-driver</a> + <a href="http://cjohansen.no/en/javascript/jstdutil_a_ruby_wrapper_over_jstestdriver">jsautotest</a> + a bit of syntax sugar from <a href="http://sinonjs.org/">Sinon.js</a> for the tests (but looking forward to trying out <a href="http://busterjs.org/">Buster.js</a> when it&#8217;s released!). The deployment to Joyent&#8217;s Node.js SmartMachine was reasonably easy. Actually, it was pretty easy once I figured the following:</p>
<ul>
<li>You must not forget to listen in the correct port, with <code class="syntax javascript">server.listen(process.env.PORT || 8001)</code></li>
<li>There are a couple of pretty useful <a href="http://wiki.joyent.com/display/node/Getting+Started+with+a+Node.js+SmartMachine#GettingStartedwithaNode.jsSmartMachine-SSHaccess">Node.js-related command-line utilities</a> to check logs, restart applications and so on</li>
<li>The configuration of the application can be done via <code class="syntax">npm config</code>, see <a href="http://wiki.joyent.com/display/node/npm+Integration">npm integration on Joyent&#8217;s Wiki</a></li>
</ul>
<p>If you&#8217;re curious to see the code, play with it or use it yourself, take a peek to the <a href="https://github.com/emanchado/Wiki-toki">Wiki-Toki repository</a> on GitHub. Happy hacking!</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1207&amp;md5=666f11f6b9488a0fae815494decab83b" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/10/24/pragmatic-thinking-learning-wikis-and-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2011%2F10%2F24%2Fpragmatic-thinking-learning-wikis-and-javascript%2F&amp;language=en_GB&amp;category=text&amp;title=Pragmatic+Thinking+%26%23038%3B+Learning%2C+Wikis+and+Javascript&amp;description=After+so+much+%26%238220%3Bslacking%26%238221%3B+%28just+posting+book+summaries%29+I%26%238217%3Bm+trying+to+go+back+to+regular+blogging.+Remember+my+summary+of+Pragmatic+Thinking+%26amp%3B+Learning%3F+There+are+many+exercises+and+pieces...&amp;tags=books%2Cdevelopment%2Cgithub%2Cjavascript%2Cmarkdown%2Cpet%2Cprogramming%2Cprojects%2Cwikis%2Cblog" type="text/html" />
	</item>
		<item>
		<title>My short experience with GNOME 3</title>
		<link>http://hcoder.org/2011/10/18/my-short-experience-with-gnome-3/</link>
		<comments>http://hcoder.org/2011/10/18/my-short-experience-with-gnome-3/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 17:11:21 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1200</guid>
		<description><![CDATA[After not having blogged about anything but book summaries lately, I thought it was about time to write something else :-) EDIT: Added the last point, the most important one! I had been thinking of trying out GNOME 3 since it was released. For a number of reasons, I only managed to give it a try [...]]]></description>
			<content:encoded><![CDATA[<p>After not having blogged about anything but book summaries lately, I thought it was about time to write something else :-) <strong>EDIT:</strong> Added the last point, the most important one!</p>
<p>I had been thinking of trying out GNOME 3 since it was released. For a number of reasons, I only managed to give it a try a couple of days ago. I normally use KDE 4, but wanted to see how GNOME was doing these days, and wanted to see if it was something I could maybe switch to. I have to say I quite liked some of the stuff I saw, but I don&#8217;t think I can switch. My reasons:</p>
<ul>
<li>Language switcher keyboard combination: I just couldn&#8217;t find any combination I could use. Everything conflicted with some other combination I use (esp. in Emacs). Having to change the keymap by clicking on the top bar didn&#8217;t sound sane to me.</li>
<li>Order of the OK/Cancel buttons: even if I switched, I would probably use a combination of systems. Having to train my brain to look for the buttons in a different position seemed like too much.</li>
<li>Rhythmbox seemed plain, clunky and hard to use. It seemed hard for me to do what I wanted, plus it crashed consistently while trying to listen to some podcast.</li>
<li>I kind of like the idea of how workspaces work (even though I have to radically change the way I use them to adapt to them), but for me it&#8217;s too much that both (a) closing the last window makes the workspace disappear and (b) you can&#8217;t create workspaces &#8220;above&#8221;. That is a deal-breaker for me.</li>
<li>Can&#8217;t create workspaces on the right or left? I could get used to that probably, but it added up to my frustrations with GNOME 3 workspaces.</li>
<li>Constant repainting issues.</li>
<li>Can&#8217;t make sense of the window traversing. Let&#8217;s say I have two virtual desktops, one with a browser and another one with two terminals. The focus is on one of the terminals, and I want to go to the other terminal (with the keyboard, of course). If I just press Ctrl-Tab GNOME takes me to the web browser in the other desktop! If I want to go to the other terminal, I have to press Ctrl-Tab, Shift-Ctrl-Tab to go back to the terminal, arrow down to see all the terminal windows, arrow right to go to the next terminal. It&#8217;s even worse when I have Opera in one virtual desktop (maximised) with the error console in the same desktop. As Opera is maximised, I can&#8217;t even click with the mouse, so the only way to switch to the error console I can think of is doing the dance described above. Am I missing something, is this for real? <em><strong>EDIT:</strong> I was told about Ctrl-` (changes between windows of the same application). Cute attempt, but I don&#8217;t think I can get used to thinking if I have to use Ctrl-TAB or Ctrl-`. So that remains &#8220;impossible to use&#8221; for me.</em></li>
</ul>
<p>I wonder if some GNOME user can shed light on some of those issues, although it doesn&#8217;t seem like I can find a solution for all my frustrations :-)</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1200&amp;md5=2b689ff07a471e40a46cc5620c4e82ce" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/10/18/my-short-experience-with-gnome-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2011%2F10%2F18%2Fmy-short-experience-with-gnome-3%2F&amp;language=en_GB&amp;category=text&amp;title=My+short+experience+with+GNOME+3&amp;description=After+not+having+blogged+about+anything+but+book+summaries+lately%2C+I+thought+it+was+about+time+to+write+something+else+%3A-%29+EDIT%3A%C2%A0Added+the+last+point%2C+the+most+important+one%21+I...&amp;tags=desktop%2Cgnome%2Clinux%2Csoftware%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Book review: Javascript Web Applications</title>
		<link>http://hcoder.org/2011/09/20/book-review-javascript-web-applications/</link>
		<comments>http://hcoder.org/2011/09/20/book-review-javascript-web-applications/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 20:42:17 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1168</guid>
		<description><![CDATA[This is my review of &#8220;Javascript Web Applications&#8221; by Alex MacCaw, part of the O&#8217;Reilly Blogger Review Program (in a nutshell: you can choose an ebook from a given selection, and you get it for free if you make a review and post it in any consumer site). It&#8217;s a book about using Javascript to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://oreilly.com/bloggers/"><img src="http://cdn.oreilly.com/bloggers/blogger-review-badge-200.png" alt="I review for the O'Reilly Blogger Review Program" width="200" height="150" align="right" border="0" /></a> This is my review of &#8220;<a href="http://shop.oreilly.com/product/0636920018421.do">Javascript Web Applications</a>&#8221; by <a href="http://alexmaccaw.co.uk/">Alex MacCaw</a>, part of the O&#8217;Reilly Blogger Review Program (in a nutshell: you can choose an ebook from a given selection, and you get it for free if you make a review and post it in any consumer site). It&#8217;s a book about using Javascript to write (mostly) client-side web applications. The book cover says &#8220;jQuery Developers&#8217; Guide to Moving State to the Client&#8221;, which is somewhat misleading: although most examples that could be written with jQuery <em>are</em> written with jQuery, it&#8217;s a book that anyone interested in Javascript can use, enjoy and learn from, regardless of their library of choice. It doesn&#8217;t even assume you know jQuery, and there&#8217;s a whole appendix dedicated to introducing the reader to the library, should she need it.</p>
<h2>Structure</h2>
<p>The book teaches how to write web applications using Javascript, always following the MVC pattern. It&#8217;s divided in four parts:</p>
<ol>
<li>The first two chapters serve as an introduction to both the MVC pattern and the Javascript language. Although this book is not aimed at total Javascript newbies, you don&#8217;t have to know that much to follow the book. For example, it explains prototypes and constructor functions.</li>
<li>Chapters 3 to 5 cover the implementation details of MVC in Javascript (one chapter for the Model, another for the Controller and the last one about the View).</li>
<li>Chapters 6 to 10 cover many practicalities of client-side web development, like dependency management, unit testing, debugging, interesting browser APIs and deployment tips.</li>
<li>The last three chapters cover Javascript libraries: Spine, Backbone and JavascriptMVC.</li>
</ol>
<p>Additionally, there are three appendices covering <a href="http://jquery.org">jQuery</a>, <a href="http://lesscss.org/">Less</a> and CSS3.</p>
<h2>Highlights and references</h2>
<ul>
<li>Chapter 10 (&#8220;Deploying&#8221;) is full of very good tips and information.</li>
<li>Both the Backbone and the JavascriptMVC chapters were brilliant, looking forward to use any of them soon.</li>
<li>All the <a href="https://github.com/maccman/book-assets">example code</a> is on GitHub.</li>
<li>Page 24: &#8220;The secret to making large Javascript applications is not make large Javascript applications&#8221;.</li>
<li><a href="http://plugins.jquery.com/project/HJS">HJS plugin</a> for jQuery for a nice syntax to create classes.</li>
<li><a href="https://github.com/kriskowal/es5-shim">ES5-shim</a> for browsers that don&#8217;t support Ecmascript 5 yet.</li>
<li>Chapter 2 was a very good introduction about events. removeEventListener (p. 41), stopPropagation/preventDefault (p. 43), list of properties (p. 44), load vs. DOMContentLoaded (p. 45), delegating events (p. 46) and custom events (p. 47-49), among others.</li>
<li>Reference to <a href="http://michaux.ca/articles/javascript-namespacing">blog post about namespacing</a>.</li>
<li>Object.create discussed on page 55.</li>
<li>Using URL hash for URLs on pages 82, 83.</li>
<li>Didn&#8217;t really understand the explanation for the HTML5 history API on p. 85. Alternatively, see the <a href="http://dev.opera.com/articles/view/introducing-the-html5-history-api/">HTML5 history API</a> on Dev Opera.</li>
<li>Very interesting file API on p. 103 and p. 111. Forget the drag-n-drop (<a href="http://www.quirksmode.org/blog/archives/2009/09/the_html5_drag.html">reason</a>) and the copy/paste.</li>
<li>Tips about when to load your Javascript on p. 156.</li>
<li>The JavascriptMVC chapter was brilliant, see p. 208-213 for the class syntax (nicer and more compact, supports this._super()), p. 210 for instrospection and namespaces, p. 211, 212 for model attributes and observables, and p. 213 for setters. Very cool server encapsulation on p. 215. Type conversion and CRUD events on p. 218. JMVC views on p. 219. Templated actions and final example on p. 226-228.</li>
</ul>
<p>Note that all page references are pages in the PDF file, not pages in the book!</p>
<h2>Wrapping up</h2>
<p>This book is packed with very practical information and <em>a lot</em> of code that will teach you how to write applications in Javascript. It builds up from relatively simple code to more advanced stuff, including tips, use of libraries, etc. It&#8217;s one of those books that makes you want to play with all the stuff you&#8217;re learning, and try it all in your next project.</p>
<p>However, sometimes the amount of code makes the book hard to read. Some parts (eg. beginning of the chapter about controllers) are a bit tiring as you have to read and understand so much code, esp. if you&#8217;re not that used to reading more-or-less advanced Javascript. It also lacks information about some important tools like <a href="http://www.opera.com/dragonfly/">Dragonfly</a> (it almost feels like there&#8217;s nothing for developing with Opera) or <a href="http://code.google.com/p/js-test-driver/">js-test-driver</a>.</p>
<p>In summary, this is the perfect book if you know <em>a bit</em> of Javascript and want to learn modern techniques and libraries that will get you started in <em>serious</em> client-side programming. <em>Especially</em> if you are one of those server-side programmers that don&#8217;t like Javascript but has to use it anyway (because despite all its warts, it&#8217;s a really nice language!). If you&#8217;re a Javascript wizard and you have been developing client-side code for years, this book may not be for you.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1168&amp;md5=083124645c164fd06570fbd5e5ccfc84" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/09/20/book-review-javascript-web-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2011%2F09%2F20%2Fbook-review-javascript-web-applications%2F&amp;language=en_GB&amp;category=text&amp;title=Book+review%3A+Javascript+Web+Applications&amp;description=This+is+my+review+of+%26%238220%3BJavascript+Web+Applications%26%238221%3B+by+Alex+MacCaw%2C+part+of+the+O%26%238217%3BReilly+Blogger+Review+Program+%28in+a+nutshell%3A+you+can+choose+an+ebook+from+a+given+selection%2C...&amp;tags=books%2Cjavascript%2Cprogramming%2Creview%2Cweb%2Cblog" type="text/html" />
	</item>
		<item>
		<title>LeakFeed and &lt;angular/&gt;</title>
		<link>http://hcoder.org/2011/09/15/angular/</link>
		<comments>http://hcoder.org/2011/09/15/angular/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 20:37:35 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Freedom]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[automated tests]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jasmine]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1128</guid>
		<description><![CDATA[A couple of week ago I discovered LeakFeed, an API to fetch cables from Wikileaks. I immediately thought it would be cool to play a bit with it and create some kind of application. After a couple of failed ideas that didn&#8217;t really take off, I decided to exploit my current enthusiasm for Javascript and [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of week ago I discovered <a href="http://www.leakfeed.com/">LeakFeed</a>, an API to fetch cables from <a href="http://www.wikileaks.org/">Wikileaks</a>. I immediately thought it would be cool to play a bit with it and create some kind of application. After a couple of failed ideas that didn&#8217;t really take off, I decided to exploit my current enthusiasm for Javascript and build something without a server. Other advantages were that I knew <a href="http://angularjs.org/">Angular</a>, an HTML &#8220;power up&#8221; written in Javascript (what else?), which I knew it would ease the whole process a lot, and I even got the chance to learn how to use Twitter&#8217;s excellent <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> HTML and CSS toolkit.</p>
<p>What I decided to build is a very simple interface to search for leaked cables. I called it <a href="http://emanchado.github.com/leakyleaks.html">LeakyLeaks</a> (see the <a href="https://github.com/emanchado/LeakyLeaks">code on GitHub</a>). Unfortunately the LeakFeed API is quite limited, so I had to limit my original idea. However, I think the result is kind of neat, especially considering the little effort. To build it, I started writing support classes and functions using Test-Driven Development with <a href="http://pivotal.github.com/jasmine/">Jasmine</a>. Once I had that basic functionality up and running I started building the interface with Bootstrap and, at that point, integrating the data from LeakFeed with Angular was so easy it&#8217;s almost ridiculous. And as LeakFeed can return the data using JSONP, I didn&#8217;t even need a server: all my application is simply a <em>static</em> HTML file with some Javascript code.</p>
<p>All this get-data-from-somewhere-and-display-it is astonishingly simple in Angular. There&#8217;s this functionality (&#8220;<a href="http://docs.angularjs.org/#!/api/angular.service.$resource">resources</a>&#8220;) to declare sources of external data: you define the URLs and methods to get the data from those resources, and then simply call some methods to fetch the data. E.g.: you can get the list of all tags in LeakFeed from <a href="http://api.leakfeed.com/v1/cables/tags.json">http://api.leakfeed.com/v1/cables/tags.json</a> (adding a GET parameter <code>callback</code> with a function name if you want <a href="http://en.wikipedia.org/wiki/JSONP">JSONP</a>). Similarly, you can get the list of all offices in LeakFeed from <a href="http://api.leakfeed.com/v1/cables/offices.json">http://api.leakfeed.com/v1/cables/offices.json</a>. In Angular, you can declare a resource to get all this information like this:</p>
<pre class="syntax javascript">this.LeakFeedResourceProxy = $resource(
 'http://api.leakfeed.com/v1/cables/:id.json',
 { callback: 'JSON_CALLBACK' },
 { getTags:    {method: 'JSON', isArray: true, params: {id: 'tags'}},
   getOffices: {method: 'JSON', isArray: true, params: {id: 'offices'}}}
);</pre>
<p>Once you have declared it, using it is as simple as calling the appropriate method on the object. That is, you can get the tags by calling <code class="syntax javascript">this.LeakFeedResourceProxy.getTags()</code>, and the offices by calling <code class="syntax javascript">this.LeakFeedResourceProxy.getOffices()</code>. And when I say &#8220;get the tags&#8221;, I mean <em>get a list of Javascript objects</em>: no JSON, text or processing involved. If you assign the result of those functions to any property (say, <code class="syntax javascript">this.availableOffices</code>), you&#8217;ll be able to show that information like so (the <code class="syntax javascript">|officename</code> is a custom filter to show the office names with a special format):</p>
<pre class="syntax html">&lt;select id=&quot;office&quot; name=&quot;office&quot;&gt; \
  &lt;option value=&quot;{{o.name}}&quot;&gt;{{o.display_name|officename}} ({{o.cables}})&lt;/option&gt; \
&lt;/select&gt;</pre>
<p>The cool thing is, thanks to Angular&#8217;s data binding, anytime the value of that variable changes, the representation in the HTML changes, too. That is, if you assign another value to <code class="syntax javascript">this.availableOffices</code> the select box will be automatically updated to have the new set of options! But the data binding is two-way, so any changes you make in the UI also get reflected back in the Javascript variables. This further simplifies many tasks and makes programming with Angular a breeze.<br />
There are other nice things about Angular (and many nice things about Bootstrap and Jasmine of course!), but I think that&#8217;s enough for today :-)</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1128&amp;md5=15fac2e864cbc672f9ea3fd3b8c15bc4" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/09/15/angular/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2011%2F09%2F15%2Fangular%2F&amp;language=en_GB&amp;category=text&amp;title=LeakFeed+and+%26lt%3Bangular%2F%26gt%3B&amp;description=A+couple+of+week+ago+I+discovered+LeakFeed%2C+an+API+to+fetch+cables+from+Wikileaks.+I+immediately+thought+it+would+be+cool+to+play+a+bit+with+it+and+create...&amp;tags=angular%2Cautomated+tests%2Cbootstrap%2Ccss%2Chtml%2Cjasmine%2Cjavascript%2Ctdd%2Ctests%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Book summary: Prototyping (II)</title>
		<link>http://hcoder.org/2011/09/04/book-summary-prototyping-ii/</link>
		<comments>http://hcoder.org/2011/09/04/book-summary-prototyping-ii/#comments</comments>
		<pubDate>Sun, 04 Sep 2011 18:06:10 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Book summaries]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[prototyping]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[uxbookclub]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1096</guid>
		<description><![CDATA[This is the second half of my summary for the book &#8220;Prototyping&#8221; by Todd Zaki Warfel. See the first part on this blog. It will cover chapters 4-12, which talk about the guiding principles for prototyping, prototyping tools and how to test your prototype. Principles Most prototyping mistakes come from either (1) building too much [...]]]></description>
			<content:encoded><![CDATA[<p>This is the second half of my summary for the book &#8220;<a href="http://rosenfeldmedia.com/books/prototyping/">Prototyping</a>&#8221; by Todd Zaki Warfel. See the <a href="http://hcoder.org/2011/09/03/book-summary-prototyping-i/">first part</a> on this blog. It will cover chapters 4-12, which talk about the guiding principles for prototyping, prototyping tools and how to test your prototype.</p>
<h2>Principles</h2>
<p>Most prototyping mistakes come from either (1) building too much or too little, (2) prototyping the wrong thing or (3) not setting expectations about what the prototype will be. Principles:</p>
<ol>
<li><em>Understand your audience and intent</em>. This is the most important principle. Once you understand them, you&#8217;ll be much better equipped to determine what you need to prototype, set appropriate expectations, determine the right level of fidelity and pick the right tool.</li>
<li><em>Plan a little, prototype the rest</em>. Software systems change constantly and quickly. Plan a little and prototype the rest, so you can cope with the changing environment by working incrementally and iteratively.</li>
<li><em>Set expectations</em>. This lets you avoid rabbit-hole discussions on things that aren&#8217;t important or haven&#8217;t been prototyped yet.</li>
<li><em>You can sketch</em>. Anyone can draw well enough for the purposes of a prototype.</li>
<li><em>It&#8217;s a prototype, not the Mona Lisa</em>. Don&#8217;t lose too much time on making it pretty. Not only it&#8217;s not necessary, but it has some advantages like making it clear that it&#8217;s not finished product, which makes people more likely to give feedback. You need the least amount of effort to communicate your design idea, nothing more.</li>
<li><em>If you can&#8217;t make it, fake it</em>. You can fake many things you can&#8217;t make with JPG files, clickable HTML files, PDFs or PowerPoint presentations.</li>
<li><em>Prototype only what you need</em>. Often prototypes only cover <em>part</em> of a system. Even if your ultimate goal is usability testing, chances are you&#8217;ll only test 5 or 6 scenarios, so you only need to build that.</li>
<li><em>Reduce risk—prototype early and often</em>. Prototyping is about making small investments with a significant return. The return can be positive, in which case you can just go ahead, or negative, in which case your risk is substantially reduced because you identified the problem soon enough. The earlier you catch mistakes, the easier and cheaper it is to fix them.</li>
</ol>
<h2>Tools</h2>
<p>When choosing the prototyping tool, consider audience, intent, familiarity/learnability, cost, need for collaboration, distribution and throwaway vs. reusable. Notes for specific tools follow:</p>
<h3>Paper</h3>
<p>It&#8217;s the most versatile method. It&#8217;s also fast, cheap, easy, you can manipulate it on the fly (and even the participants can help), collaborative, not limited by prebuilt widgets or technology, and can be done anywhere and anytime, even without computers. The bad sides are that it&#8217;s hard for geographically distributed teams to use it, requires imagination and lacks visual aesthetics. Tips:</p>
<ul>
<li>Include transparencies (useful for simulating roll-overs and such), post-it notes (for displaying changing states on the page, highlighting elements or dialog windows), coloured pens/markers (sketching in black/blue, errors in red, success messages in green) and scotch tape or glue stick in your kit.</li>
<li>Use pre-drawn/printed widgets. The book resources include a (kind of limited) <a href="http://rosenfeldmedia.com/books/downloads/prototyping/Paper_Prototype_GUI.ai">sample Illustrator file with printable widgets</a> for that purpose.</li>
<li>You can use transparencies for context, pop-up help (even using a marker to highlight fields).</li>
<li>To accomplish a show/hide effect, you can fold/unfold part of the paper.</li>
<li>You can simulate slide effects by having two different pieces of paper, cut one of them so the other fits (leaving a sort of &#8220;window&#8221; so you can see the other through), and moving the second one back and forth.</li>
</ul>
<h3>Presentation software</h3>
<p>It has a low learning curve, it&#8217;s available in most computers, you can use master slides to ensure consistency, you can copy-paste and rearrange elements with drag-and-drop, and export to HTML or PDF if necessary. However, it has limited drawing tools (so often not good for hi-fi prototypes), the interactivity is limited and the prototype has no reusable source code whatsoever. The book resources have a <a href="http://rosenfeldmedia.com/books/downloads/prototyping/chapter7.zip">sample prototyping kit for Powerpoint and Keynote</a>, and Manuela Hutter (Oslo UX book club organiser) wrote another <a href="http://files.myopera.com/manooh/blog/UI_mockups.otp">prototyping kit for OpenOffice.org</a> (and see the whole <a href="http://my.opera.com/manooh/blog/interactive-mockups-with-openoffice">blog post about prototyping with OO.o</a>). Tip: you can simulate fade effects in presentation software by having two slides (one with the element highlighted, the other without) and setting a &#8220;dissolve&#8221; transition effects between them.</p>
<h3>HTML</h3>
<p>There are several ways to approach making prototypes with HTML. You can simply slap up a few images and use image maps to link to each other, you can have HTML exported from some other tool, or you can write &#8220;production-level&#8221; HTML for a prototype that will contain potentially reusable code. The strengths of the <em>last</em> way are being platform-independent, free, portable, &#8220;real&#8221; (in case we&#8217;re prototyping a web app), it helps gauging feasibility, modular (helps in productivity), collaborative (if we split in different files), reusable code and unlimited potential. The downsides are that it might take more time and effort to make a prototype like this, and that it&#8217;s not easy to make annotations on it.</p>
<h2>Testing your prototype</h2>
<h3>Common mistakes</h3>
<ol>
<li><em>Usability testing is a process, not an event</em>. There&#8217;s also planning, analysis and reporting, not just &#8220;sitting in front of a person with a computer&#8221;.</li>
<li><em>Poor planning</em>. The first question to ask is &#8220;why am I doing usability testing?&#8221;. Determine who you want to test, who is going to use the product or service, what are their behaviours, and why would they use the product in the first place.</li>
<li><em>Not recruiting the right participants</em>. The whole point of the testing is seeing how the design works in the eyes of the people who will use it. If you recruit the wrong people, you will get the wrong data.</li>
<li><em>Poorly-formed research questions</em>. This is one of the biggest challenges. You have to get your answers without asking explicitly. Instead of telling them to plan a dinner + movie, you can ask them to look for something to do with friends. The point being we shouldn&#8217;t make them use the application in the way <em>we</em> want, but make them use the application in whatever way they normally would.</li>
<li><em>Poor test moderation</em>. A good moderator balances being a silent fly on the wall, watching, with asking enough questions to get the test going; know how to extract just the right level of detail; know when to let the participant explore, and when to pull them back; how to get the answer to the question they want without asking it.</li>
<li><em>Picking the wrong method to communicate findings and recommendations</em>. Nobody is going to read a 10-20 page report. Short presentations with a summary of the findings typically work well. Including video clips showing the highlights of the test is useful.</li>
</ol>
<h3>Steps to conduct a usability test</h3>
<ol>
<li><em>Preparation</em>. Decide, with your team, what are the key characteristics and behaviour you&#8217;re looking for, and also the ones you <em>don&#8217;t</em> want. If you&#8217;re going to record audio or video, have a waiver ready for the participants. Knowing the intent of the test will inform the appropriate scenarios, research questions and prototype. Limit the test to 45-60 minutes: enough time to test 5 or 6 scenarios while not exceeding the attention span of the participants.</li>
<li><em>Design test scenarios</em>. Either specific to determine if a user can access a concrete feature of the site, or exploratory to gain insight into a participant&#8217;s overall approach to solving her goal. Focus on the goal, allowing different activities and process to reach it.</li>
<li><em>Test the prototype</em>. Getting feedback from participants is easier if they feel comfortable. Once they&#8217;re comfortable, ask them about their experiences related to whatever you&#8217;re going to test that day. You can use that information to provide context.</li>
<li><em>Record observations and feedback</em>. Have one person moderating, and another person taking notes remotely. It&#8217;s better to over-record than to under-record. Use a rating scale of, say, 1-5 for each scenario. Both moderator and participant fill it in. The former should be based of measurable elements like time and effort. The latter is more subjective, focused on the satisfaction with completing the task. Try to filter any variable not related to the system you&#8217;re testing. For example, use the same operating system as the user is most used to.</li>
<li><em>Analyse and determine next steps</em>. When you finish, you typically have a list of bigger issues in your head. This list is a starting point. Analyse all your data points, and find themes. Look for frequency, severity and learnability. It&#8217;s better to use a method that combines significance to the customer, value to the business and technical feasibility of fixing the issue.</li>
</ol>
<p>And that&#8217;s the end of my summary.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1096&amp;md5=dd56c3638cb90935e5712891648b1819" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/09/04/book-summary-prototyping-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2011%2F09%2F04%2Fbook-summary-prototyping-ii%2F&amp;language=en_GB&amp;category=text&amp;title=Book+summary%3A+Prototyping+%28II%29&amp;description=This+is+the+second+half+of+my+summary+for+the+book+%26%238220%3BPrototyping%26%238221%3B+by+Todd+Zaki+Warfel.+See+the+first+part+on+this+blog.+It+will+cover+chapters+4-12%2C+which+talk...&amp;tags=books%2Cprototyping%2Cux%2Cuxbookclub%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

