<?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>The Blog of Justice</title>
	<atom:link href="http://blog.strafenet.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.strafenet.com</link>
	<description>Since 2004</description>
	<lastBuildDate>Tue, 08 May 2012 18:21:17 +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>Screwing with people considered harmful</title>
		<link>http://blog.strafenet.com/2012/05/08/dicking-people-around-considered-harmful/</link>
		<comments>http://blog.strafenet.com/2012/05/08/dicking-people-around-considered-harmful/#comments</comments>
		<pubDate>Tue, 08 May 2012 12:28:14 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Chris]]></category>
		<category><![CDATA[Thinking Outside the WTF]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=2090</guid>
		<description><![CDATA[Apologies about the rude title, but I couldn&#8217;t find another word that fit. I was opening a business bank account the other month. The process goes as follows: Ask friends and coworkers what banks they recommend. Make a list of banks, including fees, minimum deposits, locations, and other restrictions. (List reviews but give up when [...]]]></description>
			<content:encoded><![CDATA[<p>Apologies about the rude title, but I couldn&#8217;t find another word that fit.</p>
<p>I was opening a business bank account the other month. The process goes as follows:</p>
<ul>
<li>Ask friends and coworkers what banks they recommend.</li>
<li>Make a list of banks, including fees, minimum deposits, locations, and other restrictions.</li>
<li>(List reviews but give up when every bank has 2 star ratings)</li>
<li>Go to bank and ask questions to reveal hidden fees; get 20 page Disclosure of Legalese (this is customary at every bank; if you don&#8217;t get one, it&#8217;s still there)</li>
<li>Pretend to read, sign 15 forms; ask for copy of form <em>you</em> signed and get a &#8220;we don&#8217;t usually give out that form&#8221;</li>
<li>Get any forms of ID/checks/missing that you didn&#8217;t know you needed the first time; acquire debit card/checkbook</li>
</ul>
<p>After this process, two interesting and opposite observations emerge: 1) Our protagonist is clearly more pedantic than most mere mortals, and 2) Despite all the efforts of due diligence on his part, does anyone <em>really</em> doubt he&#8217;ll be hit with some sort of fee at some point?</p>
<p>US banks belong to a special class of institutions, shared with mobile carriers, cable companies and used car salesmen. What&#8217;s interesting about these places is not the degree of hatred they inspire (bad bosses and politicians on the other side&#8211;substituting your personal other&#8211;are also), but rather the kind. A proper analogy might be a well-kept house with bad flooring. Someone unsuspecting might choose to play foursquare in the living room, but those in the know shake their heads at these youngsters and test every step they make.</p>
<p>The true cost society pays for this isn&#8217;t just fixing the floors, but rather being unable to run. Patching up the single parent who gets hit with an overdraft, or being forced to call the cable company every 12 months to get the same rates we started out with is bad enough; <em>learning to mistrust the institutions we work with every day is another thing entirely</em>.</p>
<p>A lot of advice on picking a bank says &#8220;it&#8217;s not the bank, it&#8217;s the banker.&#8221; Now, the real reason to do this is likely to make it easier to get a line of credit, not avoid dickish fees; but this line of thinking &#8211; the mantra of &#8220;find a person, because the process itself isn&#8217;t good enough&#8221; &#8211; reminded me of another, more soviet set of institutions. I think it would be unreasonable to say hidden fees are like a Gulag; I&#8217;m not making that comparison. However, every time someone needs to double check their form filling out of paranoia, or review yet another contract with a magnifying glass, under the expectation of mistrust, that brings us closer to countries and bureaucracies where the process is really and truly broken, countries that we generally call corrupt.</p>
<p>As a more positive example, imagine the process we go through to buy books at a bookstore. Whole regions of our minds dedicated to things like &#8220;will this book poison me?&#8221; and &#8220;do I give up my right to sue when I buy this book?&#8221; and &#8220;will I pay a special extra fee if I try to read this book in a roaming area?&#8221; just&#8230;<em>don&#8217;t exist</em>. Whole sections of cortex are liberated to think about things like characters and plot. It&#8217;s enough to bring out an involuntary grin.</p>
<p>If dickish institutions were designed in such a way that it was transparently clear what we were getting, even if it was expensive, that would be more than a good deal for society &#8211; would it perhaps be a relief?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2012/05/08/dicking-people-around-considered-harmful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Never pile stuff on top of a container</title>
		<link>http://blog.strafenet.com/2012/01/11/never-pile-stuff-on-top-of-a-container/</link>
		<comments>http://blog.strafenet.com/2012/01/11/never-pile-stuff-on-top-of-a-container/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 15:43:21 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[General/Misc.]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=2016</guid>
		<description><![CDATA[The moment you put something on a box with a lid, you&#8217;re going to have to shuffle things around every time you want anything inside the box. And most likely, the stuff inside the box is important, but not important enough that you&#8217;ll bother going inside the box if you have to work at it. [...]]]></description>
			<content:encoded><![CDATA[<p>The moment you put something on a box with a lid, you&#8217;re going to have to shuffle things around every time you want anything inside the box.</p>
<p>And most likely, the stuff inside the box is important, but not important enough that you&#8217;ll bother going inside the box if you have to work at it. So now you&#8217;ll never go inside the box.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2012/01/11/never-pile-stuff-on-top-of-a-container/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working with Terrible Code, Part One: Writing a CKEditor plugin</title>
		<link>http://blog.strafenet.com/2011/12/20/understanding-terrible-code-part-one-ckeditor-is-not-to-be-trusted/</link>
		<comments>http://blog.strafenet.com/2011/12/20/understanding-terrible-code-part-one-ckeditor-is-not-to-be-trusted/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 00:10:47 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Chris]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=2031</guid>
		<description><![CDATA[Understanding Terrible Code, Part One: Writing a CKEditor Plugin Exposition: Why should you care about a random text editor? Modding CKEditor is a well-designed exercise in self-flagellation. CKEditor is a text editor plugin that works with rich text (bold, italics, tables, links, etc.). If you&#8217;ve ever used Gmail or Hotmail, you&#8217;ve used something similar.  CKEditor [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong>Understanding Terrible Code, Part One:</strong></p>
<p style="text-align: center;"><strong>Writing a CKEditor Plugin</strong></p>
<p>Exposition: Why should you care about a random text editor?</p>
<p><strong>Modding CKEditor is a well-designed exercise in self-flagellation.</strong></p>
<p><strong></strong><a href="http://ckeditor.com/demo">CKEditor</a> is a text editor plugin that works with rich text (bold, italics, tables, links, etc.). If you&#8217;ve ever used Gmail or Hotmail, you&#8217;ve used something similar.  CKEditor is relatively easy to <em>use</em>, powerful and has lots of features, and it&#8217;s used <a href="http://ckeditor.com/who-is-using-ckeditor">everywhere</a>. But while the code is well written and well documented, at a macro level there are terrible design things going on, and if you want to <em>modify</em> it, you&#8217;ll be glad you never did end up getting that gun license after all&#8230;</p>
<p>Since I&#8217;ve been wrestling with it for quite a while now, I wanted to share my thoughts:</p>
<ul>
<li><strong>In case you happen to be forced to alter CKEditor as well.</strong> Hopefully this will be a useful breadcrumb trail.</li>
<li><strong>To convince myself I&#8217;m not faking it.</strong> CKEditor has well written source, in the sense of comments and indents and other things they do well, so someone could argue &#8220;maybe they&#8217;re doing it well and you just don&#8217;t get it.&#8221;<br />
This is a perfectly valid counterargument. The best way to figure out if I&#8217;m faking it is to actually try and explain <em>why it&#8217;s bad</em>, and see if this post turns into &#8220;CKEditor is an architectural marvel&#8221; in the process.</li>
<li><strong>Complaining is whining unless you can explain <em>why</em></strong>, and how to make things better.</li>
<li>I need to understand this stuff myself, and <strong>nothing helps with understanding like trying to explain</strong>.</li>
<li>Because I&#8217;ve been staring at this for days and need to say something.</li>
</ul>
<h2>Act One: Parallel Universe APIs</h2>
<p>Half of CKEditor code essentially replicates JavaScript DOM APIs and jQuery. Let&#8217;s use the most radical example of CKEditor manipulation &#8211; the dialog architecture.</p>
<p>CKEditor dialogs are used for special properties. If you want to add a link, you would create a dialog to set the URL.</p>
<p><a href="http://blog.strafenet.com/wp-content/uploads/2011/12/dialogexample.png"><img class="size-medium wp-image-2080 alignnone" title="CKEditor Link Dialog" src="http://blog.strafenet.com/wp-content/uploads/2011/12/dialogexample-300x178.png" alt="" width="300" height="178" /></a></p>
<p>What language do you think dialogs would be designed in? <em>Presumably a language that is used to lay things out in a web browser.</em> Hmmm&#8230;what language do we use for that&#8230;HT nope, you&#8217;re right, it&#8217;s JavaScript:</p>
<blockquote><p>The new dialog system in CKEditor is to be written from scratch. One of the key things in CKEditor is that it doesn&#8217;t rely on HTML pages to run. Everything is created on the fly in JavaScript. In this way, we avoid limitations about cross domain serving of the editor code, like CDN solutions, and enhance the editor performance.</p>
<p><a href="http://docs.cksource.com/FCKeditor_3.x/Design_and_Architecture/Dialog_System#Dialog_Definition">http://docs.cksource.com/FCKeditor_3.x/Design_and_Architecture/Dialog_System#Dialog_Definition</a></p></blockquote>
<p>We&#8217;ll get back to the benefits CKEditor claims later, but let&#8217;s think about this. You&#8217;re laying out a mini-web page. You&#8217;re a web developer and probably lay out web pages all the time. You read <a href="http://www.alistapart.com/">A List Apart</a> obsessively; you understand the difference between content (HTML), presentation (CSS), and behavior (JavaScript), and the benefits of <a href="http://www.alistapart.com/articles/separationdilemma/">separating</a> them.</p>
<p>And then you see this:</p>
<p><iframe style="border: none; width: 100%;" src="http://pastebin.com/embed_iframe.php?i=ccbncmPy" width="320" height="360"></iframe></p>
<p>(This is actual dialog code that CKEditor uses to show a link dialog.)</p>
<p>Is that HTML? Yup &#8211; it looks like a &lt;select&gt; &#8211; there&#8217;s a list of options (items), and an id, and even a label.<br />
Is that JavaScript? Yup &#8211; it&#8217;s got an onChange, a setup, and a commit, whatever that is.</p>
<p>This confuzzlement is compounded by the fact that there are about 1000 (<a href="http://svn.ckeditor.com/CKEditor/trunk/_source/plugins/link/dialogs/link.js">literally, see for yourself</a>) lines of this JavaScript/HTML hybrid. If you separated this into HTML and JavaScript, it would be easy to read, not indented <del>six</del> ten tabs in, and it wouldn&#8217;t take you an hour of sorting to figure out what a dialog that&#8217;s basically a handful of selects and some text fields is doing.</p>
<p>By the way, there&#8217;s CSS too:</p>
<blockquote>
<pre>		var basicCss =
			'background:url(' + CKEDITOR.getUrl( this.path + 'images/anchor.gif' ) + ') no-repeat ' + side + ' center;' +
			'border:1px dotted #00f;';</pre>
</blockquote>
<p>Let&#8217;s establish some of the downsides of this mixed-content architecture:</p>
<ul>
<li>Wading a thousand four-hundred line morass of mixed behavior and content every time you want to change things</li>
<li>No way to test the layout of your dialog without loading all of CKEditor (as opposed to HTML, which can be tested by anyone with a web browser)</li>
<li>You have to relearn all your HTML/JavaScript/CSS ninja skills in a weird JS hybrid</li>
<li>Oh and if you miss a brace, it&#8217;s not like missing an angle bracket &#8211; everything dies. JS is brittle. Did I mention you have to reload all of CKEditor to test your fixes?</li>
</ul>
<p>So how about the benefits? The CKEditor docs claim that you can do cross domain* loading (for content delivery networks, etc.). While there are plenty of things wrong with the solution, the CDN problem is serious and it would be irresponsible to ignore it. Is there another way we can allow CDN loading without replacing all of our HTML with JavaScript?</p>
<p>One option: Write HTML for the dialogs, but convert it into escaped JavaScript internally. Escaped HTML is ugly, but if we compile it, we needn&#8217;t use it except in production.</p>
<p>Another option: Don&#8217;t use a 1-1 HTML counterpart, but use a simplified meta-language.</p>
<p>This rant is just barely getting started. Every time I work on CKEditor I&#8217;ll make sure to add more.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/12/20/understanding-terrible-code-part-one-ckeditor-is-not-to-be-trusted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;When you have enough data, sometimes, you don&#8217;t have to be too clever&#8221;</title>
		<link>http://blog.strafenet.com/2011/12/17/when-you-have-enough-data-sometimes-you-dont-have-to-be-too-clever/</link>
		<comments>http://blog.strafenet.com/2011/12/17/when-you-have-enough-data-sometimes-you-dont-have-to-be-too-clever/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 19:23:34 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Business/The Software Industry]]></category>
		<category><![CDATA[Chris]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=2015</guid>
		<description><![CDATA[Peter Norvig, famed AI researcher and one of the creators of the Stanford AI online class: Past, Present, Future Vision of AI &#8211; Google and AAAI 2011 &#8220;And it was fun looking at the comments, because you&#8217;d see things like &#8216;well, I&#8217;m throwing in this naive Bayes now, but I&#8217;m gonna come back and fix [...]]]></description>
			<content:encoded><![CDATA[<p>Peter Norvig, <a href="http://en.wikipedia.org/wiki/Peter_Norvig">famed</a> AI researcher and one of the creators of the Stanford AI <a href="https://www.ai-class.com">online class</a>:</p>
<p><object width="425" height="344" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="src" value="http://www.youtube.com/v/ql623nyCdKE&amp;hl=en&amp;fs=1&amp;start=340" /><param name="allowfullscreen" value="true" /><embed width="425" height="344" type="application/x-shockwave-flash" src="http://www.youtube.com/v/ql623nyCdKE&amp;hl=en&amp;fs=1&amp;start=340" allowFullScreen="true" allowfullscreen="true" /></object></p>
<p><a href="http://www.youtube.com/watch?v=ql623nyCdKE#t=6m40s">Past, Present, Future Vision of AI &#8211; Google and AAAI 2011</a></p>
<blockquote><p>&#8220;And it was fun looking at the comments, because you&#8217;d see things like &#8216;well, I&#8217;m throwing in this naive Bayes now, but I&#8217;m gonna come back and fix it it up and come up with something better later.&#8217;  And the comment would be from 2006. [laughter] And I think what that says is, when you have enough data, sometimes, you don&#8217;t have to be too clever about coming up with the best algorithm.&#8221;</p></blockquote>
<p style="font-size: smaller">(Peter&#8217;s speaking about search algorithms, but what if you applied this to running a startup? Or life in general?)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/12/17/when-you-have-enough-data-sometimes-you-dont-have-to-be-too-clever/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using code coverage to decide what to deprecate</title>
		<link>http://blog.strafenet.com/2011/12/09/using-code-coverage-to-decide-what-to-deprecate/</link>
		<comments>http://blog.strafenet.com/2011/12/09/using-code-coverage-to-decide-what-to-deprecate/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 16:39:12 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Chris]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=2007</guid>
		<description><![CDATA[A recent post on building a slimmer jQuery got me thinking about the process of deciding what to cut. From a code perspective, it&#8217;s easier to add new features than remove old ones. From a user perspective, it&#8217;s much, much easier to add new features than remove old ones. Nobody knows about your new feature, [...]]]></description>
			<content:encoded><![CDATA[<p>A recent post on<a href="http://blog.jquery.com/2011/11/08/building-a-slimmer-jquery/"> building a slimmer jQuery</a> got me thinking about the process of deciding what to cut.</p>
<p>From a code perspective, it&#8217;s easier to add new features than remove old ones.</p>
<p>From a user perspective, <em>it&#8217;s <strong>much, much</strong> easier to add new features than remove old ones.</em></p>
<p><em></em><strong>Nobody</strong> knows about your new feature, but there are at least three people who love that button you added to the toolbar two years ago. Even if no one else cares, they&#8217;ll make sure to post angry requests on your forums asking why you got rid of it. If you&#8217;re not careful, they&#8217;ll accuse your company of &#8220;not caring about its users,&#8221; or they might even say you &#8220;used to be great, but ever since they got successful they&#8217;ve started to go downhill&#8221;&#8230;ever hear that before? [1]</p>
<p>At the same time, it&#8217;s important to cut features, or you end up sliding down this curve:</p>
<p><img class="alignnone" title="Featuritis" src="http://headrush.typepad.com/photos/uncategorized/featuritis.jpg" alt="" width="440" height="343" /></p>
<p>So how do you decide what to cut?</p>
<h1>Why Not Just Count?</h1>
<p>One of the great things about analytics is getting real data about who&#8217;s using what. Every month, Google Analytics sends me an email that tells me exactly what people are reading on this blog. (Hint: It&#8217;s not the minesweeper articles)</p>
<p>That gave me an idea: Why not generate similar analytics for a library like jQuery?</p>
<p>There&#8217;s a nice list of sites using jQuery available here:</p>
<p><a href="http://docs.jquery.com/Sites_Using_jQuery">http://docs.jquery.com/Sites_Using_jQuery</a></p>
<p>Let&#8217;s take a site and see what it&#8217;s actually using:</p>
<p><a href="http://blog.strafenet.com/wp-content/uploads/2011/12/jQuery-on-Match.png"><img class="size-medium wp-image-2008 alignnone" title="jQuery on Match" src="http://blog.strafenet.com/wp-content/uploads/2011/12/jQuery-on-Match-300x240.png" alt="" width="300" height="240" /></a></p>
<p><em>(Speaking of wanting to stick to old things, Match.com uses jQuery 1.2&#8230;)</em></p>
<p>Match.com&#8217;s landing page is simple enough that we can do an actual list of what calls they make to jQuery, which I&#8217;ve uploaded <a href="http://blog.strafenet.com/wp-content/uploads/2011/12/jQuery-Usage.txt">here</a>.</p>
<p>From this, we can tell that the standard selector function $() gets used a lot, as does readCookie and addClass. From there, the next step is to figure out what they&#8217;re actually calling.</p>
<p>In the case of jQuery, this is not too hard in principle. Get a version of jQuery, add a line that increments a counter every time a function is used, and inject it into your favorite website. It&#8217;s a little too involved for this post, but perhaps in the future (earlier if someone decides to jump in and do it!)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>[1] Back in the 90s, Microsoft obsessed about making sure everything from the past worked, even if it mean<a href="http://www.joelonsoftware.com/articles/APIWar.html"> keeping broken things</a> from earlier versions of Windows:</p>
<blockquote><p>The Windows testing team is huge and one of their most important responsibilities is guaranteeing that everyone can safely upgrade their operating system, no matter what applications they have installed, and those applications will continue to run, even if those applications do bad things or use undocumented functions or rely on buggy behavior that happens to be buggy in Windows <em>n</em> but is no longer buggy in Windows <em>n</em>+1. In fact if you poke around in the AppCompatibility section of your registry you&#8217;ll see a whole list of applications that Windows treats specially, emulating various old bugs and quirky behaviors so they&#8217;ll continue to work.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/12/09/using-code-coverage-to-decide-what-to-deprecate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Even if it&#8217;s a product, sell it like a service</title>
		<link>http://blog.strafenet.com/2011/11/21/even-if-its-a-product-sell-it-like-a-service/</link>
		<comments>http://blog.strafenet.com/2011/11/21/even-if-its-a-product-sell-it-like-a-service/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 16:10:23 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Business/The Software Industry]]></category>
		<category><![CDATA[Chris]]></category>
		<category><![CDATA[Product Design]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=2004</guid>
		<description><![CDATA[(Unfinished) Which would you rather have: An app that, based on preferences you enter about cuisine, price, experience, etc., comes up with a list of restaurants in your neighborhood that fit your criteria? A friend who&#8217;s been to every single restaurant in town that you can always count on to come up with a great [...]]]></description>
			<content:encoded><![CDATA[<p>(Unfinished)</p>
<p>Which would you rather have:</p>
<ul>
<li>An app that, based on preferences you enter about cuisine, price, experience, etc., comes up with a list of restaurants in your neighborhood that fit your criteria?</li>
<li>A friend who&#8217;s been to every single restaurant in town that you can always count on to come up with a great suggestion for food, no matter what you&#8217;re in the mood for?</li>
</ul>
<p>With some exceptions (and there are always exceptions), I&#8217;d rather go to the person first, then the app. Yelp has plenty of suggestions for coffee and wi-fi in the city, but I still check <a href="http://cafetalk.tumblr.com/">Cafe Talk</a>. Amazon has great reviews, but I&#8217;ll often still look at the page of that one blogger who writes a 20 page article just to talk about the pros and cons of one set of headphones.</p>
<p>Why pick one person&#8217;s opinion over the wisdom of crowds and a <a href="http://techcrunch.com/2008/02/26/yelp-raises-15-million-fourth-round-valuation-200-million/">200 million dollar</a> company?*</p>
<p>Simple: The person cares, and the person is a person.</p>
<p>*Note: Yelp is actually an exception, to the extent that its full of people. But the people all care about different things.</p>
<h2>Products are utilities, services are solutions</h2>
<p>First off: this doesn&#8217;t apply everywhere.</p>
<p>I don&#8217;t need a personal assistant to read me my emails or backup my files. I&#8217;m OK with large warehouses of computers doing that, because I know exactly what needs to be done and there isn&#8217;t anything surprising or complicated about it. <em>When I know what I need, I look for a utility.</em></p>
<p>What separates utilities from solutions? <em>Uncertainty.</em></p>
<p>If I&#8217;m looking for a website designer, who would think it was acceptable to hand me a copy of Photoshop, a book on HTML, and say, &#8220;here&#8217;s your app, go for it?&#8221;</p>
<p>A utility is designed to take things we know we need and get them. The best utilities tend to be well targeted and have a specific function. No one has to ask <a href="http://instagr.am/">Instagram</a> what he does at a party; it&#8217;s pretty ______ obvious.</p>
<p>But even there &#8211; how did you get <em>introduced</em> to Instagram?</p>
<p>Did a friend tell you about it? Did you read about it in a blog? Did you see someone using it?</p>
<p>Instagram started out as something unknown, and when it comes to unknowns, we need a <em>personal</em> introduction.</p>
<h2>Even if it&#8217;s a product, start out with a service</h2>
<p>I know the eventual goal of a product-driven startup is to build something that &#8220;scales&#8221; out&#8211;the definition of scale being that we can go out and have a picnic while our software makes monkey.</p>
<p>Nonetheless, I see lots of people who start out with the picnic. Oh, they may be working hard on their <em>product</em>, but there&#8217;s no <em>relationship</em> to the customer. They build the system and throw it over the wall and hope it goes viral. Starting a connection to your customers through an impersonal, on-stage launch is how you get casual interest. At the beginning, there will be no one but you to give a personal introduction to your gadget.</p>
<p>It can be as simple as telling the story of what it does and letting them use it, but you have to provide that service the first few times around. Even in the greatest product driven businesses, it&#8217;s people who are telling the story, not the product. <strong><em>The eventual goal of scale is not to stop telling the story, but to have others tell it for you.</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/11/21/even-if-its-a-product-sell-it-like-a-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Final Fantasy VI is several games</title>
		<link>http://blog.strafenet.com/2011/11/15/final-fantasy-vi-is-several-games/</link>
		<comments>http://blog.strafenet.com/2011/11/15/final-fantasy-vi-is-several-games/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 16:09:43 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Chris]]></category>
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=1999</guid>
		<description><![CDATA[(no spoilers) In most games, there&#8217;s a specific role to play. In Serious Sam, I control a wise cracking uber muscled super soldier with absurd amounts of ammunition. In GTA, I&#8217;m a city dweller only interested in cars, and perhaps an aspiring criminal lowlife. When I play FFVI, what am I playing exactly? On the [...]]]></description>
			<content:encoded><![CDATA[<p>(no spoilers)</p>
<p>In most games, there&#8217;s a specific role to play. In Serious Sam, I control a wise cracking uber muscled super soldier with absurd amounts of ammunition. In GTA, I&#8217;m a city dweller only interested in cars, and perhaps an aspiring criminal lowlife.</p>
<p>When I play FFVI, what am I playing exactly? On the one hand, I&#8217;m an explorer, flying around a continent, discovering caves and towns and places, and solving the errant puzzle. I&#8217;m also one of a rotating cast of characters, each with their own motivations and personalities, an actor in a vast, world-transforming narrative. On top of that, I&#8217;m also playing a mini-tactical combat simulator every 30 seconds.</p>
<p>I&#8217;ll bet that most people playing a JRPG play it somewhat more holistically than that. We don&#8217;t separate the different parts of the experience unless they break immersion (the Bioshock hacking minigame comes to mind). The trouble with JRPGs is that they&#8217;re often so well made that the seams don&#8217;t show, but they&#8217;re still there. (Now that I think about it, Myst, for all its foibles, is remarkably cohesive for a story game&#8230;)</p>
<p>Exercise: What if you actually broke all the different pieces apart? What if there was a game that was completely wandering around a map picking up things and making dialogue choices? And another game that was nothing but fighting through a big arena?</p>
<p>It seems, at least superficially, that both of these games would be much worse than FFVI, but it could just be that we don&#8217;t imagine those games polished on the level that FFVI is.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/11/15/final-fantasy-vi-is-several-games/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exceptions</title>
		<link>http://blog.strafenet.com/2011/10/08/the-exceptions/</link>
		<comments>http://blog.strafenet.com/2011/10/08/the-exceptions/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 04:50:03 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Business/The Software Industry]]></category>
		<category><![CDATA[Chris]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=1991</guid>
		<description><![CDATA[The scenario: A simple prototype in JavaScript, so I could test play an MVP of my new game. The problem: Why is this d_mn thing taking so long? &#160; Ever since I started working on my own, I&#8217;ve spend far more time figuring out how to motivate myself. Because I&#8217;m working in a startup, I [...]]]></description>
			<content:encoded><![CDATA[<p>The scenario: A simple prototype in JavaScript, so I could test play an MVP of my new game.</p>
<p><em>The problem: Why is this d_mn thing taking so long?</em></p>
<p>&nbsp;</p>
<p>Ever since I started working on my own, I&#8217;ve spend far more time figuring out how to motivate myself. Because I&#8217;m working in a startup, I make sure to do just the minimum amount of work to make a viable product, so that I can save time and work on other things.</p>
<p>And yet, I find myself staring into space, going on Google Reader, Hacker News, playing games, or anything I can find aside from work.</p>
<p>As I&#8217;m talking with a friend online, we make some observations:</p>
<ul>
<li>While the eventual result is interesting, the work I&#8217;m doing is boring.</li>
<li>The reason I&#8217;m bored is because the work is easy.</li>
<li><strong>Therefore, if I want to be more productive, I need to make my work harder.</strong></li>
</ul>
<p>I throw out the disorderly, simple, get it done code that everyone says you should write for a prototype. I make things organized. I put all my variables into neat, sensible structures that follow design principles. <em>I use a regular expression to replace 6 lines that I could&#8217;ve done by hand in five minutes.</em></p>
<p><em></em>All of a sudden, I&#8217;m getting work done again.</p>
<p>What gives?</p>
<p>&#8211;</p>
<p>I&#8217;ve talked with scores of startups over the years, and they consistently err on the side of overbuilding rather than underbuilding. Fancy prototypes take months to code, months that are wasted if your idea of a customer is the two people you told at the startup meetup you went to last week that said it looked kind of cool; people create entire frameworks to build sites that could be done in the time it takes to write a shell script (that installs WordPress).</p>
<p>Thus, the rule to build fast and build cheap was born.</p>
<p>Am I some kind of unlikely exception? Perhaps. But after giving it more thought, I realized that the need to make some things hard is not surprising, and not unique.</p>
<p>&#8211;</p>
<p>Are you working at a startup?</p>
<p>Why?</p>
<p>The pay is (sometimes) lower and the responsibilities are (often) greater. Most of the programmers I know working on their own projects are <em>exceptionally goo</em>d at programming. The hackers aren&#8217;t hanging out at the back of the bell curve. They can pass FizzBuzz, they know it, and that&#8217;s exactly why they&#8217;re finding a place where they live or die by their skills.</p>
<p>So it&#8217;s not entirely surprising that, if you pick people who are fairly competent at coding, so competent that they want to go to a place where they may be solely responsible for the technical success of the product they build, that they might just prefer not to always have simple, somnambulist-friendly code assignments.</p>
<p>Now, as with any essay that argues a point, you can poke holes in this thesis. Perhaps, you might say, the original rule isn&#8217;t against giving yourself a technical challenge from time to time, but rather as a safety railing to stop the people who want to make Pandora Craigslist Farmville with an extra layer on top so you can tag your singing cows with pictures from your last missed connection. And that&#8217;s a fair point.</p>
<p><span style="text-decoration: underline;">What we do</span> thrives on exceptions. I wouldn&#8217;t be able to think of a good example, but by chance, I read of one in the NYT yesterday:</p>
<blockquote><p>When asked what market research went into the iPad, Mr. Jobs replied: “None. It’s not the consumers’ job to know what they want.”</p></blockquote>
<p>Do what works.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/10/08/the-exceptions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sometimes, semi consciousness = discipline</title>
		<link>http://blog.strafenet.com/2011/07/01/sometimes-semi-consciousness-discipline/</link>
		<comments>http://blog.strafenet.com/2011/07/01/sometimes-semi-consciousness-discipline/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 15:34:40 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Chris]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=1964</guid>
		<description><![CDATA[When most fully aware, we often have a voice running in our head (no, not that kind of voice) that thinks through things verbally. Usually that&#8217;s the best time to think about stuff, but when we have to work, sometimes it&#8217;s better to have our internal monologue be off. Are there psychological terms for this?]]></description>
			<content:encoded><![CDATA[<p>When most fully aware, we often have a voice running in our head (no, not that kind of voice) that thinks through things verbally. Usually that&#8217;s the best time to think about stuff, but when we have to work, sometimes it&#8217;s better to have our internal monologue be off.</p>
<p>Are there psychological terms for this?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/07/01/sometimes-semi-consciousness-discipline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Importance of Morning Routine (Morning Routine 2.0)</title>
		<link>http://blog.strafenet.com/2011/06/21/the-importance-of-morning-routine-morning-routine-2-0/</link>
		<comments>http://blog.strafenet.com/2011/06/21/the-importance-of-morning-routine-morning-routine-2-0/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 20:21:20 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Business/The Software Industry]]></category>
		<category><![CDATA[Chris]]></category>
		<category><![CDATA[General/Misc.]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=1953</guid>
		<description><![CDATA[Note: This is very much a work in progress. Comments welcome! So you&#8217;ve decided to strike out on your own, by freelancing or start a company. The first day you get up, you realize you&#8217;re free. No office, no working hours, no one staring over your shoulder, no constant pressure to have your butt in [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: This is very much a work in progress. Comments welcome!</em></p>
<p><em> </em>So you&#8217;ve decided to strike out on your own, by freelancing or start a company. The first day you get up, you realize you&#8217;re free. No office, no working hours, no one staring over your shoulder, no constant pressure to have your butt in a chair doing nothing. Great, right?</p>
<p>Well, kind of. The first month works great: you&#8217;re super productive and everything gets done in two hours, and then you go  home and watch TV the rest of the day. Then your subconscious realizes that if you stay home, you can do nothing but watch TV and surf the web all day, right away.</p>
<p>So you go to coffee shops and libraries. For free, or the price of a latte, you can get wireless, and work with fewer distractions. [1]</p>
<p>There&#8217;s only one other big problem: the alarm clock.</p>
<p>[1] If that&#8217;s too much angling for seats for you, you can also find a good coworking space for a few hundred bucks a month.</p>
<h2>The alarm clock</h2>
<p><a href="http://blog.strafenet.com/wp-content/uploads/2011/06/4469803188_9e58ab1236_m.jpg"><img title="Alarm Clock" src="http://blog.strafenet.com/wp-content/uploads/2011/06/4469803188_9e58ab1236_m.jpg" alt="This one is pretty fancy" width="180" height="240" /></a></p>
<p><a href="http://www.flickr.com/photos/matsuyuki/4469803188/">Credit</a></p>
<p>&nbsp;</p>
<p>The alarm clock is, biologically speaking, the enemy. Studies almost universally seem to show that having less sleep is the equivalent of taking the stupid knob on your brain and turning it up, all day. Any machine that interrupts your natural sleep cycles can&#8217;t be good; in nature, it&#8217;s essentially the equivalent of having a (mostly) friendly bear wander by your hut at 6 am every morning; you wake up groggy, stressed out, forced into action. An entire company was <a href="http://wakemate.com/">started</a> and <a href="http://news.ycombinator.com/item?id=960163">funded</a> around avoiding it.</p>
<p>So, naturally, the first thing you do, once you&#8217;re free, is turn it off. The only problem: You&#8217;re a night owl. So now you have random hours. Every day you wake up, and you&#8217;re not sure what time it&#8217;ll be.<br />
Do you just head to the same cafe, whether it&#8217;s open for 12 hours or 4?</p>
<h2>Cognitive Load</h2>
<p>One of the hidden advantages of regular office hours in a regular office is <em>reduced cognitive load</em>. If you have to work every day, but you&#8217;re not sure where or when, you spend time <em>thinking </em>and processing: &#8220;Is this place open? Is it worth it to commute 30 minutes if they&#8217;re going to close at 5? Maybe I should just stay home today. I wonder what&#8217;s on my email.&#8221;</p>
<p>Continued for too long, this thinking drains your reserve of mental energy, before you&#8217;ve gotten to work.</p>
<p>With a rigid, defined procedure, none of this thinking takes place: You roll out of bed, put on your clothes, do whatever and in 30 minutes you&#8217;re in the office. And you haven&#8217;t had to make any decisions yet. Your mental energy is saved for when you get in and tackle the first work-related problem.</p>
<p>That&#8217;s the benefit of reduced cognitive load.</p>
<h2>Morning Routine 2.0</h2>
<p>Does this mean that you, the freewheeling self-employed freelancer, need to don a suit every single day, set your alarm clock for 4 in the morning, and go for a run of 1.8 miles before coming in for a coffee and commute to the office?</p>
<p>Fortunately, it doesn&#8217;t.</p>
<p>The most important thing that you need to have in the morning is not super rigid rules, but <em>a set of algorithms that reduce cognitive load</em>.</p>
<p>Most likely, in the morning, you&#8217;re making the same set of decisions, over and over again:</p>
<ul>
<li>What should I wear?</li>
<li>Where should I work?</li>
<li>What am I working on today?</li>
<li>How long should I work?</li>
</ul>
<p>For a full-time employee, these sets of questions have the same answer, every single day. Regardless of whether you&#8217;re feeling great or tired, regardless of what you have to do that day or what appointments you have, you have to answer these questions with the same location and the same time.</p>
<p>Using the same answer every day may be easy, but it doesn&#8217;t always fit. Sometimes you&#8217;re taking calls and networking all day; sometimes there&#8217;s a tropical hurricane heading past your state and it&#8217;s pouring buckets for the next week.</p>
<p>So, instead of a morning routine, have a morning algorithm. Here&#8217;s one I&#8217;m starting to use:</p>
<ol>
<li>Pick out clothes the day before, based on weather and schedule.</li>
<li><strong>If I have to take calls that day</strong>: pull out the laptop and work from home (It&#8217;s hard to take calls in a public space).</li>
<li><strong>If there&#8217;s a meeting/event to go to</strong>: find a place to work near the meeting place</li>
<li><strong>If it&#8217;s before X o&#8217;clock</strong>: Work at the faraway office (most productive for long blocks of time)</li>
<li><strong>If it&#8217;s after X o&#8217;clock</strong>: Work at a nearby coffee shop.</li>
</ol>
<p>With whatever algorithm you use, the instructions should be so simple, straightforward and brain dead that you can apply them in 5 seconds without questioning them. And once you&#8217;ve polished your algorithm over a few weeks of use, <em>you should always follow it to the letter</em>. Amend it with the greatest caution, because once you start changing it every morning, the benefits of reduced cognitive load disappear.</p>
<p>By doing all your thinking beforehand, you can save your brain cells for when your routine is over and your real work begins.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/06/21/the-importance-of-morning-routine-morning-routine-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.strafenet.com/feed/ ) in 0.33743 seconds, on May 21st, 2012 at 2:59 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 21st, 2012 at 3:59 am UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  blog.strafenet.com/feed/ ) in 0.00040 seconds, on May 21st, 2012 at 3:54 am UTC. -->
