<?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, 07 Feb 2012 20:20:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<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: CKEditor is not to be trusted (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 want to shoot yourself shortly thereafter.</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, so someone could argue &#8220;maybe they&#8217;re doing it well and you just don&#8217;t get it.&#8221;<br />
This is perfectly valid. 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>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>This rant is just barely getting started, but I&#8217;ll stop here for the moment.</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>
		<item>
		<title>If I don&#8217;t do it, won&#8217;t someone else do it eventually?</title>
		<link>http://blog.strafenet.com/2011/06/09/is-deliberate-action-useless/</link>
		<comments>http://blog.strafenet.com/2011/06/09/is-deliberate-action-useless/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 21:07:40 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Chris]]></category>

		<guid isPermaLink="false">http://blog.strafenet.com/?p=1939</guid>
		<description><![CDATA[Note: This is very much a work in progress. Comments welcome! Ever hear the phrase &#8220;write your congressman?&#8221; Those sorts of actions I like to call &#8220;participating in the tide.&#8221; Combined, perhaps the millions of people who write with you will together make a difference, but not you specifically. I would argue that, even for [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: This is very much a work in progress. Comments welcome!</em></p>
<p>Ever hear the phrase &#8220;write your congressman?&#8221; Those sorts of actions I like to call &#8220;<strong>participating in the tide</strong>.&#8221; Combined, perhaps the millions of people who write with you will together make a difference, but not you specifically.</p>
<p><em>I would argue that, even for great inventions, most of the time we are participating in the tide, not shaping it. </em>Look at, for example, Alexander Graham Bell. You might argue, &#8220;Of course he changed the world! Dude invented the telephone,&#8221; and by some definition, you&#8217;d be right. But when it comes down to it, the telephone was bound to be invented; there was even someone else inventing it at around the same time, and people <a href="http://en.wikipedia.org/wiki/Elisha_Gray_and_Alexander_Bell_telephone_controversy">argue over who was first</a>.</p>
<div class="wp-caption alignleft" style="width: 186px"><img class="  " title="Ferdinand Verbiest, inventor of perhaps the earliest self-propelled vehicle" src="http://upload.wikimedia.org/wikipedia/commons/f/f0/Le_Pere_Ferdinand_Verbiest.gif" alt="" width="176" height="209" /><p class="wp-caption-text">Ferdinand Verbiest, inventor of perhaps the earliest self-propelled vehicle</p></div>
<div class="wp-caption alignleft" style="width: 152px"><br />
<img class="      " title="William Murdoch, built a working steam carriage in 1784" src="http://upload.wikimedia.org/wikipedia/commons/d/d8/William_Murdoch_%281754-1839%29.jpg" alt="" width="142" height="186" /><p class="wp-caption-text">William Murdoch, built a working steam carriage in 1784</p></div>
<div class="wp-caption alignleft" style="width: 152px"><img class="   " title="Oliver Evans, first to get a US patent of a working steam carriage" src="http://upload.wikimedia.org/wikipedia/commons/7/79/Oliver_Evans_%28Engraving_by_W.G.Jackman%2C_cropped%29.jpg" alt="" width="142" height="215" /><p class="wp-caption-text">Oliver Evans, first to get a US patent of a working steam carriage</p></div>
<p><br clear="all" /></p>
<h2>If actions are individually insignificant, why should we as individuals care what we do?</h2>
<p><strong>1. Don&#8217;t give up on the tide:</strong> History is often changed by movements. The fact that our one contribution is small doesn&#8217;t change the fact that if all of our small contributions stopped, so would the world. Whether or not we want to do something more deliberate, being a part of the greater trend <em>is </em>important.</p>
<p><strong>2. Point: This should make us feel better: </strong>We needn&#8217;t worry about changing the world or making a huge difference. Even if we don&#8217;t build a successful social networking service, someone will do it. Even if we don&#8217;t make solar power, someone else is still probably working on it.<br />
And many of the more obscure, unique inventions that wouldn&#8217;t have flowed naturally out of a lab somewhere have become less important, their impact smoothed over by time and trend.</p>
<p><strong>3. Counterpoint: What if it doesn&#8217;t:</strong> Perhaps we still have an urge to make a unique, individual difference? If so, then what?</p>
<p style="padding-left: 30px;">1) <strong>Stop wanting</strong>: There are arguments not to try and shape society in such a non-inevitable manner. Stalin changed Russia, Kim Il Sung changed Korea, and certainly one way to change (short term, though likely not long term) history is to exert power. But history has not conclusively demonstrated that individuals who held this kind of world-shaping, not-likely-to-happen-on-its-own power have really made the world better, despite their best intentions. Perhaps it&#8217;s better just to participate in the tide and make sure we&#8217;re moving the world in the best way we can.</p>
<p style="padding-left: 30px;">2) <strong>Work on ideas</strong>: A more powerful way to influence the world is through thought. Someone may have invented the press and changed the world if Gutenburg didn&#8217;t, but would someone have come up with Marxism, capitalism, or freedom of that press? I suspect for certain ideas, someone would have invented the term. But not all. Would we definitely have open source if no one coined it? An interesting question.</p>
<p style="padding-left: 30px;">3) ???</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.strafenet.com/2011/06/09/is-deliberate-action-useless/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.strafenet.com/feed/ ) in 0.26657 seconds, on Feb 23rd, 2012 at 5:28 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 23rd, 2012 at 6:28 am UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  blog.strafenet.com/feed/ ) in 0.00039 seconds, on Feb 23rd, 2012 at 5:30 am UTC. -->
