<?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>Kyle Cordes</title>
	<atom:link href="http://kylecordes.com/feed" rel="self" type="application/rss+xml" />
	<link>http://kylecordes.com</link>
	<description>Software, Business, and Life</description>
	<lastBuildDate>Wed, 01 Sep 2010 14:38:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Refactoring some Factor code</title>
		<link>http://kylecordes.com/2010/refactoring-factor</link>
		<comments>http://kylecordes.com/2010/refactoring-factor#comments</comments>
		<pubDate>Sat, 28 Aug 2010 04:17:48 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[factor]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=735</guid>
		<description><![CDATA[Most of the software I work with is very practical. At Oasis Digital we mostly create line-of-business enterprise software, and even when I step away from that, I usually pick up a tool or language that has a good likelihood of mainsteam adoption.

Sometimes, though, I like to really stretch my mind. For that, it&#8217;s hard [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the software I work with is very practical. At Oasis Digital we mostly create line-of-business enterprise software, and even when I step away from that, I usually pick up a tool or language that has a good likelihood of mainsteam adoption.</p>
<p><a rel="attachment wp-att-738" href="http://kylecordes.com/2010/refactoring-factor/calc-gui"><img class="alignright size-full wp-image-738" title="calc-gui" src="http://kylecordes.com/blog/wp-content/uploads/2010/08/calc-gui.png" alt="" width="223" height="281" /></a></p>
<p>Sometimes, though, I like to really stretch my mind. For that, it&#8217;s hard to beat <a href="http://factorcode.org/">Factor</a>. Factor is fascinating in that it combines a goal of efficiency and practicality, with a syntax and computation model which are quite alien even to a software polyglot. Don&#8217;t let the stack-ness deceive you; it&#8217;s a big leap even if you&#8217;ve used FORTH and grown up with a HP RPN programmable calculator.</p>
<p>So I set about this evening to work with some Factor code, a <a href="http://re-factor.blogspot.com/2010/08/calculator-with-gui.html">simple GUI calculator posted a few days ago</a> by <a href="http://twitter.com/mrjbq7">John Benediktsson</a>. I bit off an apparently small bit of work: remove the &#8220;code smell&#8221; of that global variable, and in the process, make it so multiple calcs each have their own model (rather than a global shared state).</p>
<p><a href="http://github.com/kylecordes/factor-calc-refactored/blob/2668d3df9b8f8a07994324c491f2ec6ae0481334/calc-ui.factor">Original version from John</a></p>
<p><a href="http://github.com/kylecordes/factor-calc-refactored/blob/master/calc-ui.factor">My finished version</a></p>
<p>The two most important pieces of updated code:</p>
<p><a rel="attachment wp-att-737" href="http://kylecordes.com/2010/refactoring-factor/factor-code-screenshot"><img class="alignnone size-full wp-image-737" title="factor-code-screenshot" src="http://kylecordes.com/blog/wp-content/uploads/2010/08/factor-code-screenshot.png" alt="" width="512" height="256" /></a></p>
<p>The changes consist approximately of:</p>
<ul>
<li>Change all the button words to accept a model input</li>
<li>Change the &lt;row&gt; word to accept a model and use map instead of output&gt;array</li>
<li>Remove the calc variable</li>
<li>Change the calc-ui word to shuffle things around and use make rather than output&gt;array</li>
</ul>
<p>In case it isn&#8217;t obvious from my text above or the source code, <strong>I am not a Factor programmer</strong>, please do not use this as example code. On the other, I learned a bunch of little things about Factor, and perhaps implicitly about concatenative programming in general, in the process of making this work.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/refactoring-factor/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What is the Best Git GUI (Client) for Windows?</title>
		<link>http://kylecordes.com/2010/git-gui-client-windows</link>
		<comments>http://kylecordes.com/2010/git-gui-client-windows#comments</comments>
		<pubDate>Mon, 23 Aug 2010 16:37:50 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[source-control]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=716</guid>
		<description><![CDATA[I adopted Git as my primary source control tool a couple of years ago, when I was using Windows as my primary (90%) desktop OS. Since then I’ve switched to 75% Mac OSX, but I still use Git on Windows for a few projects, and I get a lot of questions about Git on Windows.
I [...]]]></description>
			<content:encoded><![CDATA[<p>I adopted <a href="http://git-scm.com/">Git</a> as my primary source control tool a couple of years ago, when I was using Windows as my primary (90%) desktop OS. Since then I’ve switched to 75% Mac OSX, but I still use Git on Windows for a few projects, and I get a lot of questions about Git on Windows.</p>
<p>I use msysgit (and its included GUI) most often myself, but I don’t have a clear answer as to which is the “best” Git GUI for Windows. I can offer this list of choices, though, along with some thoughts about them.</p>
<p>There is also a <a href="https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools">very long list of Git tools on the main Git wiki</a>; but that page is just a list, without any other information.</p>
<h2>msysgit</h2>
<p><a href="http://code.google.com/p/msysgit/">msysgit</a> is the main project which ships a Windows port of Git. It is based on MSYS, so it fits in the Windows ecosystem a bit better than the cygwin Git port.</p>
<p><a rel="attachment wp-att-721" href="http://kylecordes.com/2010/git-gui-client-windows/msysgit1"><img class="alignnone size-full wp-image-721" title="msysgit" src="http://kylecordes.com/blog/wp-content/uploads/2010/08/msysgit1.png" alt="" width="512" height="286" /></a></p>
<p>msysgit includes the same Tk-based GUI tools as Git on Linux: a commit tool and a repo-browse tool, plus a bit of shell integration to active the GUI by right-clicking in Windows Explorer, plus a new thing call git-cheetah, which appears to be heading toward Tortoise-style integration. These tools are a bit ugly, but have good and useful functionality. I don’t mind the ugly (I get my fix of stylish software over on my Mac&#8230;), and I find the features ample for most work.</p>
<p>If you don’t know where to start, or if you want a Linux-like Git experience, start with msysgit and learn to use its tools.</p>
<p>msysgit is free open source software. It is under active development, and keeps up with the upstream Git versions reasonably well. There is even a portable (zero-install) version available.</p>
<p>My biggest gripe with msysgit (and its GUI) is that I had to figure out how to use it effectively myself. I could have really used a video walkthrough of how to be productive with it, back when I was starting out. That was a long time ago for me, but might be Right Now for people reading this post. If anyone can suggest such a tutorial, I&#8217;ll link to it here.</p>
<h2>TortoiseGit</h2>
<p>This is an attempt to port TortoiseSVN to git, yielding <a href="http://code.google.com/p/tortoisegit/">TortoiseGit</a>. If you like and use TortoiseSVN, you’ll probably find this worth a try. I haven’t tried it yet myself.</p>
<p><a rel="attachment wp-att-722" href="http://kylecordes.com/2010/git-gui-client-windows/commit-tor"><img class="alignnone size-full wp-image-722" title="TortoiseGit commit screen" src="http://kylecordes.com/blog/wp-content/uploads/2010/08/commit-tor.jpg" alt="" width="623" height="526" /></a></p>
<p>TortoiseGit is free open source software, and is under active development.</p>
<h2>Git Extensions</h2>
<p>This Git GUI has a shell extension (like the Tortoise family) and also a plugin for Visual Studio. From the screen shots, it appears to be feature-rich and complete.</p>
<p><a rel="attachment wp-att-725" href="http://kylecordes.com/2010/git-gui-client-windows/commitlog-git-extensions"><img class="alignnone size-full wp-image-725" title="CommitLog-Git-Extensions" src="http://kylecordes.com/blog/wp-content/uploads/2010/08/CommitLog-Git-Extensions.jpg" alt="" width="655" height="412" /></a></p>
<p><a href="http://code.google.com/p/gitextensions/">Git Extensions</a> is free open source software, and is under active development.</p>
<h2>SmartGit</h2>
<p>Unlike the other tools listed here, <a href="http://www.syntevo.com/smartgit/index.html">SmartGit</a> is a commercial product (from a German company), starting at around $70. It appears to be more polished than the others, as is often the case with commercial products. It also appears to be quite feature-rich.</p>
<p><a rel="attachment wp-att-726" href="http://kylecordes.com/2010/git-gui-client-windows/smartgit-project-screen"><img class="alignnone size-full wp-image-726" title="smartgit-project-screen" src="http://kylecordes.com/blog/wp-content/uploads/2010/08/smartgit-project-screen.png" alt="" width="716" height="498" /></a></p>
<p>I don’t know how SmartGit fits in with the Git licensing; Git is licensed GPL (v2), so I assume (hope?) SmartGit has found some way to use it under the hood without linking to it in a way that would cause license trouble.</p>
<p>SmartGit requires a Java runtime, implying that it is written in Java. Five year ago I thought of that as a caveat; but today, Java-based GUIs can be extremely attractive and fast, so I don’t see as a problem at all.</p>
<h2>Is IDE Integration Vital?</h2>
<p>I know people who swear by their IDE experience, and are aghast at the thought of any daily-use dev tool that is not integrated with their IDE. It is almost as though for this group, multitasking does not exist, and any need to run more than one piece of software at the same time is a defect.</p>
<p>Now I love a good IDE as much as anyone (I&#8217;ve urged and coached many developers to move from an editor to an IDE), but I don&#8217;t agree with the notion that source control must always be in the IDE. IDE-integrated source control can be very useful, but there are sometimes cases where non-integrated source control wins.</p>
<p>The most common example for me is when using Eclipse. There are two annoyances I see regularly:</p>
<ul>
<li>Eclipse assumes that one Eclipse project is one source control project, an assumption that is sometimes helpful and sometimes painful. In the latter case, simply ditch the Eclipse integration, and use a whole workspace (N projects) as a single source-control project, outside of Eclipse.</li>
<li>Sometimes Eclipse source control integration bogs down performance. Turn it off, and things speed up.</li>
</ul>
<p>Therefore, when I use Eclipse, I generally manage the files from outside, using msysgit, command line, etc.</p>
<h2>Feedback Wanted</h2>
<p>I’d love to hear about:</p>
<ul>
<li>More Windows Git GUIs to list here</li>
<li>Anything else I’ve missed</li>
</ul>
<p>.. via the contact page (link at the top of the page). I try to reply to all email within a few days.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/git-gui-client-windows/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>I Admire the Ruby Community</title>
		<link>http://kylecordes.com/2010/admire-ruby-community</link>
		<comments>http://kylecordes.com/2010/admire-ruby-community#comments</comments>
		<pubDate>Fri, 20 Aug 2010 02:49:13 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=708</guid>
		<description><![CDATA[Over the last year or so, I&#8217;ve spent perhaps 50 hours rethinking what kind of business Oasis Digital should be. I&#8217;ve studied business models. I&#8217;ve made spreadsheets. I&#8217;ve looked around that numerous other consulting firms. The results of all that&#8230; are slowly emerging. Stay tuned.
In the meantime, though, I noticed something very interesting: the firms [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last year or so, I&#8217;ve spent perhaps 50 hours rethinking what kind of business Oasis Digital should be. I&#8217;ve studied business models. I&#8217;ve made spreadsheets. I&#8217;ve looked around that numerous other consulting firms. The results of all that&#8230; are slowly emerging. Stay tuned.</p>
<p>In the meantime, though, I noticed something very interesting: the firms that appeal to me most, in terms of web site content, community involvement, portfolios, marketing approach, etc., are disproportionately Ruby or Ruby-Rails shops. I admire the &#8220;vibe&#8221; of the Ruby community:</p>
<ul>
<li>Strong focus on design, to the extent that some Ruby-centric development firms have web sites which could pass for visual-design firms instead.</li>
<li>Ruby developers seem unusually aware of the extent to which syntax and conciseness matter.</li>
<li>There is much discussion of craftsmanship, though I&#8217;d need to survey a broader swath of production code to determine whether this discussion has a basis in reality.</li>
<li>Seemingly contrary to the above factors, Rubyists also appear to be unusually pragmatic.</li>
<li>This pragmatism translates to real-world financial impact: many developers make a good living with Ruby, and many firms are very happy with their Ruby projects.</li>
<li>Ruby events are numerous, nationwide.</li>
</ul>
<p>There are numerous Ruby- or Ruby-Rails-centric development firms, and Oasis Digital is not one of them (we are perhaps a <strong>5%-or-so Ruby shop</strong>, with Ruby expertise to effectively attack automated sysadmin, integration projects, and so on). We aren&#8217;t going to become a Ruby-centric-firm, either; and there are some technical aspects of Ruby that don&#8217;t impress me.</p>
<p>Rather, we want to bring some of the cultural qualities seen in the Ruby community, to other languages and tools. We care about design much more than most firms, and it shows in our GUIs. We care about user experience, and we are obsessed with quality, working results.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/admire-ruby-community/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sometimes, Establishing Expertise Doesn&#8217;t Pay Off</title>
		<link>http://kylecordes.com/2010/expertise-doesnt-pay</link>
		<comments>http://kylecordes.com/2010/expertise-doesnt-pay#comments</comments>
		<pubDate>Fri, 20 Aug 2010 00:19:13 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[delphi]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=702</guid>
		<description><![CDATA[Recently I analyzed the relative payoff from different types of work I&#8217;ve done in my career to date. Some of the work has paid off reasonably well. But one particular bit of it stands out as a counter-example to common wisdom:
Between 1997 and 2000, I spent countless hours on the BDE Alternatives Guide, a section [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I analyzed the relative payoff from different types of work I&#8217;ve done in my career to date. Some of the work has paid off reasonably well. But one particular bit of it stands out as a counter-example to common wisdom:</p>
<p>Between 1997 and 2000, I spent countless hours on the BDE Alternatives Guide, a section of this web site devoted to listing and analyzing the dozens of third-party database access libraries available for Delphi in that era. Delphi shipped with the BDE a not-great mechanism for database access. BDE was Borland&#8217;s answer to Microsoft&#8217;s ODBC, but unlike the latter, BDE didn’t get industry-wide support.</p>
<p>Working on the BDE Alternatives Guide had many positive payoffs:</p>
<ul>
<li>It created a much-needed resource, greatly appreciated by thousands of developers.</li>
<li>I learned enormously in the process.</li>
<li>It put me in touch with dozens of library vendors, and many hundreds of developers.</li>
<li>It generated many incoming links and much traffic, around a million page views over a 5-year period.</li>
<li>Banner advertisements brought in a few hundred dollars, before I scrapped them to avoid the appearance of bias.</li>
<li>It made me reasonably well-known in the Delphi world, which was growing rapidly at that time. (Our team at <a href="http://oasisdigital.com/delphi-development.html">Oasis Digital still does some Delphi work</a>, by the way.)</li>
</ul>
<p>You might think, though, that establishing expertise as a Delphi database integration expert, would result in lots of consulting leads, new business, and job offers. Let’s look at the stats:</p>
<ul>
<li>Total number of leads generated: <strong>0</strong></li>
<li>Total consulting work generated: <strong>$0</strong></li>
<li>Total job inquiries and offers: <strong>0</strong></li>
</ul>
<p>Yes, that&#8217;s right. Not a single firm ever contacted me to inquire about consulting, development, etc., as a result of the BAG. <strong>I&#8217;m still glad I did the work, for all the reasons above.</strong> But it is a counter-example to the notion of showing expertise and building a following, as a way to generate business interest. Sometimes the work pays off in new business, and sometimes it doesn&#8217;t.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/expertise-doesnt-pay/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Write your whole stack in JavaScript with Node.JS</title>
		<link>http://kylecordes.com/2010/node-whole-stack</link>
		<comments>http://kylecordes.com/2010/node-whole-stack#comments</comments>
		<pubDate>Thu, 24 Jun 2010 01:09:18 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[contest]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=679</guid>
		<description><![CDATA[Node is a combination of Google&#8217;s V8 JavaScript implementation, and various plumbing and libraries. The result is an unusual and clever server programming platform. Node is in a fairly early development phase, and already has a remarkably active community: ~9000 mailing list messages (as of June 2010) and many dozens of projects and libraries. I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nodejs.org/">Node</a> is a combination of Google&#8217;s V8 JavaScript implementation, and various plumbing and libraries. The result is an unusual and clever server programming platform. Node is in a fairly early development phase, and already has a remarkably active community: <a href="http://groups.google.com/group/nodejs">~9000 mailing list messages</a> (as of June 2010) and <a href="http://wiki.github.com/ry/node/">many dozens of projects and libraries</a>. I&#8217;ve spent some time digging through Node code and writing small bits of it, and was pleased with what I found.</p>
<h2>Why is Node worthy of attention?</h2>
<ul>
<li>JavaScript is a <a href="http://kylecordes.com/2007/javascript-nbl">Next Big Language</a>, it is everywhere. It is probably the most widely used programming language ever.</li>
<li>I know a few things about asyncronous server programming, having done a lot of it in 1990s IVR software; it is very well suited to serving a large user population.</li>
<li>Node is accumulating libraries at an impressive rate, indicating momentum.</li>
<li>There are significant advantages in developing a whole application stack (server and client code) in a single language. For example, this makes code and business logic sharing works across tiers. Using Node, a JavaScript-HTML tool, a JavaScript-CSS tool, JSON, etc., it is possible to develop a complex web application using only JavaScript.</li>
</ul>
<p>Node is not all unicorns and roses though.; my most serious misgiving about it is that it does not (yet) have a great strategy to make straightforward use of many-core servers. We&#8217;ll have to see how that develops over time.</p>
<h2>Node Knockout</h2>
<p>The team at <a href="http://www.fortnightlabs.com/">Fortnight Labs</a> is putting together <a href="http://nodeknockout.com/">Node Knockout</a>, a 48-hour Node programming contest. I am a fan of such contests. I&#8217;ve offered to help out by being a judge, and I&#8217;ve also signed up Oasis Digital as a sponsor.</p>
<p>As a judge, I can&#8217;t be on a team; I&#8217;ve like to see a team or two form here in St. Louis, though.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/node-whole-stack/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Helping Our Customers Hire</title>
		<link>http://kylecordes.com/2010/helping-our-customers-hire</link>
		<comments>http://kylecordes.com/2010/helping-our-customers-hire#comments</comments>
		<pubDate>Mon, 14 Jun 2010 20:45:08 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[hiring]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=671</guid>
		<description><![CDATA[For today, a &#8220;day job&#8221; topic:
Oasis Digital (my firm) is a custom software development shop. It is not a staffing or recruiting firm; there are many good firms in those businesses, and I have no desire to join them in that market. Oasis Digital doesn&#8217;t offer contract-to-hire, it doesn&#8217;t charge a percentage of a hire&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>For today, a &#8220;day job&#8221; topic:</p>
<p>Oasis Digital (my firm) is a custom software development shop. It is not a staffing or recruiting firm; there are many good firms in those businesses, and I have no desire to join them in that market. Oasis Digital doesn&#8217;t offer contract-to-hire, it doesn&#8217;t charge a percentage of a hire&#8217;s pay, and does not recruit in for customer placement.</p>
<p>Nonetheless, we do occasionally help our customers hire.</p>
<h2>Really?</h2>
<p>I&#8217;ve heard customers and our own team members express surprise at this. Isn&#8217;t it against our own interest to help a customer with a direct hire, who might end up doing some work instead of Oasis Digital doing it?</p>
<p>In a short-term, trivial sense it is perhaps against our interest. If we wanted every project to go on forever, using 100% only Oasis Digital staff, then we would make sure to never help any customer with any hire at all. But that is completely unrealistic. There are <strong>millions</strong> of software developers (and sometimes it seems almost as many software development firms). We are in a competitive market. Our customers have a choice, they can do business with us or have someone else write their software instead, regardless of whether we help them with hiring.</p>
<p><strong>Therefore</strong>, the real question is whether to be greedy for the short term, or visionary for the long term. We choose the latter. Our policy is that we are happy to help our customers hire direct staff. We believe that this will, in the long term, lead to success for our customers and for Oasis Digital.</p>
<p>We assist with hiring in 3 ways.</p>
<h2>Direct Assistance with Hiring and Onboarding</h2>
<p>At Oasis Digital we have a somewhat unusual hiring process: in addition to the usual interviews by phone, in person, and otherwise, we ask (and pay) prospective developers to write some code for us based on a short specification. The resulting code, and conversation about it, provides a great opportunity to get to know someone (and to assess the results they will create) very quickly before hiring them. We assess technical skills as well as teamwork / cultural fit.  We have a high bar to hiring and a defined process to reach that bar. At the same time, our process respects potential employees, by not asking for sample work to be done for free.</p>
<p>A good hire, though, is not the finish line. It is the starting line! During the first months of a new developer’s work we have an <a href="http://en.wikipedia.org/wiki/Onboarding">onboarding</a> process in which the new developer sets up a work environment (mostly by referring to project documentation), then implements tiny changes, then small changes, then medium changes, then finally can begin work on large, important tasks. Throughout these initial months, the new developer works with more frequent collaboration and code/change review than will be needed in the long run. We have found that with our hiring and onboarding processes (described above at a very high level), we have a high success rate.</p>
<p>The first and most direct way we can assist our customers, therefore, is to simply execute these processes for them: assist with interviews, sample projects, and lead the onboarding effort.</p>
<h2>Same Standards</h2>
<p>When working with a mixed team consisting of Oasis Digital staff as well as customer staff, we hold everyone to the same high standards.</p>
<p>I’ve seen teams that work the other way: accepting a lower standard of work from a customer&#8217;s internal staff. It ends badly. We would rather lose a customer, than ship bad software. Our reputation matters more than the next dollar.</p>
<h2>Pass It On</h2>
<p>Lastly, our processes aren’t a deep secret; the key is not the ideas, it is the execution. We are happy to teach our way of working to customers (and everyone else, in blog posts and talks). Even at the price (free to read, normal billing for customer work) it is a hard sell, though: hiring is often deeply embedded in how companies work.</p>
<h2>Stay Tuned</h2>
<p>I’ve summarized here at a high level; expect future posts and talks with many more details.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/helping-our-customers-hire/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SaaS: The Business Model – Video</title>
		<link>http://kylecordes.com/2010/saas-video</link>
		<comments>http://kylecordes.com/2010/saas-video#comments</comments>
		<pubDate>Thu, 10 Jun 2010 17:50:02 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=652</guid>
		<description><![CDATA[On Feb. 27 at St. Louis Innovation Camp 2010, I gave a talk on the SaaS business model. I posted the slides, handout, audio, and transcript soon thereafter. Here, finally, is a video of the 44-minute-long talk. Why did it take over three months to get online? Read on below.
This is an x.264 video, shown [...]]]></description>
			<content:encoded><![CDATA[<p>On Feb. 27 at St. Louis Innovation Camp 2010, I gave a talk on the SaaS business model. I <a href="http://kylecordes.com/2010/saas-slides-audio">posted the slides, handout, audio, and transcript</a> soon thereafter. Here, finally, is a video of the 44-minute-long talk. Why did it take over three months to get online? Read on below.</p>
<a id="wpfp_9cd6aa74edef6a36a5bceaa1b9397426" style="width:680px; height:382px;" class="flowplayer_container"><img src="http://kylecordes.com/blog/wp-content/uploads/2010/06/Cordes-2010-SaaS-splash.jpg" alt="" class="splash" /><img width="83" height="83" border="0" src="RELATIVE_PATH/images/play.png" alt="" class="splash_play_button" style="top: 146px; border:0;" /></a>
<p>This is an x.264 video, shown here initially with a Flash-only player (<a href="http://foliovision.com/seo-tools/wordpress/plugins/fv-wordpress-flowplayer">FV Wordpress Flowplayer</a>). The video file is served by Amazon&#8217;s <a href="http://aws.amazon.com/cloudfront/">CloudFront CDN</a>, which is trivial to sign up for without any sales process or minimum service cost. Later I&#8217;ll replace this Flash-only widget with one that offers HTML5 video (for iPad use, in particular), when I find one that works sufficiently well.</p>
<p>That&#8217;s the easy part, though. Getting this video to you here was an adventure, and not in a good way. Three recordings were made of the talk:</p>
<ol>
<li>We hired a professional videographer to record the talk. When I say professional, I mean it <strong>only</strong> in the most literal way, i.e. the videographer charged money. They showed up with a nice camera and a wireless lapel mic&#8230; but somehow produced a broken video recording (the first 10-15 minutes were intermittant video noise). In addition, the mic gain was turned up way too high and thus the audio is awful.</li>
<li><a href="http://www.linkedin.com/in/daveblankenshipstl">Dave Blankenship</a> recorded the talk on his consumer camcoder; he was not paid for this, and he did a much better job. This video is usable all the way through, but arrived in <a href="http://en.wikipedia.org/wiki/MOD_(file_format)">an oddball format produced mostly by some models of JVC camcorders</a>. The audio was not so hot, because he used the mic built in to the camcorder from the back of the room.</li>
<li>I recorded the audio using a $5 microphone plugged in to an iPod Nano, sitting on a table at the front of the room. It&#8217;s a bit noisy, but with a few minutes of work with Audacity (Noise Removal and Normalization), the results are much better than either video attempt.</li>
</ol>
<p>Armed with this, I set about to somehow combine the video from #2 with the audio from #3. I send emails describing this mess to several videographers I found on Craigslist. Most of them didn&#8217;t reply at all. I finally got a cost estimate from one, of many hundreds of dollars or more, and not much assurance of results.</p>
<p>Now I&#8217;m willing to spend some money to get good results, but spending it without confidence of results is less appealing; so I set about trying myself instead.</p>
<p>First, I cleaned the audio in Audacity as mentioned above.</p>
<p>Second, I watched the video and listened to the audio a few times, to get the approximate starting timestamp in each one of the moment the talk actually started; each recording had a different amount of lead-in time</p>
<p>Third, I grabbed ffmpeg, the swiss army knife of command line video and audio processing. After reading a dozen web pages of ffmpeg advice, and a number of experiments (with short -t settings, to quickly see how well it works without waiting to transcode the whole thing), I ended up with this command to produce the encoded video:</p>
<p><code>ffmpeg -y -ss 40.0 -i Recording-3-audio-only-clean.wav -ss 95 -i Recording-2-video-ok-audio-bad.mod -shortest -t 18000 -vcodec libx264 -vpre normal -b 700k -threads 2 Cordes-2010-SaaS.m4v<br />
</code></p>
<p>I then noticed that the MacPorts installation of ffmpeg omits the important qt-faststart tool, and found <a href="http://www.entropy.ch/software/macosx/#qtfaststart">this helpful version of qt-faststart</a> and used it instead, on my Mac; later I switched to a Linux machine with an <a href="http://ubuntuforums.org/showthread.php?t=786095">ffmpeg install including qt-faststart</a>. Without the faststart step, the metadata in the m4v file is arranged in a way that prevent progressive/streaming play-while-downloading.</p>
<p>The results are good but not great:</p>
<ul>
<li>The video has some motion/interlace artifacts; these were present in the original recording, and I&#8217;m not aware offhand of what to do about them</li>
<li>The video camera used rectangular pixels; the pixel aspect ratio is 3:2 while it is intended for display at 16:9. I wasn&#8217;t able (at least in 20 minutes of learning and experimentation) to get the 16:9 output working correctly, so if you grab the underlying m4v file you can see the aspect ratio a bit off in the shape of the clock on the wall, for example.</li>
<li>The audio-video sync is adequate (and plenty good enough to follow along) but not perfect. Clearly using the audio track on a video recording is much better than putting them together in post-processing.</li>
<li>The audio is not as good as if I used a lav or headset mic, though I think it&#8217;s quite remarkably good for a $5 mic plugged in to iPod.</li>
<li>I&#8217;ve no idea if ffmpeg complies with any of the relevant copyrights/patents/whatever in video production, though it seems hopefully safe to use for a one-off non-commercial video like this. (Normally I use Apple&#8217;s iMovie for my videos, and I assume Apple has taken care of such things.)</li>
</ul>
<p>A few morals of this story:</p>
<ul>
<li>Get some <strong>powerful</strong> tools, and learn how to use them.</li>
<li>Be willing to pay for professional work, but be <strong>skeptical</strong>. Just because you pay, doesn&#8217;t mean it will be quality work.</li>
<li><strong>Have a plan B</strong>. If I had assumed that at least one of the two videos would get decent audio, and skipped my own audio recording, I&#8217;d not have been able to deliver the acceptable audio here. If Dave had assumed that my professional videographer would produce results, and turned off his camera, we&#8217;d have no video here at all.</li>
</ul>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/saas-video/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take a Strategic Vacation</title>
		<link>http://kylecordes.com/2010/strategic-vacation</link>
		<comments>http://kylecordes.com/2010/strategic-vacation#comments</comments>
		<pubDate>Thu, 27 May 2010 18:28:32 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[delegation]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=622</guid>
		<description><![CDATA[This is yet another story that I’ve told dozens of time to individual and groups, and now finally written down. Here is a short video talk:

As usual, the vimeo page offers it for HTML5, non-Flash platforms like the iPad.
Back in 2004 I co-founded Mobile Workforce Management, a vertical market SaaS firm. For the first 6+ [...]]]></description>
			<content:encoded><![CDATA[<p>This is yet another story that I’ve told dozens of time to individual and groups, and now finally written down. Here is a short video talk:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=12085132&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=12085132&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>As usual, the <a href="http://vimeo.com/12085132">vimeo page</a> offers it for HTML5, non-Flash platforms like the iPad.</p>
<p>Back in 2004 I co-founded Mobile Workforce Management, a vertical market SaaS firm. For the first 6+ months, I was the entire development team, while my co-founder was the entire analysis, support, and customer happiness department. Over the course of a few years, we hired developers, a very-senior developer / leader / general manager, support staff, and more. In spite of these hires, as of 2007 I was still in the loop for numerous critical processes that had to happen every day or week to keep the doors open &#8211; not a great situation.</p>
<p>Around that time I was inspired to take a month-long family vacation, far longer than any past vacation. My family made arrangements to spend 3 weeks in a house by the beach, 1000 miles away, in the summer of 2008; these arrangements must be made far in advance, as such houses tend to fill up. I’d be away for approximately an entire month, allowing for travel time and stops along the way.</p>
<p>With that hard date in hand, my notions of ironing out the business processes “someday” were swept aside, and I set about tracking, automating, documenting, and delegating any of the work that involved me and had to happen at least monthly.</p>
<ul>
<li>accounting / bookkeeping / payroll</li>
<li>production sysadmin</li>
<li>development sysadmin</li>
<li>system monitoring</li>
<li>management processes</li>
<li>customer relationship processes</li>
<li>vendor relationships</li>
<li>design and code reviews</li>
<li>much more</li>
</ul>
<p>It took months of hard work (by myself and others) to build up our company ability to handle all of these things well in my absence. As of the vacation date, all of this was set up to run smoothly either entirely without me, or with a tiny bit of remote input from me.</p>
<p>This worked, in fact it worked <strong>so well that our customers didn’t even notice my absence</strong>.</p>
<p>Though I didn’t know it at the time, the work I did then to increase our organizational process maturity was a turning point in the life if the business, enabling its <a href="http://kylecordes.com/2010/mwm-sold">eventual sale</a>. Before that work, I’d have been a bit embarrassed to say “organizational process maturity” in public. Afterward, I have lived (rather than just learned about and talked about) the notions of working on-rather-than-in a business, of building a business with a life separate from that of its owners.</p>
<p>In retrospect I’m calling that trip a <strong>Strategic Vacation</strong> &#8211; a vacation taken both for its own value, and to drive the accomplishment other critical goals. If your business needs you every single day, that’s a problem. Create some pressure on yourself to solve it, by scheduling a strategic vacation, then go make it happen.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/strategic-vacation/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Standing Desk Experiment and Experiences</title>
		<link>http://kylecordes.com/2010/standing-desk</link>
		<comments>http://kylecordes.com/2010/standing-desk#comments</comments>
		<pubDate>Tue, 25 May 2010 19:32:52 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[standing]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=607</guid>
		<description><![CDATA[Round 1, 2007
Back in 2007 I read a few articles about the merits of stand-up desks, in regards to health and productivity. According to the New York Times and other sources, standing desks have been not quite common, but neither terribly uncommon, for many years. Sitting all the time is apparently quite unhealthy. Famously, Donald [...]]]></description>
			<content:encoded><![CDATA[<h3>Round 1, 2007</h3>
<p>Back in 2007 I read a few articles about the merits of stand-up desks, in regards to health and productivity. According to the New York Times and other sources, standing desks have been not quite common, but neither terribly uncommon, for many years. Sitting all the time is apparently quite unhealthy. Famously, Donald Rumsfeld used one, and maybe it helped him come up with this?</p>
<blockquote><p>There are known knowns. These are things we know that we know. There are known unknowns. That is to say, there are things that we know we don&#8217;t know. But there are also unknown unknowns. There are things we don&#8217;t know we don&#8217;t know.</p></blockquote>
<p>(This quote got a lot of chuckles, including from me; but it is actually a good and important point. I wish someone less politically charged had popularized it. Many commentators suggest that Rumsfeld&#8217;s phrasing and concern for unknown unknowns came from <a href="http://en.wikipedia.org/wiki/Werner_Erhard">Werner Erhard</a>, himself a very smart but somewhat odd fellow.)</p>
<p>Inspired to try out standing up at work, I set up perhaps the world’s ugliest standing desk:</p>
<p><img class="alignnone size-full wp-image-610" title="2007 Standing Desk" src="http://kylecordes.com/blog/wp-content/uploads/2010/05/2007-stand-desk.jpg" alt="2007 Standing Desk" width="680" height="701" /></p>
<p>I took an old and already-ugly normal desk, and put it on primitive stilts constructed in about 30 minutes for about $10. This was marginally acceptable for the out-of-the-way room I was using as a home office at the time. To make the most of things, I took the photo above with plenty of semi-obsolete technology and ample wiring in view. Looking back at this photo, I observe that my wife is an amazingly tolerant and loving woman.</p>
<p>In spite of the poor aesthetics, I enjoyed this desk for many months, and noticed an increase in my productivity and focus, discussed more at the end of this post. At the same time, some minor backaches and pains went away, and I slept better. (Be warned though, that it takes some getting used to, the first couple of weeks are tough.)</p>
<p>Functionally speaking, the only weakness of this arrangement was that the monitors were not high enough relative to the keyboard height.</p>
<p>This first-generation experiment fell into disuse when I set up a new home office with tasteful solid wood furniture and other decor, in a prominent front room of my home, at &#8220;only&#8221; 10x the cost of my old home office. The desk above went to the offices of my old firm where a couple of people tried it out, then eventually discarded it. (My new home office is <strong>not</strong> pictured here; it looks approximately like a page in the catalog of a furniture store &#8211; nice, tasteful, boring. It also contains much better hardware.)</p>
<p><strong>Round 2, 2010</strong></p>
<p>Inspired again by further press coverage, I’m trying out a standing desk again in 2010. I looked around at various power-adjustable desks from <a href="http://www.geekdesk.com/">GeekDesk</a>, <a href="http://www.anthro.com/">Anthro</a>, and <a href="http://www.relaxtheback.com/office/workstations/sit-or-stand-desk.html">Relax the Back</a>. These have several problems:</p>
<ol>
<li>While I’m willing to spend what it takes, power adjustable desks are a bit costly for an experiment. None of them are a model of desk I&#8217;d want anyway for sitting.</li>
<li>They only solve the keyboard height problem (the main desk surface height), they generally don’t address the height of the monitors at all. (However, Anthro has solutions for this.)</li>
<li>They are much deeper than I need.</li>
</ol>
<p>Instead, at the beginning of May I set up another homegrown (and slightly less visually offensive) arrangement:</p>
<p><img class="alignnone size-full wp-image-611" title="2010 Standing Desk" src="http://kylecordes.com/blog/wp-content/uploads/2010/05/2010-stand-desk.jpg" alt="2010 Standing Desk" width="680" height="796" /></p>
<p>This setup is also quite cheap, around $150 total. It is a metal shelf/rack, with an extra protruding MDF shelf screwed on to form a keyboard/mouse surface. The shelves are all adjustable, so I moved the top (computer/screen) and middle (keyboard/most) shelves up and down a few times to find the most comfortable heights: I look straight ahead at the screens, and my elbows at at 90 degrees (wrists straight) while typing.  (Update: Jeremy, a reader, set up <a href="https://jeremyofmany.wordpress.com/2010/08/31/stand/">something similar</a>.)</p>
<p>I wired up some leftover accessories (display, keyboard, mouse, etc. &#8211; my good stuff is in my home office, try not to laugh at the use of a spare low-end Microsoft mouse and small monitor with my MBP). This includes a very old printer that I pulled out of storage, partly as ballast and partly to just see if it still works. (It does, but an HP LaserJet 1100 is terribly slow by today’s standards, and I may replace the whole thing when my toner on hand runs out. A personal printer at my desk is more convenient than the better printers a short walk away.)</p>
<p>I located this at my &#8220;work&#8221; office away from home, so as not to re-test the tolerance of the above-mentioned wife. My time is split between home and work offices, and occasionally cafes, so I stand perhaps 20 hours per week on average. Even when at the standing desk, I’ll grab a nearby chair to make a phone call.</p>
<h3>The Standing Experience</h3>
<p>Relative to sitting, I&#8217;ve noticed a number of benefits:</p>
<ul>
<li>I focus more completely on my work, with less tendency to become distracted.</li>
<li>More specifically, I write more (text, code) and read less.</li>
<li>My back, and whole body feed better, aside from that first week.</li>
<li>I move around, shifting weight, standing on one foot for a moment, etc.; I experience no stiffness or aches that sometimes result from hours of sitting.</li>
<li>My urge to go buy a new chair went away; I already have a good chair in my home office, and rarely sit while at work.</li>
</ul>
<p>In summary, this seems like a <strong>fairly substantial win</strong>, one month in to the experiment. I&#8217;ll report back later this year.</p>
<p>A bit of commentary: lots of people talk about their standing desks with some degree of bravado. That is entirely unjustified; outside of office workers, a large portion of the workforce spends most of every day standing and working. It’s the traditional sitting office worker who is doing something unusual.</p>
<h3></h3>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/standing-desk/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>I&#8217;m Dreaming of a Better Social Media Client</title>
		<link>http://kylecordes.com/2010/better-social-media-client</link>
		<comments>http://kylecordes.com/2010/better-social-media-client#comments</comments>
		<pubDate>Tue, 25 May 2010 03:28:57 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=594</guid>
		<description><![CDATA[I&#8217;m not a big social media guy. I&#8217;m certaintly not a social media consultant, nor a maven. I never used MySpace at all, and I was not among the first to use Facebook, LinkedIn, Twitter, etc. But I do find all of those useful to keep in touch with a bunch of people using all [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not a big social media guy. I&#8217;m certaintly not a social media consultant, nor a maven. I never used MySpace at all, and I was not among the first to use Facebook, LinkedIn, Twitter, etc. But I do find all of those useful to keep in touch with a bunch of people using all of the above, and I&#8217;ve grown quite frustrated with the sorry state of the client applications I&#8217;ve tried. Even those whose features work well and look good, <strong>don&#8217;t really go after the core problem</strong> we all either have it or will hit: information <strong>overload</strong>.</p>
<p>Here is what I really want in a social media client application for &#8220;power users&#8221; who receive a lot on their feeds: follow a lot of people on Twitter, have a lot of friends on Facebook, 500+ on LinkedIn, etc. Today, these are power users. Over the next few of years, <strong>this will be &#8220;everybody&#8221;</strong>. Most of these features make a lot of sense for a business managing its presense.</p>
<h2>Table Stakes &#8211; The Basics</h2>
<h3>Support the Big Three (Twitter, LinkedIn, Facebook)</h3>
<p>&#8230; and hopefully several more. But don&#8217;t even come to the party without the big three. I&#8217;m looking at you, Twitterific on the iPad, which I otherwise enjoy (and use every day, and paid for).</p>
<p>Ideally, RSS feeds would also flow in, and perhaps email and SMS too. But I don&#8217;t want this to be a &#8220;unified inbox&#8221; to replace an email client; this information would appear here as context for smart reading.</p>
<h3>Run On Many Platforms</h3>
<p>Mac, PC, iPhone, iPad, Android, Linux, maybe even BlackBerry. It&#8217;s not necessary to start with all these, but the target should to end up with all of them and more, with the core features present everywhere. I&#8217;m not looking for crappy ports though. Native, good citizens.</p>
<h3>Keep Track of What I&#8217;ve Seen</h3>
<p>Keep track of what I&#8217;ve seen, automatically. Don&#8217;t show me again unless I ask. But the act of closing the app should be meaningless, in that it should not mark all data as seen. An example of what not to do is TweetDeck, which has various settings for this, of which I can&#8217;t find any combination that does the Right Thing.</p>
<p>Next, the less common ideas:</p>
<h2>I Paid for a Lot of Pixels &#8211; Use Them</h2>
<p>Single-column feed display GUIs? Great idea for a phone. Silly on a PC.</p>
<p>Like most PC users, I have a wide, high resolution screen. Like many power users, I have two screens on some computers. I payed good money for all these pixels because I want to use them. Therefore, when I&#8217;m trying to catch up with all these data/tweet/etc. feeds, I want software that makes good use of those pixels. Show me a rich, dense screenful of information at one. Make it look like a stock trader&#8217;s screen (or screens).</p>
<h2>Our Eyes are All Different &#8211; Give Me Knobs</h2>
<p>I don&#8217;t want extensive customization. I don&#8217;t want a whole slew of adjustments. I don&#8217;t want a Preferences dialog with 82 tabs. I don&#8217;t even want themes. I want a good, clean, default design&#8230; but with a few well-considered knobs. Perhaps something like so:</p>
<ul>
<li><strong>font/size</strong> knob &#8211; because my eyes might work a bit better or worse than yours, and my screen might be higher or lower resolution than yours.</li>
<li><strong>information density</strong> knob &#8211; because sometimes I want to admire a beautiful well-spaced layout, and something I just want to pack more information on there.</li>
</ul>
<h2>Aggregate Across Networks</h2>
<p>Many of the people I follow, post the same data to at least three social media outlets; then a bunch of other copy/paste or retweet it. <strong>Please stop showing me all that duplication!</strong></p>
<p>Instead, aggregate it all together, <strong>like Google News does for news sites</strong>. Show me each core message <strong>once</strong>, and then show a (dense, appropriate) display of who/how the information came in. Include a sparkline and other charts to show the continued re-arrival of that same data. This way, I won&#8217;t have to endure the duplication directly, and I can more clearly see how information traverses the (underlying, human) social network.</p>
<h2>Some Tweets are More Equal than Others</h2>
<p>In an ideal world, every Facebook update, every Tweet, would be a precious flower, to be admired in depth. <strong>We don&#8217;t live there.</strong> Instead, there is a lot of noise; an example fresh in my mind as I write this is the TV show Lost. It may be a great show, but it&#8217;s not one I watch, so to me all the Lost chatter is noise. I&#8217;ve probably scanned/scrolled past a couple hundred of them (some of them duplicates) over the last few days.</p>
<p>Therefore, a good social media client will make it trivial (one click) for me to <strong>tell it which bits I am interested in</strong> and which I&#8217;m not. I&#8217;m not talking about a scoring system, just a simple up/down arrow, for a total of three bins:</p>
<ul>
<li>Important</li>
<li>Bulk / default</li>
<li>Junk</li>
</ul>
<p>Apply some automatic classification mechanism (like the naive Bayensian that&#8217;s been common for several years now in email spam filtering) to learn from my votes and apply those to future data.  By default, highlight the Important, show the Bulk, and hide the Junk.</p>
<h2>I Have Several Devices &#8211; Sync Them Now</h2>
<p>I might look at this river of news on my Mac in the morning, then on my iPad at lunch, then on my Linux netbook in the evening, then sneak an iPhone peek at bedtime. Keep all that &#8220;what I&#8217;ve seen&#8221; and &#8220;what&#8217;s important&#8221; data in sync across them. This means that my dream social media client needs a backend service behind it. It is not necessary for the data feeds to flow through the backend system (thought it might be useful); just the user&#8217;s attention metadata.</p>
<hr />I believe that <strong>most or all of those features</strong> will be common in a few years. But I&#8217;m annoyed by the tsunami of social media feeds now. Is something like this out there? Where?</p>
<p>I could build such an application (with some help!). I&#8217;ve worked with APIs of all flavors. I&#8217;ve done mobile. I&#8217;ve created GUIs that elicit a &#8220;Wow&#8221;. I understand servers, and asynchronous operations, and scalability, and SaaS. But if I built it, would anyone *buy* it?</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/better-social-media-client/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The Prolog Story</title>
		<link>http://kylecordes.com/2010/the-prolog-story</link>
		<comments>http://kylecordes.com/2010/the-prolog-story#comments</comments>
		<pubDate>Thu, 20 May 2010 03:10:37 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[prolog]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=582</guid>
		<description><![CDATA[I&#8217;ve told this story in person dozens of times, it&#8217;s time to write it down and share it here. I&#8217;ve again experimentally recorded a video version (below), which you can view on a non-Flash device here.

I know a little Prolog, which I learned in college &#8211; just enough to be dangerous. Armed with that, and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve told this story in person dozens of times, it&#8217;s time to write it down and share it here. I&#8217;ve again experimentally recorded a video version (below), which you can view on a non-Flash device <a href="http://vimeo.com/11994794">here</a>.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11994794&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=11994794&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>I know a little <a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a>, which I learned in college &#8211; just enough to be dangerous. Armed with that, and some vigorous just-in-time online learning, I used Prolog in a production system a few years ago, with great results. There are two stories about that woven together here; one about the technical reasons for choosing this particular tool, and the other about the business payoff for taking a road less travelled.</p>
<p>In 2004 (or so) I was working on a project for an Oasis Digital customer on a client/server application with SQL Server behind it. This application worked (and still works) very well for the customer, who remains quite happy with it. This is the kind of project where there is an endless series of enhancement and additions, some of them to attack a problem-of-the-moment and some of them to enrich and strengthen the overall application capabilities.</p>
<p>The customer approached us with a very unusual feature request &#8211; pardon my generic description here; I don’t want to accidentally reveal any of their business secrets. The feature was described to us declaratively, in terms of a few rules and a bunch of examples of those rules. The wrinkle is that these were not “forward” rules (if X, do Y). Rather, these rules describe scenarios, such that if those scenarios happen, then something else should happen. Moreover, the rules were are on complex transitive/recursive relationships, the sort of thing that SQL is not well suited for.</p>
<p>An initial analysis found that we would need to implement a complex depth/breadth search algorithm either in the client application or in SQL. This wasn’t a straightforward graph search, though, rather that part was just the tip of the iceberg. I’m not afraid of algorithmic programming, Oasis Digital is emphatically not an “OnClick-only” programming shop, so I dug in. After spending a couple of days attacking the problem this way, I concluded that this would be a substantial block of work, at least several person-months to get it working correctly and efficiently. That’s not a lot in the grand scheme of things, but for this particular customer, this would use up their reasonable-but-not-lavish budget for months, even ignoring their other feature needs.</p>
<p>We set this problem aside for a few days, and upon more though I realized that:</p>
<ul>
<li>this would be a simple problem to <strong>describe</strong> in Prolog</li>
<li>the Prolog runtime would then <strong>solve</strong> the problem</li>
<li>the Prolog runtime would be responsible for doing it correctly and efficiently, i.e. our <strong>customer would not foot the bill</strong> to achieve those things.</li>
</ul>
<p>We proceeded with the Prolog approach.</p>
<p>&#8230;.</p>
<p>It actually took <strong>one day of work</strong> to get it working, integrated, and into testing, then a few hours a few weeks later to deploy it.</p>
<p>The implementation mechanism is pretty rough:</p>
<ul>
<li>The rules (the fixed portions of the Prolog solution) are expressed in a prolog source file, a page or two in length.</li>
<li>A batch process runs every N minutes, on a server with spare capacity for this purpose.</li>
<li>The batch process executes a set of SQL queries (in stored procs), returning a total of tens or hundreds of thousands of rows of data. SQL is used to format that query output as Prolog terms. These stored procs are executed using SQL Server BCP, making it trivial to save the results in files.</li>
<li>The batch process run a Prolog interpreter, passing the data and rules (both are code, both are data) as input. This takes up to a few minutes.</li>
<li>The Prolog rules are set up, with considerable hackery, to emit the output data we needed in the form of CSV data. This output is directed to a file.</li>
<li>SQL Server BCP imports this output data back in to the production SQL Server database.</li>
<li>The result of the computation is thus available in SQL tables for the application to use.</li>
</ul>
<p>This batch process is not an optimal design, but it has the advantage of being quick to implement, and robust in operation. The cycle time is very small compared to the business processes being controlled, so practically speaking it is 95% as good as a continuous calculation mechanism, at much less cost.</p>
<p>There are some great lessons here:</p>
<ul>
<li><strong>Declarative &gt;&gt;&gt; Imperative</strong>. This is among the most important and broad guidelines to follow in system design.</li>
<li><strong>Thinking Matters</strong>. We cut the cost/time of this implementation by 90% or more, not by coding more quickly, but by thinking more clearly. I am a fan of TDD and incremental design, but you’re quite unlikely to ever make it from a handcoded solution to this simply-add-Prolog solution that way.</li>
<li><strong>The Right Tool for the Job</strong>. Learn a lot of them, don’t be the person who only has a hammer.</li>
<li><strong>A big problem is a big opportunity</strong>. It is quite possible that another firm would not have been able to deliver the functionality our customer needed at a cost they could afford. This problem was an opportunity to win, both for us and for our customer.</li>
</ul>
<p>That’s all for now; it&#8217;s time for <a href="http://lessconf.lesseverything.com/">LessConf</a>.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/the-prolog-story/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>When Will It Ship? Estimates and Promises</title>
		<link>http://kylecordes.com/2010/estimates-and-promises</link>
		<comments>http://kylecordes.com/2010/estimates-and-promises#comments</comments>
		<pubDate>Fri, 07 May 2010 21:26:44 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[estimates]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=573</guid>
		<description><![CDATA[I&#8217;m trying something new with this post: a short video presentation of approximately the same content.

This is a Vimeo video, embedded as Flash. You can go over to Vimeo to watch it with HTML5-video devices like an iPad. I expect to offer better quality and more options as I learn more.
Here is an area of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m trying something new with this post: a short video presentation of approximately the same content.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11563705&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=11563705&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>This is a Vimeo video, embedded as Flash. You can <a href="http://vimeo.com/11563705">go over to Vimeo</a> to watch it with HTML5-video devices like an iPad. I expect to offer better quality and more options as I learn more.</p>
<hr />Here is an area of confusion that has come up both at Oasis Digital, and at every other firm I’ve worked:</p>
<p style="text-align: center;"><strong>estimate ≠ promise</strong></p>
<h2>Background: Unpredictability</h2>
<p>Around half of my software development and leadership experience has been in enterprise/internal software development, and that is the world I am thinking of as I write this.</p>
<p>Software development, like other endeavors with a significant creative component, is inherently unpredictable. With a good, deep understanding of the development process, you can build a model of the probability distribution of the cost, effort, and elapsed time for software development work. In the large, on average this can be made to work: small and large projects can succeed, within some broad range of predictability.</p>
<p>But notice also how common it is for large complex projects (in software and elsewhere) to be farcically over budget and late. This is not (usually) due to incompetence or fraud. It is because of the inherent unpredictability of the work.</p>
<p>If someone claims that they (or you) can exactly predict software development work, they are:</p>
<ul>
<li>mistaken, or</li>
<li>lying, or</li>
<li>padding their estimates very substantially, stating a date or cost much later/higher than a neutral median estimate would suggest</li>
</ul>
<p>As a customer of software development services, and as a provider of such services, I don’t want any of those things.</p>
<h2>Blame the Service Trades</h2>
<p>I place some of the blame for the confusion of these two wildly different things, on the service trades: it is common for auto repair shops, roof installers, landscapers, and the like to offer something they call an estimate, but which is actually a fixed price quote (a promise).</p>
<p>Sadly, while there are plenty of common good synonyms for promise, there aren’t many for estimate. We’re stuck with using the word estimate, and explaining that we really mean it as defined. Perhaps in a few more decades we will lose the word entirely, much like the word “literally” has come to mean its antonym, “figuratively”, which renders it mostly useless.</p>
<h2>Estimates</h2>
<p>An estimate is an approximation of an unknown quantity. Typically in the world of software development, it is a prediction of the cost, working hours, or delivery date of a project or milestone. It is not in any sense a commitment, any more than estimating the temperature outside this afternoon is a commitment.</p>
<p>As the word implies, a customer reasonably expects the actual value to vary somewhat, in either direction, from the estimate. In fact, if an estimate turns out exactly match the actual result, there is a good chance the books have been cooked. Moreover, if the work is completed at-or-before the estimate most of the time, this means the estimates (on average) are too high.</p>
<p>An estimate “costs” nothing, other than the time/effort required to create it, which consists of analyzing the work at hand, decomposing it in to parts, and comparing those parts to past work.</p>
<h2>Promises</h2>
<p>A promise, also called a commitment, deadline, quote, fixed price, etc. is a different beast entirely.</p>
<p>With a promise in hand, a customer should expect with high confidence that the actual value (for cost, hours of work, delivery date) will be less than (before), or equal to, the promised value/date.</p>
<p>Be wary of a promise easily made and freely given: it probably doesn’t mean anything at all. A wise customer (and I aim to count myself in this category) should expect that a casually made commitment will probably be broken; not because the maker is morally defective, but simply because meeting a commitment for complex work requires considerable effort and thought. Without evidence that happens, it would be mere wishful thinking to expect the results delivered as promised.</p>
<p>Likewise, keeping promises often has a cost. If the work underway gets behind the schedule needed to meet the promise, something will have to give:</p>
<ul>
<li>Other work may fall behind, as time and effort are diverted to meet the promise.</li>
<li>Weekends, evenings, and overtime work may be needed. These might appear free, but are not.</li>
<li>Staff may need to be reassigned, or added</li>
<li>Additional hardware and software may be needed.</li>
</ul>
<p>These risks cost real money; thus a wise promise-maker will find that, on average, it costs more to promise feature X by date D, than to delivery feature X by date D without such a promise.</p>
<h2>Estimates are Cheaper, so Prefer Estimates</h2>
<p>At Oasis Digital, we provide many estimates, but few promises. Most of the time, an estimate is what our customers need; and we can provide at estimate with very little cost. Typically we estimate reasonably well:</p>
<ul>
<li>small features usually arrive with a day or two (plus or minus) of the estimated delivery date (and likewise for cost)</li>
<li>medium items within a week or two of the estimate, likewise</li>
<li>large items (major new features or subsystems with complex interdependencoes) within a month or so, likewise</li>
</ul>
<p>The key here is is that with good estimate, commitments (promises) aren’t needed very often, and therefore the <strong>cost</strong> of promises can be avoided.</p>
<h2>But Learn How to Promise Well, Also</h2>
<p>Yet occasionally, a customer needs a commitment, most often because a software version needs to be available to match an important business event with a fixed date, such as a presentation, a legal filing, etc. I&#8217;ll follow up later (no promise or estimate, as to when) with thoughts on:</p>
<ul>
<li>how to credibly <strong>make</strong> promises (as a service provider)</li>
<li>how to <strong>evaluate</strong> promises (as a customer)</li>
</ul>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/estimates-and-promises/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.056 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-02 16:50:02 -->
