<?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>Toolness</title>
	<atom:link href="http://www.toolness.com/wp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.toolness.com/wp</link>
	<description>The Blog of Atul Varma</description>
	<lastBuildDate>Thu, 17 Jan 2013 16:37:45 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5</generator>
		<item>
		<title>On Enforcing Mandatory Code Review</title>
		<link>http://www.toolness.com/wp/2013/01/on-enforcing-mandatory-code-review/</link>
		<comments>http://www.toolness.com/wp/2013/01/on-enforcing-mandatory-code-review/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 16:01:45 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1686</guid>
		<description><![CDATA[Many software projects enforce mandatory code reviews, even for their most senior developers. While I&#8217;ve mentioned before that code reviews can be very useful, I also think that mandatory code reviews among trusted members of a software team can have a number of downsides. First and foremost, developers don&#8217;t have a common consensus on what [...]]]></description>
				<content:encoded><![CDATA[<p>Many software projects enforce mandatory code reviews, even for their most senior developers. While I&#8217;ve <a href="http://www.toolness.com/wp/2010/11/adventures-in-code-review-and-pair-programming/">mentioned before</a> that code reviews can be very useful, I also think that <em>mandatory</em> code reviews among trusted members of a software team can have a number of downsides.</p>
<p>First and foremost, developers don&#8217;t have a common consensus on what code review actually <em>means</em>. How much time should it take? Does it mean acting like a human computer and painstakingly processing every line of code like a computer would? Does it mean evaluating the high-level architecture of a patch, or finding formatting errors? Does it mean just skimming the code and vaguely understanding it enough to take care of it if the original author gets hit by a bus? Does it mean evaluating the big-O complexity of an algorithm? Does it mean all of these things?</p>
<p>Many people who ask for mandatory code reviews have no idea what they&#8217;re asking for&mdash;because it&#8217;s mandatory, so they just <em>have</em> to&mdash;and the people who do the code reviews are in a similar position. As a result, while code reviews often improve software quality, in some environments a mandatory review policy can amount to an ill-defined bureaucratic ritual of unknown value.</p>
<p>Because of this, I&#8217;ve seen a lot of reviewers&mdash;myself included&mdash;offer nothing but so-called &#8220;nitpicks&#8221; in their code review comments, as a way of <em>appearing</em> to perform a useful act while in fact slowing a project down, destroying morale, and optimizing for their own minimal time investment by engaging in days or weeks of asynchronous pedantry. Other times, because reviewers have been asked to do something extremely vague, they often procrastinate, which causes code to bit-rot and sets a project back even further.</p>
<p>But what happens when we make code reviews voluntary, instead of mandatory? Well, then it&#8217;s called <em>asking for advice</em>.</p>
<p>Many of the most useful &#8220;code reviews&#8221; I&#8217;ve experienced came not from asking someone&#8217;s permission to land code, but from simply being uncertain of very specific aspects of my own code, and asking my peers for help. Sometimes this has come in the form of a github pull request; other times it&#8217;s been in the form of pair programming; other times it&#8217;s just involved me dumping some source code into a webpage and asking someone over IRC about it.</p>
<p>There are a number of things I like about this practice. The first is that it&#8217;s <em>my choice</em> to ask for advice, which is far more empowering than <em>asking for permission</em>, which is what a mandatory code review policy implies. Even if I had the exact same conversations through mandatory code reviews that I would through voluntary code reviews, I would still <em>enjoy</em> the latter more, because they&#8217;re my decision rather than my obligation.</p>
<p>Another advantage of voluntary code reviews is that I know exactly what I&#8217;m asking for. If I feel insecure about my own code, I can introspect and understand <em>why</em> I&#8217;m feeling that way, which leads me to specific questions. Often different questions are best answered by different people, some of whom may even work on different projects; when I ask those people to review my code, I&#8217;m requesting very specific things that are highly relevant to their expertise. I&#8217;m also targeting my questions in a way that ensures that I don&#8217;t take up too much of their time. And because it&#8217;s viewed by them as a well-defined, time-boxed favor rather than a vague obligation, they&#8217;re typically much more responsive and excited about helping me than they would be if it were a mandatory code review.</p>
<p>In conclusion, rather than decreasing software quality, I believe that the social incentives inherent in voluntary code review policies encourage developers to take ownership of the code they write by paying close attention to its needs and valuing the time of others who may need to take a look at it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2013/01/on-enforcing-mandatory-code-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Bridges Between GUIs and Code With Markup APIs</title>
		<link>http://www.toolness.com/wp/2013/01/building-bridges-between-guis-and-code-with-markup-apis/</link>
		<comments>http://www.toolness.com/wp/2013/01/building-bridges-between-guis-and-code-with-markup-apis/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 21:01:11 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Hackasaurus]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1680</guid>
		<description><![CDATA[Recently the Twitter Bootstrap documentation gave a name to something that I&#8217;ve been excited about for a pretty long time: Markup API. Markup APIs give superpowers to HTML. Through the use of class attributes, data attributes, X-Tags, or other conventions they effectively extend the behavior of HTML, turning it into a kind of magic ink. [...]]]></description>
				<content:encoded><![CDATA[<p>Recently the <a href="http://twitter.github.com/bootstrap/javascript.html">Twitter Bootstrap</a> documentation gave a name to something that I&#8217;ve been excited about for a pretty long time: <em>Markup API</em>.</p>
<p>Markup APIs give superpowers to HTML. Through the use of class attributes, data attributes, <a href="http://www.x-tags.org/">X-Tags</a>, or other conventions they effectively extend the behavior of HTML, turning it into a kind of magic ink. Favorite examples of mine include Twitter Bootstrap, <a href="http://www.wowhead.com/tooltips">Wowhead Tooltips</a>, and my own <a href="http://toolness.github.com/instapoppin/">Instapoppin</a>.</p>
<p>The advantages of a markup API over a JavaScript API are numerous:</p>
<ul>
<li>They mean that an author only needs to know HTML, whose syntax is very easy to learn, rather than JavaScript, whose syntax is comparatively difficult to learn.</li>
<li>Because the API is in HTML rather than JavaScript, it&#8217;s <em>declarative</em> rather than <em>imperative</em>. This makes it much easier for development tools to intuit what a user is trying to do&mdash;by virtue of a user specifying <em>what</em> they want rather than <em>how</em> to do it. And when a development tool has a clearer idea of what the user wants, it can offer more useful context-sensitive help or error messaging.</li>
<li>Because of HTML&#8217;s simple and declarative structure, it&#8217;s easy for tools to modify hand-written HTML, especially with a library like <a href="http://github.com/mozilla/slowparse">Slowparse</a>, which help ensure that whitespace and other formatting is preserved. Doing the same with JavaScript, while possible with libraries like <a href="http://esprima.org/">esprima</a>, can be difficult because the language is so complex and dynamic.</li>
</ul>
<p>These advantages make it possible to create GUI affordances atop hand-coded HTML that make it much easier to write. As an example of this, I hacked up prototype <a href="http://labs.toolness.com/temp/thimble-dzslides-spike/?notypekit=1">slideshow demo</a> and <a href="http://labs.toolness.com/temp/thimble-dzslides-spike/?notypekit=1#static:physics">physics demo</a> in July of last year. Dragging an element with the class <code>thimble-movable</code> in the preview pane changes (or adds) CSS absolute positioning properties in the source code pane in real-time, and holding down the shift key modifies width and height. This allows users to size and position elements in a way that even a professional developer would find far more preferable to the usual &#8220;guess a number and see how it looks&#8221; method. Yet this mechanism still places primacy on the original source code; the GUI is simply a humane interface to change it.</p>
<p>This is the reverse of most authoring tools with an &#8220;export to HTML&#8221; feature, whereby an opaque internal data model is compiled into a blob of HTML, CSS, and JavaScript that can&#8217;t be re-imported into the authoring tool. Pedagogically, this is unfortunate because it means that there&#8217;s a high cost to ever leaving the authoring tool&mdash;effectively making the authoring tool its own kind of &#8220;walled garden&#8221;. Such applications could greatly facilitate the learning of HTML and CSS by defining a markup API for their content and allowing end-users to effortlessly switch between hand-coding HTML/CSS and using a graphical user interface that does it for them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2013/01/building-bridges-between-guis-and-code-with-markup-apis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Experiences That Work Like The Web</title>
		<link>http://www.toolness.com/wp/2012/12/building-experiences-that-work-like-the-web/</link>
		<comments>http://www.toolness.com/wp/2012/12/building-experiences-that-work-like-the-web/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 16:33:03 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1663</guid>
		<description><![CDATA[Much has been said about the greatness of the Web, yet most websites don&#8217;t actually work like the Web does. And some experiences that aren&#8217;t even on the web can still embody its spirit better than the average site. Here are three webbish characteristics that I want to see in every site I use, and [...]]]></description>
				<content:encoded><![CDATA[<p>Much has been said about the greatness of the Web, yet most websites don&#8217;t actually work like the Web does. And some experiences that aren&#8217;t even <em>on</em> the web can still embody its spirit better than the average site.</p>
<p>Here are three webbish characteristics that I want to see in every site I use, and which I try my best to implement in anything I build.</p>
<ul>
<li>
<p><strong>&#8220;View Source&#8221; for every piece of user-generated content</strong>. Many sites that support user comments allow users to use some kind of markup language to format their responses. Flickr allows <a href="http://www.flickr.com/html.gne">some HTML</a> with shortcuts for embedding other photos, user avatars, and photo sets; Github permits a <a href="http://github.github.com/github-flavored-markdown/">delicious smorgasboard</a> of HTML and Markdown.</p>
<p>The more powerful a site&#8217;s language for content creation, the more likely it is that one user will see another&#8217;s content and ask, &#8220;how did they do that?&#8221;. If sites like Flickr and Github added a tiny &#8220;view source&#8221; button next to every comment, it would become much easier for users to create great things and learn from one another.</p>
<p>I should note that by &#8220;source&#8221; I don&#8217;t necessarily mean plain-text source code: content created by <a href="http://mozillapopcorn.org/">Popcorn Maker</a>, for instance, supports a non-textual view-source by making it easy for any user to transition from viewing a video to deconstructing and remixing it.</p>
</li>
<li>
<p><strong>Outbound Linkability</strong>. Every piece of user-generated content should be capable of &#8220;pointing at&#8221; other things in the world, preferably in a variety of ways that support multiple modes of expression. For instance, a commenting system should at the <em>very least</em> make it trivially easy to insert a clickable hyperlink into a comment; one step better is to allow a user to link particular words to a URL, as with the <code>&lt;a&gt;</code> tag in HTML. Even better is to allow users to <em>embed</em> the content directly into their own content, as with the <code>&lt;img&gt;</code> and <code>&lt;iframe&gt;</code> tags.</p>
</li>
<li>
<p><strong>Inbound Linkability</strong>. Conversely, any piece of user-generated content should be capable of being &#8220;pointed at&#8221; from anywhere else in the world. At the very least, this means <a href="http://en.wikipedia.org/wiki/Permalink">permalinks</a> for every piece of content, such as a user comment. Even better is making every piece of content <em>embeddable</em>, so that other places in the world can frame your content in different contexts.</p>
</li>
</ul>
<p>As far as I know, the primary reason most sites don&#8217;t implement some of these features is due to security concerns. For example, a naïve implementation of outbound linkability would leave itself open to <a href="http://en.wikipedia.org/wiki/Link_farm">link farming</a>, while allowing anyone to embed any page on your site in an <code>&lt;iframe&gt;</code> could make you vulnerable to <a href="http://en.wikipedia.org/wiki/Clickjacking">clickjacking</a>. Most sites &#8220;play it safe&#8221; by simply disallowing such things; while this is perfectly understandable, it is also unfortunate, as they disinherit much of what makes the Web such a generative medium.</p>
<p>I&#8217;ve learned a lot about how to mitigate some of these attacks while working through the security model for <a href="http://thimble.webmaker.org/">Thimble</a>, and I&#8217;m beginning to think that it might be useful to document some of this thinking so it&#8217;s easier for people to create things that work more like the Web. If you think this is a good (or bad) idea, feel free to tweet <a href="http://twitter.com/toolness">@toolness</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/12/building-experiences-that-work-like-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Questions: Designing for Accessibility on the Web</title>
		<link>http://www.toolness.com/wp/2012/07/questions-designing-for-accessibility-on-the-web/</link>
		<comments>http://www.toolness.com/wp/2012/07/questions-designing-for-accessibility-on-the-web/#comments</comments>
		<pubDate>Sat, 07 Jul 2012 13:31:00 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1654</guid>
		<description><![CDATA[Marco Zehe recently wrote a good, sobering blog post comparing the accessibility of Web apps to those of native ones. Much of what I&#8217;ve seen on supporting accessibility on the Web has to do with using the right standards: always providing alt attributes for images, for example, or adding semantic ARIA metadata to one&#8217;s markup. [...]]]></description>
				<content:encoded><![CDATA[<p>Marco Zehe recently wrote a good, sobering <a href="http://www.marcozehe.de/2012/07/06/are-web-apps-accessible-enough-to-replace-desktop-applications-any-time-soon/">blog post</a> comparing the accessibility of Web apps to those of native ones.</p>
<p>Much of what I&#8217;ve seen on supporting accessibility on the Web has to do with using the right standards: always providing <code>alt</code> attributes for images, for example, or adding semantic <a href="http://en.wikipedia.org/wiki/WAI-ARIA">ARIA</a> metadata to one&#8217;s markup.</p>
<p>As a designer, however, I don&#8217;t have much interest in these standards because they don&#8217;t seem to address human factors. What&#8217;s more interesting to me is understanding how screen readers present the user interface to vision-impaired people and how usable that interface is to them. This would parallel my own experience of designing for non-impaired users, where I use my understanding of human-computer interaction to create interfaces from <a href="http://humanized.com/about/">first principles</a>.</p>
<p>I&#8217;ve been meaning to actually get a screen reader and try browsing the Web for a few days to get a better idea of how to build usable interfaces, but I haven&#8217;t gotten around to it yet, and I&#8217;m also not sure if it&#8217;s the best way to empathize with vision-impaired users. In any case, though, my general concern is that there seems to be a distinct lack of material on &#8220;how to build truly usable web applications for the vision impaired.&#8221; Instead, I only see articles on how to be ARIA standards-compliant, which tells me nothing about the actual human factors involved in designing for accessibility.</p>
<p>So, I&#8217;ll be spending some time looking for such resources, and trying to get a better idea of what it&#8217;s like to use the internet as someone who is vision-impaired. If you know of any good pointers, please feel free to <a href="http://twitter.com/toolness">tweet at me</a>. Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/07/questions-designing-for-accessibility-on-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Empathy For Software Conservatives</title>
		<link>http://www.toolness.com/wp/2012/07/empathy-for-software-conservatives/</link>
		<comments>http://www.toolness.com/wp/2012/07/empathy-for-software-conservatives/#comments</comments>
		<pubDate>Fri, 06 Jul 2012 16:28:33 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1646</guid>
		<description><![CDATA[Recently my friend Jono wrote an excellent blog post entitled Everybody hates Firefox updates. I agree with pretty much everything he says. What most struck me during my time in Mozilla&#8217;s Mountain View office was a complete lack of empathy for people who might want to &#8220;stay where they were&#8221; and not upgrade to the [...]]]></description>
				<content:encoded><![CDATA[<p>Recently my friend Jono wrote an excellent blog post entitled <a href="http://evilbrainjono.net/blog?showcomments=true&#038;permalink=1094">Everybody hates Firefox updates</a>. I agree with pretty much everything he says.</p>
<p>What most struck me during my time in Mozilla&#8217;s Mountain View office was a complete lack of empathy for people who might want to &#8220;stay where they were&#8221; and <em>not</em> upgrade to the latest version of our flagship product. Whenever someone asked a question like, &#8220;what if the user wants to stay on the old version of Firefox?&#8221;, the response was unequivocally that said user must be delusional: <em>no one</em> should ever want to stay on an old version of a product. It simply doesn&#8217;t make sense.</p>
<p>I&#8217;ve always credited this bizarre line of thinking to everything I dislike about the Silicon Valley bubble, though I don&#8217;t ultimately know if it&#8217;s endemic to the Valley or just tech companies in general. I personally have always despised upgrading anything&#8211;not just Firefox&#8211;for exactly the reasons that Jono outlines in his post. Most people at Mozilla&#8211;and likely other software companies&#8211;seem to think that it&#8217;s just the outliers who dislike such disruption. Maybe they are, I have no idea. But I and most people I know outside of the software industry view upgrades as potential <em>attacks on our productivity</em>, not as shiny new experiences. If there&#8217;s any desire at all within Mozilla to cater to such &#8220;software conservatives&#8221;, the first step is having actual <em>empathy</em> for folks who might want to stay right where they are, rather than treating them as an irrelevant minority.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/07/empathy-for-software-conservatives/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Learning and Grammatical Forgiveness</title>
		<link>http://www.toolness.com/wp/2012/04/learning-and-grammatical-forgiveness/</link>
		<comments>http://www.toolness.com/wp/2012/04/learning-and-grammatical-forgiveness/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 14:40:59 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Hackasaurus]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1632</guid>
		<description><![CDATA[HTML is a very interesting machine language because, like human languages, most things that interpret it are very forgiving. For instance, did you know that the following HTML is technically invalid? &#60;video&#62; &#60;source src="movie.mp4"&#62;&#60;/source&#62; &#60;/video&#62; It&#8217;s invalid because &#60;source&#62; is a so-called void element: since it can&#8217;t have any content inside it, you simply don&#8217;t [...]]]></description>
				<content:encoded><![CDATA[<p>HTML is a very interesting machine language because, like human languages, most things that interpret it are very forgiving.</p>
<p>For instance, did you know that the following HTML is technically invalid?</p>
<blockquote><pre>
&lt;video&gt;
  &lt;source src="movie.mp4"&gt;&lt;/source&gt;
&lt;/video&gt;
</pre>
</blockquote>
<p>It&#8217;s invalid because <code>&lt;source&gt;</code> is a so-called <a href="http://www.456bereastreet.com/archive/201005/void_empty_elements_and_self-closing_start_tags_in_html/">void element</a>: since it can&#8217;t have any content inside it, you simply don&#8217;t need a closing tag for it. The <code>&lt;img&gt;</code> tag works the same way. The technically correct way to write the above HTML snippet is as follows:</p>
<blockquote><pre>
&lt;video&gt;
  &lt;source src="movie.mp4"&gt;
&lt;/video&gt;
</pre>
</blockquote>
<p>However, in practice, all Web browsers will interpret both of these snippets the exact same way. When a browser sees the closing <code>&lt;/source&gt;</code> tag on the first snippet, it realizes the &#8220;mistake&#8221; the author has made, and simply pretends it isn&#8217;t there.</p>
<p>What&#8217;s interesting to me is the way this mirrors human languages, and what it means for teaching. For instance, the following sentence is grammatically incorrect:</p>
<blockquote><pre>
The dog loves it's owner.
</pre>
</blockquote>
<p>However, no one who knows English will actually be confused by the meaning of the statement.</p>
<p>When I was trained as an adult literacy tutor several years ago, one of the most important principles we were taught was that fostering a <em>love for writing</em> was vastly more important than grammatical correctness. The &#8220;red pen&#8221; commonly used by school teachers for correcting grammatical errors was seen as anathema to this: when we found a grammatical error in a novice writer&#8217;s work, we were encouraged to ignore it unless it actually made the piece confusing or ambiguous for readers in a way that the author didn&#8217;t intend. Otherwise, the novice writer would become quickly distracted and discouraged by all their &#8220;mistakes&#8221; and view writing as a minefield rather than a way to communicate their thoughts and ideas.</p>
<p>We&#8217;re running into similar issues in the design of the <a href="http://jessicaklein.blogspot.com/2012/04/curate-your-learning-through-webmaker.html">Webpage Maker</a>. On one hand, the fact that Web browsers are so forgiving when interpreting HTML enables us to follow a similar philosophy as that of progressive adult literacy tutors.</p>
<p>But sometimes, the forgiving nature of Web browsers backfires: they actually render a document that is vastly different from the author&#8217;s intent, which is just as frustrating as a pedantic nitpicker. We&#8217;ve created a library called <a href="https://github.com/toolness/slowparse#readme">Slowparse</a>&mdash;soon to be renamed&mdash;which attempts to assist with this, providing the logic needed for a user interface to gently inform users of potential ways their HTML and CSS code might be misinterpreted by machines. A full <a href="http://toolness.github.com/slowparse/demo/spec.html">specification</a> of errors and warnings is also available, as is an <a href="http://toolness.github.com/slowparse/demo/editor/">interactive demo</a> that uses the library to provide real-time feedback to users.</p>
<p>It&#8217;s been interesting to see how different Slowparse is from a HTML/CSS <a href="http://validator.w3.org/">validator</a>, whose goal is not one of learning, but of ensuring conformance to a specification. From a learning perspective, a validator is like the pedantic teacher who loves their red pen: some of its feedback is quite useful, but the remainder is likely to confuse and intimidate a newcomer.</p>
<p>Partly as a result of its learning goals, Slowparse actually &#8220;warns&#8221; the user of things that are <em>technically</em> valid HTML/CSS, but which likely don&#8217;t reflect the intent of the author. One current example of this is in regards to the use of <a href="https://github.com/toolness/slowparse/issues/15">unquoted attributes</a> in HTML5, though that particular example is still subject to change.</p>
<p>At this point, I think the challenge will be to work with our learning team and user test our interface to the point that we achieve a good balance between being a pedantic nitpicker and providing useful feedback that helps users as quickly as possible. In my opinion, if we do things right, we&#8217;ll help people develop a love for HTML and CSS&mdash;even if what they write may technically be &#8220;grammatically incorrect.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/04/learning-and-grammatical-forgiveness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototyping Presentations</title>
		<link>http://www.toolness.com/wp/2012/03/prototyping-presentations/</link>
		<comments>http://www.toolness.com/wp/2012/03/prototyping-presentations/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 19:05:24 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1605</guid>
		<description><![CDATA[Presentations take a long time to make. Particularly when I&#8217;m just conceptualizing my presentation, it takes a lot of work to record myself talking, use a tool to sync it with the proper visuals, and then repeat the recording and syncing process as I iterate on the content. I recently made a simple tool called [...]]]></description>
				<content:encoded><![CDATA[<p>Presentations take a long time to make. Particularly when I&#8217;m just conceptualizing my presentation, it takes a lot of work to record myself talking, use a tool to sync it with the proper visuals, and then repeat the recording and syncing process as I iterate on the content.</p>
<p>I recently made a simple tool called <em>Quickpreso</em> to make the process of &#8220;prototyping&#8221; a presentation quicker, and more like writing a simple HTML page.</p>
<p>A presentation in Quickpreso is just an HTML file with a series of alternating lines for visuals and voice-overs, like this:</p>
<blockquote><pre>
&lt;img src="slide-one.jpg"&gt;

This text will be spoken for slide one.

&lt;a href="http://mozilla.org/"&gt;I am slide two.&lt;/a&gt;

This text will be spoken for slide two.
</pre>
</blockquote>
<p>The visuals can contain any HTML markup. Each section of voice-over text is rendered by the OS X <a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/say.1.html">say</a> command; they&#8217;re all concatenated together into an audio file by <a href="http://en.wikipedia.org/wiki/FFmpeg">ffmpeg</a>. Finally, the visuals are synced to the audio in a Web page using <a href="http://popcornjs.org/">popcorn.js</a>.</p>
<p>Quick iteration is facilitated by a simple Python web server that regenerates the audio file when it detects changes to the voice over text. The final product is all static content that can be served from any web server.</p>
<p><center><a href="http://labs.toolness.com/temp/webmaking-for-knitters/"><img src="http://farm6.staticflickr.com/5283/5357843768_a791a9be8e_z.jpg" width="400"/></a></center></p>
<p>I used this tool to create a <a href="http://labs.toolness.com/temp/webmaking-for-knitters/">Webmaking for Knitters</a> presentation in January. The result is quite robotic, obviously, though it can be made a little more natural-sounding if newer voices from OS X Lion are used (I&#8217;m still on Snow Leopard).</p>
<p>One particular advantage of this approach, however, is that you get subtitles/closed-captioning for free. There&#8217;s also nothing preventing you from re-recording the final audio in your own voice once you&#8217;re happy with your prototype.</p>
<p>The source code is available on Github at <a href="https://github.com/toolness/quickpreso">toolness/quickpreso</a>. The code is in an alpha state, so your mileage may vary; fortunately, though, the source code is miniscule, so understanding and changing it shouldn&#8217;t be hard.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/03/prototyping-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coffee Machines And Community</title>
		<link>http://www.toolness.com/wp/2012/03/coffee-machines-and-community/</link>
		<comments>http://www.toolness.com/wp/2012/03/coffee-machines-and-community/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 17:49:33 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1573</guid>
		<description><![CDATA[The Toronto and San Francisco Mozilla offices each feature very different coffee makers. The Toronto office has a Rancilio Epoca espresso machine. It has lots of knobs and switches, and one has to be taught how to use it. When one learns, the first few drinks they make are likely to taste very bad; a [...]]]></description>
				<content:encoded><![CDATA[<p>The Toronto and San Francisco Mozilla offices each feature very different coffee makers.</p>
<p>The Toronto office has a <a href="http://www.rancilio.it/rancilio/prod_model.jsp?id_model=43&#038;id_language=3&#038;id_category=24">Rancilio Epoca</a> espresso machine. It has lots of knobs and switches, and one has to be taught how to use it. When one learns, the first few drinks they make are likely to taste very bad; a conscious effort must be made to learn from one&#8217;s mistakes and create better drinks.</p>
<p><center><img src="http://www.toolness.com/wp/wp-content/uploads/2012/03/rancilio-epoca.jpg"/></center></p>
<p>The SF office has a Miele espresso machine with three buttons and an LCD display. It&#8217;s comparatively easy to use, and makes fine drinks at the push of a button&mdash;until something goes wrong in the opaque innards of the machine. The sight of error dialogs like this one are extraordinarily common:</p>
<p><center><img src="http://www.toolness.com/wp/wp-content/uploads/2012/03/miele-error-dialog-with-buttons.jpg" alt="" title="miele-error-dialog-with-buttons" width="400" height="269" class="aligncenter size-full wp-image-1584" /></center></p>
<p>The machine probably has as many different kinds of error messages as a modern computer operating system. Like an operating system, it also offers little to no assistance on how to fix the problem that&#8217;s occurring.</p>
<p>Both of these coffee machines reflect very different philosophies about the nature of tools, and about the people who use them. For me, one of the most interesting aspects concerns the <em>communities</em> that have grown&mdash;or failed to grow&mdash;around them.</p>
<p>Actually, the very existence of the Toronto office&#8217;s espresso machine is due to community: as I understand it, a core group of Torontonian espresso aficionados decided to buy a small communal machine with their own money, and upgraded the machine later on. The result I&#8217;ve noticed, whenever I&#8217;ve visited the Toronto office, is that the kitchen area becomes a place for <em>learning</em>. People are constantly teaching each other how to make a better drink, asking questions, debating the proper pressure to use when tamping (&#8220;approximately the weight of a cat&#8221;, says one coworker), and so forth. In a growing workplace that is constantly in danger of being segregated by organizational boundaries, a <a href="http://en.wikipedia.org/wiki/Community_of_practice">community of practice</a> that&#8217;s centered around something completely unrelated to work is an amazing asset.</p>
<p>In contrast, there isn&#8217;t much of a community that <em>can</em> form around the push-button Miele machine in the San Francisco office. Because there&#8217;s no way to go &#8220;under the hood&#8221; and customize one&#8217;s coffee-making experience in a positive way, there&#8217;s not really any technique to share with others. An interface that is so &#8220;self-serve&#8221; and &#8220;easy to use&#8221; that it prohibits nuance and customization is also one that doesn&#8217;t encourage people to talk about it.</p>
<p>This might be an acceptable trade-off, except for the fact that the Miele <em>isn&#8217;t</em> fully self-serve. Like any machine, it needs maintenance, and because there was never an incentive for anyone to understand <em>how</em> it worked, very few people know how to fix it&mdash;if anything, I&#8217;ve experienced a sense of resentment when I&#8217;m presented with an error, as though the machine has violated its contract of being mind-numbingly easy to use. Consequently, the only talk I&#8217;ve ever heard about this machine revolves around its inscrutable error messages, which only the office manager knows how to fix.</p>
<p>The same dynamics I&#8217;ve described here apply to all of our tools. No matter how easy and &#8220;self-serve&#8221; we try to make our software, a significant portion of its users will still run into problems and use cases that they don&#8217;t know how to get past on their own. I don&#8217;t know if it&#8217;s <em>possible</em> to foster communities of practice through tools designed for freedom and empowerment&mdash;even if we put the Rancilio in the San Francisco office, for instance, it may languish if no one there thinks a good espresso is worth learning how to make. But it&#8217;s certainly worth finding out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/03/coffee-machines-and-community/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Storything Interactive Prototype</title>
		<link>http://www.toolness.com/wp/2012/03/storything-interactive-prototype/</link>
		<comments>http://www.toolness.com/wp/2012/03/storything-interactive-prototype/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 19:31:30 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Hackasaurus]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1564</guid>
		<description><![CDATA[Last week I merged the Webmaking Tutorial Prototype with the Webmaking 101 for Journalists prototype we made during our three day sprint in NYC in February. The result, which is code-named Storything, is currently hosted at storything.toolness.org. Give it a try! The design for this prototype is based on Jess Klein&#8217;s instructional overlay mockups. A [...]]]></description>
				<content:encoded><![CDATA[<p>Last week I merged the <a href="http://www.toolness.com/wp/2012/03/webmaker-tutorial-prototyping/">Webmaking Tutorial Prototype</a> with the <a href="http://jessicaklein.blogspot.com/2012/01/webmaking-101-for-journalists-prototype.html">Webmaking 101 for Journalists prototype</a> we made during our <a href="http://jessicaklein.blogspot.com/2012/02/storytelling-day-one-of-design-sprint.html">three</a> <a href="http://jessicaklein.blogspot.com/2012/02/day-2-of-open-news-sprint-design-for.html">day</a> <a href="http://jessicaklein.blogspot.com/2012/02/open-news-design-sprint-day-3-meet.html">sprint</a> in NYC in February.</p>
<p>The result, which is code-named <em>Storything</em>, is currently hosted at <a href="http://storything.toolness.org/">storything.toolness.org</a>. Give it a try!</p>
<p>The design for this prototype is based on Jess Klein&#8217;s <a href="http://jessicaklein.blogspot.com/2012/02/instructional-overlay-for-webmaking-101.html">instructional overlay</a> mockups. A separate two-pane editor for example snippets is included in the movie frame; my hope here is that by setting the tutorial movies in an actual editing environment, users will obtain a better understanding of how to use our tool. This is further aided by the ability for the tutorial movies to highlight parts of the user interface outside the movie frame.</p>
<p>At present, the prototype awards badges for a few simple things, like creating your first paragraph and header elements. These badges aren&#8217;t necessary to advance the tutorial, however; this is partly because we&#8217;d like the tutorial to be approached in a non-linear way, and also because the assessment algorithms for the badges likely can&#8217;t capture every possible edge case in user input.</p>
<p>The prototype&#8217;s source code can be forked at <a href="https://github.com/toolness/storything">toolness/storything</a> on Github.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/03/storything-interactive-prototype/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Webmaker Tutorial Prototyping</title>
		<link>http://www.toolness.com/wp/2012/03/webmaker-tutorial-prototyping/</link>
		<comments>http://www.toolness.com/wp/2012/03/webmaker-tutorial-prototyping/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 21:54:21 +0000</pubDate>
		<dc:creator>Atul</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drumbeat]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Hackasaurus]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://www.toolness.com/wp/?p=1444</guid>
		<description><![CDATA[Recently I&#8217;ve been playing around with creating interactive tutorials that teach people how to create things on the Web. Check out this prototype. At the end of a movie-like tutorial, you&#8217;ll be given a challenge to write your first bit of HTML. At any time, you can use the scrubber at the bottom-right to review [...]]]></description>
				<content:encoded><![CDATA[<p>Recently I&#8217;ve been playing around with creating interactive tutorials that teach people how to create things on the Web.</p>
<p><a href="http://toolness.github.com/webmaking-tutorial-prototype/">Check out this prototype</a>. At the end of a movie-like tutorial, you&#8217;ll be given a challenge to write your first bit of HTML. At any time, you can use the scrubber at the bottom-right to review any part of the tutorial; anything you&#8217;ve typed so far in the challenge is undone while you&#8217;re scrubbing, and is automatically re-applied once you&#8217;re back at the challenge.</p>
<p>This prototype is an evolution of an idea that Jess Klein wrote about regarding <a href="http://jessicaklein.blogspot.com/2012/02/instructional-overlay-for-webmaking-101.html">instructional overlays</a> for our webmaking tools.</p>
<h3>How It Works</h3>
<p>The tutorial uses <a href="http://popcornjs.org/">Popcorn</a> to construct a &#8220;movie&#8221; that automates the user interface of a two-paned HTML editor with an instructional overlay. I made an ad hoc mini-framework called <a href="https://github.com/toolness/webmaking-tutorial-prototype/blob/gh-pages/tutorial.js">tutorial.js</a> to make it easy to script these sorts of experiences; for example, here&#8217;s what the beginning of the prototype&#8217;s tutorial looks like:</p>
<pre>
Tutorial
  .dialogue("Hi! I am Mr. Love Bomb and will teach you how to be a webmaker now.", 0)
  .typechars("you're really cool.")
  .dialogue("Check it out, this is HTML source code&mdash;the language of the Web.", 0)
  .spotlight("#editor")
</pre>
<p>The <code>dialogue()</code> method just makes the tutorial avatar&mdash;in this case, Mr. Lovebomb&mdash;say something. <code>typechars()</code> types some characters into the HTML editor, and <code>spotlight()</code> draws the user&#8217;s attention to part of the page. Each action is queued to occur serially, in a style inspired by the chaining API of <a href="https://github.com/LearnBoost/soda">soda</a>.</p>
<p>The full tutorial script is at <a href="https://github.com/toolness/webmaking-tutorial-prototype/blob/gh-pages/tutorial-script.js">tutorial-script.js</a>, and the full tutorial source is available on <a href="https://github.com/toolness/webmaking-tutorial-prototype#readme">Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toolness.com/wp/2012/03/webmaker-tutorial-prototyping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
