<?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>Information Technology Dark Side &#187; Uncategorized</title>
	<atom:link href="http://www.techdarkside.com/category/uncategorized/feed" rel="self" type="application/rss+xml" />
	<link>http://www.techdarkside.com</link>
	<description>Struggles of a Self-Taught Coder</description>
	<lastBuildDate>Mon, 30 Jan 2012 17:18:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to Sink Your Bootstrapped Startup #1: The Premature &#8220;Big Picture&#8221; Pivot</title>
		<link>http://www.techdarkside.com/how-to-sink-your-bootstrapped-startup-1-the-premature-big-picture-pivot</link>
		<comments>http://www.techdarkside.com/how-to-sink-your-bootstrapped-startup-1-the-premature-big-picture-pivot#comments</comments>
		<pubDate>Mon, 30 Jan 2012 17:07:16 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=772</guid>
		<description><![CDATA[What&#8217;s a bootstrapped startup Bootstrapped startups are a version of the lean startup with a 37-signals-esque twist, i.e a lean bootstrap. The goal of a lean bootstrap is to run in the black as early as possible, preferably from day 1. Boostrappers don&#8217;t need or want outside capital for the most part, and they are [...]]]></description>
			<content:encoded><![CDATA[<p><strong>What&#8217;s a bootstrapped startup</strong><br />
Bootstrapped startups are a version of the lean startup with a 37-signals-esque twist, i.e a lean bootstrap. The goal of a lean bootstrap is to run in the black as early as possible, preferably from day 1. Boostrappers don&#8217;t need or want outside capital for the most part, and they are always conscious of the need to validate that they can actually make money doing whatever they are doing.</p>
<p>Basically, if you (metaphorically) placed Rework and The Lean Startup in a blender, turned it to high, then ran the puree through a mumbo-jumbo filter (basically the last 1/3 of The Lean Startup would get removed), the remaining juice would be called &#8220;The Lean Bootstrap&#8221;.</p>
<p>I&#8217;ll let you read those books yourself &#8211; I just wanted to introduce the idea so I could then tell you how to sink it.</p>
<p><strong>Lean Bootstraps are Hard to Sink</strong><br />
I&#8217;ve been running a lean bootstrap for about four years now called TroopTrack.com. I&#8217;ve made pretty much every mistake possible you could make and still be able to qualify for the moniker of &#8220;lean bootstrap&#8221;. I&#8217;ve blown big sales. I&#8217;ve blown small sales. I&#8217;ve blown really, really big sales. I&#8217;ve made bad partnerships. I&#8217;ve ignored my customers (unintentionally). I&#8217;ve had failed marketing experiments. I&#8217;ve gotten distracted by crazy ideas. I&#8217;ve gotten so sick that I couldn&#8217;t work on it for several months.</p>
<p>Somehow TroopTrack.com survived all that. And I learned from it, and the cumulative effect of all these &#8220;mistakes&#8221; is that I have a vision for my product that my customers are excited about. Finally.</p>
<p>The point is, a lean bootstrap is hard to sink. As long as you don&#8217;t go into debt, give up, make huge commitments that you can&#8217;t fulfill on a part-time basis, get sued, or run in the red for extended periods of time, you can keep working on a lean bootstrap for as long as it takes.</p>
<p><strong>A Premature &#8220;Big Picture&#8221; Pivot Is Your Lean Bootstrap&#8217;s Iceberg</strong></p>
<blockquote><p>A big picture pivot is a pivot designed to expand the &#8220;small-time thinking&#8221; of your lean bootstrap into an enormous market, usually by making the product more universal</p></blockquote>
<p>In TroopTrack terms, a big picture pivot might be pivoting from Boy Scout Troops and Packs to all youth organizations from soccer teams to student councils. Or to the military. This type of pivot is tempting because your potential market just went from cute and cuddly to super-model hot. </p>
<p>Resistance is not futile. Giving in to this kind of temptation at the wrong time will sink your lean bootstrap, for the following reasons:</p>
<ol>
<li>You will lose focus on the problem you are trying to solve before you ever solve it. If you haven&#8217;t learned what you need to learn to succeed in a small market, you don&#8217;t have what it takes to succeed in a large market.</li>
<li>You will alienate the customers you already have &#8211; when you transition from trying to feed a village to trying to solve world hunger, the villages you leave behind will not be happy with you.</li>
<li>You will convince yourself that you need outside investment. Outside investment can be incredibly limiting. It comes with deadlines, burn rates, and other obligations and expectations. Raising money for a big effort can be a full-time job, which will only further exacerbate the problems mentioned above.</li>
</ol>
<p>The big picture pivot is a big deal, and it can have a huge return, but it needs to happen at the right time. Don&#8217;t sink your lean bootstrap by doing it too early.</p>
<p><strong>Make Big Picture Pivots in Small Steps</strong><br />
When your product is successful and you are making your customers happy, big picture pivot opportunities come out of the woodworks uninvited, only they don&#8217;t look like big picture pivots on the surface. For example, I recently got an email from someone who had heard about TroopTrack and was wondering if it supported Girl Scouts (it doesn&#8217;t). Supporting Girl Scout advancement is definitely on the TroopTrack radar, and we&#8217;re actively researching it right now. And a &#8220;early adopter&#8221; just popped out of nowhere, just like that.</p>
<p>Adding yet another type of scouting organization to TroopTrack isn&#8217;t exactly a big picture pivot, but it&#8217;s a step towards one. Every time I add a new type of organization to TroopTrack it gets easier to do. It&#8217;s also something I can do without outside investment, without running in the red, and without alienating my customer base. It also will give me greater insight into what my customers find valuable about TroopTrack that will help me on my way.</p>
<p><strong>Big Picture Pivots are Just Crystal Ball Gazing Anyway</strong><br />
Creative lean bootstrappers are visionaries. They see possibilities that are endless. They aren&#8217;t bothered by the flying pigs in their grand dreams or the snowball fights in Hell. This is something that is totally awesome about being a lean bootstrapper &#8211; you can see the potential. </p>
<p>But let&#8217;s face it &#8211; big picture pivots are an extrapolation into the future based on a myriad of assumptions. You can&#8217;t make the leap straight to the big picture without testing all the assumptions along the way. You&#8217;ve got to start with the little picture, solve it&#8217;s problem, and then move on. </p>
<p><strong>When Should You Make the Big Picture Pivot?</strong><br />
Don&#8217;t worry so much about this. As one of my favorite former bosses, Mike Herrick, now of Urban Airship fame, likes to say, &#8220;Do good things and good things will happen.&#8221; Build a compelling product in the space you are focused on and the marketplace will tell you when to pivot. If you solve your problem really, really well, and make money doing it, <em>early adopters will drag you into the next market when the time is right.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/how-to-sink-your-bootstrapped-startup-1-the-premature-big-picture-pivot/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Six things I dislike about Scrum</title>
		<link>http://www.techdarkside.com/six-things-i-dislike-about-scrum</link>
		<comments>http://www.techdarkside.com/six-things-i-dislike-about-scrum#comments</comments>
		<pubDate>Thu, 26 Jan 2012 20:53:41 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=768</guid>
		<description><![CDATA[Scrum is a poor man&#8217;s agile I won&#8217;t lie. I&#8217;m in a fairly contrarian mood today, and that is likely to influence this post to be harsher than it would be if I&#8217;d written it on a day when all was well. But, nonetheless, even on a good day I think I would agree with [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Scrum is a poor man&#8217;s agile</strong><br />
I won&#8217;t lie. I&#8217;m in a fairly contrarian mood today, and that is likely to influence this post to be harsher than it would be if I&#8217;d written it on a day when all was well. But, nonetheless, even on a good day I think I would agree with the gist of what you&#8217;re about to read.</p>
<p>Scrum is, in my opinion, the least &#8220;Agile&#8221; of all the agile methodologies. It is also the easiest to learn, the easiest to try, the easiest to add to your bull-crap resume, and the easiest to completely fail at. More on that later. </p>
<p><strong>I don&#8217;t like the branding association it has with agile</strong><br />
Scrum is the de-facto brand of the Agile Alliance. I don&#8217;t really have anything against AA, but it bothers me that the only agile training they offer is related to scrum. It feels to me like AA positions &#8220;Scrum&#8221; as &#8220;Agile&#8221;, when in fact it is really only one of many methodologies that was inspired by the Agile Manifesto. The net effect is that when scrum projects fail, it&#8217;s not just scrum that gets a black eye, but also agile. And I don&#8217;t like that, because scrum projects fail a lot.</p>
<p><strong>I don&#8217;t like the training</strong><br />
I&#8217;ve never taken a scrum class, so you may conclude that I don&#8217;t have any business trashing it. You might be right.</p>
<p>That said, I know a lot of &#8216;scrummasters&#8217;, and I&#8217;ve debriefed a number of people after they&#8217;ve taken a certified scrum master course, and as a general rule the training they received has failed to </p>
<ol>
<li>Give them an adequate appreciation for the values and principles that make Agile agile</li>
<li>Convince them of the importance of absolutely critical development practices such as test driven development</li>
<li>Prepare them for the intense resistance they will face attempting to introduce agile in an environment where it is new</li>
</ol>
<p><strong>I don&#8217;t like the certification</strong><br />
I&#8217;ve written training curricula before, both for professionals and for college students. I&#8217;ve never offered to &#8220;certify&#8221; anyone. I don&#8217;t really place much value in certification as a hiring tool or as a job-seeking tool except in certain very special areas where I know the certification is a bonafide test of competence at some level (assuming the possessor did not cheat or somehow fake the certification). Some examples of such certifications: </p>
<ul>
<li>Diplomas from real colleges &#038; universities (schools that don&#8217;t fail anyone are not &#8220;real&#8221;)</li>
<li>A license to practice law</li>
<li>A license to practice medicine</li>
<li>Certification as a professional engineer</li>
</ul>
<p>These certifications are difficult and expensive to obtain and therefore demonstrate a fairly significant level of dedication on the part of the obtainer. They are also very rigorous and they police their members &#8211; if you screw up in a big way they will kick you out.</p>
<p>CSM is about as far from this certification as you could possibly get. Anyone with $500 and two days to kill can become a certified scrum master. That&#8217;s not impressive &#8211; being the proud possessor of a scrummaster certification is only a differentiator in the stupidest of organizations. In fact, if I am interviewing you for a position and you have a CSM my skepticism toward you just went up.</p>
<p>The true value of scrummaster certification is to the companies that sell it. They benefit immensely from it. So far as I can tell, they are the only ones.</p>
<p><strong>I don&#8217;t like the club</strong><br />
Because CSM is easy to get and because Scrum pays short shrift to the values and principles from which Agile was born, there is a community of scrummasters who evangelize the Scrum process without grasping why Agile works. Take this genius for example:</p>
<blockquote><p>Every CSM class I teach, I emphasize the complete nature of Scrum as a single tool, not a collection of tools.  Learning Scrum is about learning the tool, not learning how to pick and choose pieces of a tool.  Let’s explore this metaphor of Scrum as a tool.</p>
<p>Consider a hammer.  A hammer is ideally suited for pounding nails into wood.  It has two parts: a head and a handle.  If you take the parts and use them separately, they can still be used for pounding nails into wood… but they are very ineffective compared to the hammer (although better than using your bare fist).  It is non-sensical to decompose the hammer and try to use the pieces separately.  However, a hammer is not suited to other purposes such as driving screws or cutting wood.  It’s perfection is not just in its form, but also in its proper application.  A hammer works through a balanced combination of leverage and momentum.</p>
<p>Scrum is like a hammer.  It has parts (daily Scrum, Sprints, ScrumMaster, etc.), but taking the parts and trying to use them separately is… you guessed it… non-sensical.  The parts of Scrum combine to be an extremely effective tool for new product development.  Just like a hammer, there are things you wouldn’t want to do with Scrum such as manufacturing or painting a wall.  (We might not all agree on the limits of the use of Scrum… that’s something for another article.)  Scrum works through a combination of pressure on the organization and “inspect and adapt” (continuous improvement).</p>
<p>Please.  Don’t modify Scrum.  If you must change things about Scrum, please stop calling it Scrum.</p></blockquote>
<p><a href="http://www.agileadvice.com/2012/01/17/scrumxplean/important-words-about-scrum-and-tools/">Source</a></p>
<p>This is in direct opposition to a number of agile values and principles, most notably that individuals and interactions are more important than processes and tools. It is also ludicrous to say you use &#8220;inspect and adapt&#8221; to obtain continuous improvement, but only so long as you don&#8217;t inspect and adapt scrum. </p>
<p>That&#8217;s just plain stupid.</p>
<p>Scrum is full of people who think like this, and it makes me sad. There is little point to scrum if you do not understand and embrace the values and principles from which it sprang. It&#8217;s just another flowchart.</p>
<p><strong>I don&#8217;t like the methodology</strong><br />
Scrum is too rigid. It imposes a structure and process on an agile team that doesn&#8217;t always fit, and it puts pressure on teams to use that structure or else. It&#8217;s not true to the fundamentally critical cycle of experimentation and evaluation that is at the heart of agile. </p>
<p>I also think it puts too much emphasis on the scrummaster, and not enough emphasis on emergent planning, good design, and disciplined software development.</p>
<p><strong>I don&#8217;t like the results</strong><br />
Bright-eyed and bushy-tailed brand new certified scrummasters are failing to deliver working software all over the place, mostly because of the three things their training failed to give them. As a result, lots of organizations are back-pedaling from their scrum implementations, mistakenly blaming agile for the failure.</p>
<p>Well guess what? It&#8217;s not agile&#8217;s fault. If you just &#8220;do&#8221; scrum without understanding or appreciating the values behind it, you didn&#8217;t &#8220;do&#8221; agile. You just did a totally empty version of scrum. </p>
<p><strong>Is there anything left?</strong><br />
Nope. I think that&#8217;s pretty much it. Scrum is the new waterfail.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/six-things-i-dislike-about-scrum/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Investment &#8211; the ultimate Vanity Metric?</title>
		<link>http://www.techdarkside.com/investment-the-ultimate-vanity-metric</link>
		<comments>http://www.techdarkside.com/investment-the-ultimate-vanity-metric#comments</comments>
		<pubDate>Wed, 18 Jan 2012 16:27:03 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=751</guid>
		<description><![CDATA[The one thing about The Lean Startup by Eric Ries that makes me cringe The Lean Startup is a great book. It&#8217;s well written and convincing, and the more I read the more eager I am to put it to the test on TroopTrack, AuthorGate, and my client work. Part of the reason it appeals [...]]]></description>
			<content:encoded><![CDATA[<p><strong>The one thing about The Lean Startup by Eric Ries that makes me cringe</strong><br />
The Lean Startup is a great book. It&#8217;s well written and convincing, and the more I read the more eager I am to put it to the test on TroopTrack, AuthorGate, and my client work. Part of the reason it appeals to me is because it jives with my own experience struggling to create a product people want on TroopTrack.</p>
<p>There is only one thing that bothers me about Eric Ries&#8217;s book. Many positive case studies end with some version of the following phrase: *Startup X* was able to raise *large amount of money* from *VC name* and is now one of the hottest startups in Silicon Valley.</p>
<p>This phrase is often provided as evidence that the lean startup approach is working for Startup X. This really bothers me, partly because the book starts out by referencing massive .com failures pets.com and webvan.com, both of which managed to raise huge sums of money. This is ironic in a book that teaches about the dangers of vanity metrics, false indicators of success in a startup.</p>
<p><strong>Investment is THE Vanity Metric of Success</strong><br />
Do I really have to prove this? Aren&#8217;t there enough case studies in the lore of the last decade to make this a given? The fact that some rich guys are willing to give you money to keep working on your idea doesn&#8217;t mean that you are being successful as a business. The only situation in which this is not true is when your only business goal is to raise money, which isn&#8217;t really a very healthy goal.</p>
<p><strong>When does the &#8220;We Can Make A Profit Doing This&#8221; assumption get tested?</strong><br />
At one point in the book Eric Ries says something like this (I&#8217;m paraphrasing because I&#8217;m listening to the audio book and can&#8217;t quote exactly):</p>
<blockquote><p>As a result of innovation accounting, our revenue increased to millions of dollars per month, which allowed us to raise even more money from *some VC*</p></blockquote>
<p>Seriously, you&#8217;re making more than a million dollars a month in revenue and IMVU needed outside investment? Is that really an indication that you are being successful?</p>
<p>I&#8217;m not saying IMVU is a failure. I&#8217;m just saying that investment and success are coincidental at best. That&#8217;s all.</p>
<p>So, shouldn&#8217;t a startup also be testing this assumption, that they can actually make a profit? Wouldn&#8217;t that be important? To me, waiting until you are generating $1M EVERY MONTH in revenue feels a little bit late. I&#8217;m just sayin&#8217;.</p>
<p><strong>Profitable businesses have infinitely long runways</strong><br />
The Lean Startup talks about the importance of a startup&#8217;s runway and redefines it as the number of pivots a company can make before they run out of money. This is a pretty important and useful redefinition from the old definition of cash / monthly burn rate. You can extend your runway by shortening iterations, focusing on validated learning, and using innovation accounting to figure out what is really working. It&#8217;s freaking brilliant, actually.</p>
<p>I&#8217;d just like to make a simple point: profitable businesses have an infinitely long runway. They can pivot as many times as they want, as long as they don&#8217;t go into the hole for extended periods of time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/investment-the-ultimate-vanity-metric/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Adding Drag and Drop File Uploads to Rails 3.1 with Filedrop and Paperclip</title>
		<link>http://www.techdarkside.com/adding-drag-and-drop-file-uploads-to-rails-3-1-with-filedrop-and-paperclip</link>
		<comments>http://www.techdarkside.com/adding-drag-and-drop-file-uploads-to-rails-3-1-with-filedrop-and-paperclip#comments</comments>
		<pubDate>Tue, 10 Jan 2012 16:09:41 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=746</guid>
		<description><![CDATA[One of the most common requests I get from TroopTrack users is to let them add photos more easily. For the upcoming 3.0 release I decided to give it a go, and it turned out to be pretty simple. Here&#8217;s a quick video of the end result: How I Did It I based my approach [...]]]></description>
			<content:encoded><![CDATA[<p>One of the most common requests I get from TroopTrack users is to let them add photos more easily. For the upcoming 3.0 release I decided to give it a go, and it turned out to be pretty simple. Here&#8217;s a quick video of the end result:</p>
<p><strong>How I Did It</strong><br />
I based my approach on <a href="http://tutorialzine.com/2011/09/html5-file-upload-jquery-php/">this tutorial</a>. It&#8217;s meant for PHP sites, but the HTML, javascript, and CSS will still work for a rails 3.1 app. So I copied those items into the normal places and started to change things to make it work on Rails.</p>
<p>The most important changes are at the top of the javascript &#8211; you need to change the name of the photo parameter and the url to submit it too. Here&#8217;s how mine turned out:</p>
<pre>var dropbox = $('.dropbox'),
    message = $('.message', dropbox);

  dropbox.filedrop({
    // The name of the $_FILES entry:
    paramname:'troop_photo[photo]',

    maxfiles: 5,
      maxfilesize: 2, // in mb
    url: dropbox.attr('id') + '/troop_photos',
....
</pre>
<p>In my case, the full path of the POST should be /photo_albums/:id/troop_photos. So I stuck the ID of the photo album we are uploading to in the ID of my dropbox div and used it to build the url. And, to follow the Rails convention for param names, I set the param name to &#8216;troop_photo[photo]&#8216;.</p>
<p>The last big change I had to make was to set up the controller action. This was really pretty simple, since at this point the photo upload is just a regular create action that is expecting a json response. Here&#8217;s how it turned out:</p>
<pre>
  def create
    @troop_photo = @photo_album.troop_photos.new(params[:troop_photo])

    if @troop_photo.save
      render :json =&gt; {:status =&gt; "File was uploaded successfuly!"}
    else
      render :json =&gt; {:status =&gt; "Something went wrong with your upload!"}
    end
  end
</pre>
<p><strong>Awesome Results</strong><br />
<iframe src="http://player.vimeo.com/video/34844193?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p><strong>Making It Better</strong><br />
I didn&#8217;t say anything about Paperclip here. That&#8217;s because I didn&#8217;t have to make any changes at all to my existing Paperclip setup to make it work because the real action happens in the controller. </p>
<p>The problem with uploads like this is that they are kind of silly pathed. The file goes from my user&#8217;s computer, to my app server, to S3. It would be better if it just went straight to S3.</p>
<p>In my research for this, I came across CarrierWave Direct. It does exactly that. I haven&#8217;t tried it out yet, but I plan to if I ever get enough customers to worry about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/adding-drag-and-drop-file-uploads-to-rails-3-1-with-filedrop-and-paperclip/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to create a token input field where the user can also add new items</title>
		<link>http://www.techdarkside.com/how-to-create-a-token-input-field-where-the-user-can-also-add-new-items</link>
		<comments>http://www.techdarkside.com/how-to-create-a-token-input-field-where-the-user-can-also-add-new-items#comments</comments>
		<pubDate>Tue, 27 Dec 2011 03:18:05 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=739</guid>
		<description><![CDATA[I have a form where a user can provide a list of brands they like. We&#8217;d like to avoid duplicates as much as possible, but we also want to let the user add brands to the list on the fly. Brands is really just a type of favorite, and the relationships are set up like [...]]]></description>
			<content:encoded><![CDATA[<p>I have a form where a user can provide a list of brands they like. We&#8217;d like to avoid duplicates as much as possible, but we also want to let the user add brands to the list on the fly. Brands is really just a type of favorite, and the relationships are set up like so:</p>
<pre class=”prettyprint [lang-html|linenums:1]“>
class Favorite &lt; ActiveRecord::Base
  has_many :user_favorites
  has_many :users, :through =&gt; :user_favorites

  scope :for_type, lambda {|type| where(:favorite_type =&gt; type)}
end

class UserFavorite &lt; ActiveRecord::Base
  belongs_to :user
  belongs_to :favorite
end

class User &lt; ActiveRecord::Base
...
  has_many :user_favorites
  has_many :favorites, :through =&gt; :user_favorites
end
</pre>
<p>There are other types of favorites: colors, sports teams, stores, etc. They all live in the same favorites table, and that for_type scope lets me filter them out based on type. </p>
<p>You might be wondering why I didn&#8217;t use single table inheritance (STI) here. The answer is simple &#8211; because I don&#8217;t need to. All favorites act the same, at least so far. Later on, if that changes, I will change the model. But for now, I don&#8217;t.</p>
<p>You might also be wondering why I don&#8217;t use has_and_belongs_to_many (HABTM) here as well. The answer is simple &#8211; every time I create a HABTM relationship in my models I find myself ripping it out later so I can add some other field later. So, I don&#8217;t bother with it. Sure, you could make the case that I have a model I don&#8217;t need and you would be right. You could also make the case that this is in direct contradiction to the STI decision I just made. And you&#8217;d probably be right there too. My grand respons is&#8230;</p>
<p>shrug.</p>
<p>Okay, so I want to use the jquery.tokeninput library to manage the list of favorite brands. I won&#8217;t go into the details of token input &#8211; Ryan Bates and others have already done that very well. Just go check out their stuff.</p>
<p>The catch is allowing users to create new favorites on the fly, rather than just picking favorites off the list of what&#8217;s already in the system. Token input works by creating a list of ID&#8217;s that are submitted with the form, so if I want to add &#8220;Coleman&#8221; to my list of favorite brands, and the system doesn&#8217;t already have &#8220;Coleman&#8221; in it, I can&#8217;t. That&#8217;s because token input relies on an active record search of favorites to make suggestions, which normally look something like this in the controller:</p>
<pre class=”prettyprint [lang-html|linenums:1]“>
def index
  @authors = Author.all
  respond_to do |format|
    format.html
    format.json { render :json =&gt; @authors.map(&#038;:attributes) }
  end
end
</pre>
<p>Note: this particular code snippet came from <a href="http://railscasts.com/episodes/258-token-fields?view=asciicast">Ryan Bates</a>, who I think is totally awesome, and is specific to a different application. I&#8217;m just using it as an example because that&#8217;s not what I did (but it&#8217;s perfectly fine in the normal usage).</p>
<p>As I was staring at this, it occurred to me that the form doesn&#8217;t really care if there is a favorite or not. It just needs some JSON to make the list work. So I did my controller action differently. Like so. </p>
<pre class=”prettyprint [lang-html|linenums:1]“>
  def favorites_list
    term = "%#{params[:q]}%"
    favorites_list = []
    Favorite.find(:all, :conditions =&gt; ['name like ? and favorite_type = ?', term, params[:type] ]).each do |fav|
      favorites_list &lt;&lt; {"id" =&gt; fav.id, "name" =&gt; fav.name}
    end
    favorites_list &lt;&lt; {"id" =&gt; "-new-#{params[:q]}", "name" =&gt; params[:q]}
    render :json =&gt; favorites_list.to_json
  end
</pre>
<p>Please note &#8211; this is the &#8220;Make it Work&#8221; step for this code. Not the &#8220;Make it Right&#8221; or &#8220;Make it Fast&#8221; step. So if it makes you puke in your mouth, say so, but tell me how to make it right. If you don&#8217;t include some CONSTRUCTIVE criticism I&#8217;ll publicly call you out as a nosehole (it&#8217;s what my 3yo calls a nostril and we&#8217;ve adopted as a family curse word). Also, I&#8217;ve left off the respond_to block because this action doesn&#8217;t care who you are. It&#8217;s gonna respond with JSON.</p>
<p>All this action does is throw the search term on the back of the list of search results, with an ID that starts with &#8216;-new-&#8217;. Everything else will have a numeric id of course, so it will be pretty easy to tell which ones are new with a little gsub action in my attribute setter. Here it is:</p>
<pre class=”prettyprint [lang-html|linenums:1]“>
  def brand_tokens=(value)
    ids = []
    value.split(',').each do |val|
      if val[0..4] == '-new-'
        fav = Favorite.create!(:favorite_type =&gt; 'brands', :name =&gt; val.gsub(/-new-/,''))
        ids += [fav.id]
      else
        ids += [val.to_i]
      end
    end
    brand_ids = self.favorites.for_type('brands').map(&#038;:id)
    self.favorite_ids = self.favorite_ids - brand_ids + ids
  end
</pre>
<p>If I didn&#8217;t have other types of favorites, I wouldn&#8217;t need to do the last two lines that way. I would have been able to just set favorite_ids = ids and be done. But, since I have multiples of those, I have to be careful not to stomp out the other ones.</p>
<p>Again, this method is not slick or shiny. But it works, and tomorrow or the next day when I&#8217;m less sick of this particular story I will make it better. If you make a comment that I incorporate into my code, I will tell the world what an ubergenius you are. </p>
<p>So, just like that, I have a token input that I can add new values to on the fly. Yay!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/how-to-create-a-token-input-field-where-the-user-can-also-add-new-items/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Full-text search with MySQL, Rails 3, and Sphinx &#8211; a Dive Journal</title>
		<link>http://www.techdarkside.com/full-text-search-with-mysql-rails-3-and-sphinx-a-dive-journal</link>
		<comments>http://www.techdarkside.com/full-text-search-with-mysql-rails-3-and-sphinx-a-dive-journal#comments</comments>
		<pubDate>Sun, 18 Dec 2011 23:39:43 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=733</guid>
		<description><![CDATA[I need to add full text search to an item class. The fields I need to search are :title and :description. After a bit of digging, I decided I would give sphinx a try, using the thinking-sphinx gem. I&#8217;m going with thinking-sphinx because it came up first on Ruby Toolbox. When I&#8217;m diving on something [...]]]></description>
			<content:encoded><![CDATA[<p>I need to add full text search to an item class. The fields I need to search are :title and :description. After a bit of digging, I decided I would give sphinx a try, using the thinking-sphinx gem. I&#8217;m going with thinking-sphinx because it came up first on <a href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&#038;q=sphinx">Ruby Toolbox</a>. When I&#8217;m diving on something like this, I like to try something right away for two reasons: 1) if it works out I don&#8217;t have to do any research 2) if it doesn&#8217;t work out then as I do research on what to try next I have some context for making decisions.</p>
<p>So just like that I jump right into the code by installing sphinx.</p>
<p><code><br />
brew install sphinx<br />
</code></p>
<p>Next is the thinking-sphinx gem<br />
<code><br />
gem 'thinking-sphinx', '2.0.10'<br />
</code></p>
<p>The I plop indexes and attributes on the Item model.<br />
<code><br />
define_index do<br />
  # fields<br />
  indexes title, :sortable => true<br />
  indexes description</p>
<p>  # attributes<br />
  has created_at, updated_at<br />
end<br />
</code></p>
<p>And I try to index my data, but I get an error: undefined method `indexes&#8217; for #<Riddle::Configuration. Google claims I need to use the 2.0.10 version of thinking-sphinx. Rinse and repeat! This time <code>rake thinking_sphinx:index</code> works. Hooray!</p>
<p>Ready, set, start sphinx!<br />
<code><br />
rake thinking_sphinx:start<br />
</code></p>
<p>With that, I am ready to start searching items. So I try it out in the console first, just to see.</p>
<p><code><br />
ruby-1.9.2-p290 :003 > Item.search("Clean")<br />
 => [#<Item id: 27, asin: "item-27", created_at: "2011-12-17 14:50:38", updated_at: "2011-12-17 14:50:38", svd_row_vector: nil, custom_url: "http://trooptrack.com", custom_price: #<BigDecimal:7fc1ec97d208,'0.12E2',9(18)>, custom_photo_url: "http://t3.gstatic.com/images?q=tbn:ANd9GcSTIeHk4_lq...", custom_title: "Netty Pot", custom_description: "Clean your sinuses">]<br />
ruby-1.9.2-p290 :004 ><br />
</code></p>
<p>Just like that, I have full text search!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/full-text-search-with-mysql-rails-3-and-sphinx-a-dive-journal/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avoid Presumptive Tests</title>
		<link>http://www.techdarkside.com/avoid-presumptive-tests</link>
		<comments>http://www.techdarkside.com/avoid-presumptive-tests#comments</comments>
		<pubDate>Sat, 17 Dec 2011 14:18:41 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=728</guid>
		<description><![CDATA[Test Style #1 @custom_item.image.should == @custom_item.custom_photo_url @custom_item.images.should == [@custom_item.custom_photo_url] @custom_item.buy_now_url.should == @custom_item.custom_url @custom_item.description.should == @custom_item.custom_description @custom_item.title.should == @custom_item.custom_title @custom_item.real_price.should == @custom_item.custom_price * 100 @custom_item.price.should == "$#{@custom_item.custom_price.to_s}" Test Style #2 @custom_item.image.should == "http://www.techdarkside.com/davesmall.jpg" @custom_item.images.should == ["http://www.techdarkside.com/davesmall.jpg"] @custom_item.buy_now_url.should == "http://techdarkside.com" @custom_item.description.should == "Nutritious and delicious" @custom_item.title.should == "Toe Jam Juicer" @custom_item.real_price.should == 4900 @custom_item.price.should == "$49.00" Which [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Test Style #1</strong><br />
<code><br />
@custom_item.image.should == @custom_item.custom_photo_url<br />
@custom_item.images.should == [@custom_item.custom_photo_url]<br />
@custom_item.buy_now_url.should == @custom_item.custom_url<br />
@custom_item.description.should == @custom_item.custom_description<br />
@custom_item.title.should == @custom_item.custom_title<br />
@custom_item.real_price.should == @custom_item.custom_price * 100<br />
@custom_item.price.should == "$#{@custom_item.custom_price.to_s}"<br />
</code><br />
<strong>Test Style #2</strong><br />
<code><br />
@custom_item.image.should == "http://www.techdarkside.com/davesmall.jpg"<br />
@custom_item.images.should == ["http://www.techdarkside.com/davesmall.jpg"]<br />
@custom_item.buy_now_url.should == "http://techdarkside.com"<br />
@custom_item.description.should == "Nutritious and delicious"<br />
@custom_item.title.should == "Toe Jam Juicer"<br />
@custom_item.real_price.should == 4900<br />
@custom_item.price.should == "$49.00"<br />
</code><br />
<strong>Which style is better?</strong><br />
I have a strong preference for the second style. The first style is what I call a set of &#8220;presumptive&#8221; tests. This is the expected results are derived from model they are testing. Sure, it might make for a somewhat less brittle test because you can change how you create the item before the test without breaking the test, but you also introduce the possibility of a false positive and you also obfuscate the intent of the test. Here&#8217;s what I mean.</p>
<p>Unit tests commonly check two things &#8211; that a a certain method returns a certain value and that the value is presented in the proper way (format, type, etc). They also helped programmers under the intent of the methods being tested as well. Presumptive tests fail in all of these records. For example:</p>
<p><code>@custom_item.buy_now_url.should == "http://techdarkside.com"</code></p>
<p>is, in my opinion, much clearer than </p>
<p><code>@custom_item.buy_now_url.should == @custom_item.custom_url</code></p>
<p>To me, the first test makes it perfectly clear that buy_now_url is meant to be 1) a string and 2) a well-formed url. That is helpful. The second test only tells me that the buy_now_url and custom_url should be the same. But what if the buy_now_url is supposed to be a string and in my test I use a different class? The test would still pass, but the functionality would not be doing what it is supposed to, likely breaking the UI.</p>
<p><strong>Bust my chops, please</strong><br />
It occurs to me that perhaps I&#8217;m missing something here. Feel free to tell me what it is and why it matters. I am not super awesome at TDD &#8211; I&#8217;m mostly just very functional about it and not particularly clever about writing really expressive, solid tests. So please bust my chops and make me better.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/avoid-presumptive-tests/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A lazy man&#8217;s .bashrc file</title>
		<link>http://www.techdarkside.com/a-lazy-mans-bashrc-file</link>
		<comments>http://www.techdarkside.com/a-lazy-mans-bashrc-file#comments</comments>
		<pubDate>Fri, 16 Dec 2011 02:43:30 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=724</guid>
		<description><![CDATA[If you&#8217;re reading this, you are either as lazy as I am or perhaps aspiring to be as lazy as me. Here are some aliases I find very useful. There&#8217;s nothing technically amazing in here, but I resent keystrokes. Especially the ones I end up typing over and over and over and over. #heroku stuff [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re reading this, you are either as lazy as I am or perhaps aspiring to be as lazy as me. Here are some aliases I find very useful. There&#8217;s nothing technically amazing in here, but I resent keystrokes. Especially the ones I end up typing over and over and over and over.</p>
<p><code><br />
#heroku stuff<br />
alias herot='git push test test:master' #push my test branch to my heroku test branch<br />
alias hero='git push heroku master' #push to prod</p>
<p>#rails stuff<br />
alias brake='bundle exec rake' # i.e. brake db:migrate<br />
alias rte='brake routes | grep' # Use this one a LOT, like this 'rte user' to get all the routes with user in them.<br />
alias smack='brake db:drop:all; brake db:create:all; brake db:migrate; brake db:seed'</p>
<p>#reload the database from a file<br />
alias redo='brake db:drop;brake db:create;mysql -u root trooptrack_development < ~/code/data/2011-11-14-04-00.sql'</p>
<p>#for rails projects using the sass gem (i.e. < 3.1), kick off your sass compiler<br />
alias goss='sass --watch public/stylesheets_sass:public/stylesheets'</p>
<p>#this is purely excessive<br />
alias vb='vi ~/.bash_profile'<br />
alias sb='source ~/.bash_profile'</p>
<p>#git stuff<br />
alias gs='git status'<br />
alias gp='git push'<br />
alias gcm='git commit -m'<br />
alias ga='git add'<br />
alias gitco='git checkout'<br />
alias gitcp='git cherry-pick'<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/a-lazy-mans-bashrc-file/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi-dimensional filtering with jquery</title>
		<link>http://www.techdarkside.com/multi-dimensional-filtering-with-jquery</link>
		<comments>http://www.techdarkside.com/multi-dimensional-filtering-with-jquery#comments</comments>
		<pubDate>Wed, 14 Dec 2011 19:39:27 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=719</guid>
		<description><![CDATA[See it in action New Filter from David Christiansen on Vimeo. How it works I was surprised at how easy it was to make this work. Basically, each of the properties I want to filter by has an ID that corresponds to a class on everything I want to filter. In addition, everything I want [...]]]></description>
			<content:encoded><![CDATA[<p><strong>See it in action</strong><br />
<iframe src="http://player.vimeo.com/video/33678293?title=0&amp;byline=0&amp;portrait=0" width="400" height="300" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/33678293">New Filter</a> from <a href="http://vimeo.com/user1703172">David Christiansen</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>How it works</strong><br />
<span id="more-719"></span><br />
I was surprised at how easy it was to make this work. Basically, each of the properties I want to filter by has an ID that corresponds to a class on everything I want to filter. In addition, everything I want to filter has a &#8220;filtered&#8221; class applied to it. </p>
<p>For example, the classes on the first div in the video look like this:<br />
<code>div class='filtered lizards scout'...</code></p>
<p>That&#8217;s because this person is a scout who is in the Lizards patrol. If you don&#8217;t know anything about scouting, it just means he is in a sub-group called &#8220;Lizards&#8221;. So, if I want to see only the scouts in his patrol, I check Lizards and Scouts. If I want to see all the scouts in the troop, I uncheck Lizards. In other words, the second column <em>refines</em> the items selected from the first column, if there is a selection in the first column.</p>
<p>Also, I should mention two things:</p>
<ul>
<li>I haven&#8217;t styled the tool tip div yet. Feel free to throw some css my way if you want.</li>
<li>I am not happy with the effect &#8211; so far plain hide/show have been best, but I&#8217;d like to do something kewl</li>
</ul>
<p>So, here&#8217;s the code, feel free to suggest re-factoring at will, as I am no javascript master.</p>
<p><code><br />
$(document).ready(function(){<br />
  $(".filter-check input").change(function(){<br />
    run_filter();<br />
  })<br />
})</p>
<p>function run_filter() {<br />
  $('.filtered').show();<br />
  var patrols = $('.patrol_column input:checked');<br />
  var roles = $('.role_column input:checked');</p>
<p>  var selector = [];<br />
  if(patrols.length == 0){<br />
    for (i = 0; i< roles.length; i += 1) {<br />
      selector.push("." + $(roles[i]).attr('id'));<br />
    }<br />
  }else<br />
  {<br />
    for (i = 0; i < patrols.length; i += 1) {<br />
      patrol = $(patrols[i]).attr('id');<br />
      if(roles.length == 0){<br />
        selector.push("." + patrol);<br />
      }else<br />
      {<br />
        for (i = 0; i< roles.length; i += 1) {<br />
          selector.push("." + $(roles[i]).attr('id') + "." + patrol);<br />
        }<br />
      }<br />
    };<br />
  }<br />
  if(selector.length == 0){<br />
    $('.filtered').slideDown('slow');<br />
  }else{<br />
    $('.filtered').hide();<br />
    $(selector.join(',')).slideDown('slow');<br />
  }<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/multi-dimensional-filtering-with-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puzzling About Conversion Rates</title>
		<link>http://www.techdarkside.com/puzzling-about-conversion-rates</link>
		<comments>http://www.techdarkside.com/puzzling-about-conversion-rates#comments</comments>
		<pubDate>Thu, 01 Dec 2011 15:28:24 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=676</guid>
		<description><![CDATA[From Anecdotal to Evidential I&#8217;ve been telling myself a story about TroopTrack for the past year or so &#8211; that the conversion rate is getting better. I wasn&#8217;t really sure that was the case, but that&#8217;s how it seemed based on my general sense of signups and conversions to paying customers. I don&#8217;t like telling [...]]]></description>
			<content:encoded><![CDATA[<p><strong>From Anecdotal to Evidential</strong><br />
I&#8217;ve been telling myself a story about TroopTrack for the past year or so &#8211; that the conversion rate is getting better. I wasn&#8217;t really sure that was the case, but that&#8217;s how it seemed based on my general sense of signups and conversions to paying customers. I don&#8217;t like telling myself stories without checking on myself, so I did. I wrote some queries, pulled some numbers, made a spreadsheet and started making charts.</p>
<p><strong>Am I Totally Clueless?</strong><br />
The story I was telling myself revolved around how I perceived the quality of the code base. At launch in 2009 TroopTrack was buggy. It crashed all the time, and I didn&#8217;t even know about it because I didn&#8217;t have exceptional set up yet. Late in the year I added exceptional, discovered how crappy TroopTrack was (most days I would get 30+ emails from exceptional), and went on a bug hunt that lasted through most of 2010. I wasn&#8217;t just fixing 500&#8242;s, I was also fixing functional issues reported by users. In 2011, I started feeling more confident in the application&#8217;s stability and wanted to start getting the word out somehow. I also added some new features that were requested by users throughout the year and focused my efforts on responding to support tickets. In my mind, I thought conversion rates were getting better as a result of these efforts. </p>
<p>My first chart was no help at validating this story. At all.</p>
<div id="attachment_681" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.techdarkside.com/wp-content/uploads/2011/12/crtt.png"><img src="http://www.techdarkside.com/wp-content/uploads/2011/12/crtt-300x124.png" alt="TroopTrack Conversion Rate" title="TroopTrack Conversion Rate" width="300" height="124" class="size-medium wp-image-681" /></a><p class="wp-caption-text">Quarterly Conversion Rate</p></div><br />
I saw this chart and my heart sunk. I couldn&#8217;t see any evidence that, aside from a couple of awesome quarters, conversion rates were going up overall. Sure, my conversion rate since the dawn of time had improved quite a bit, but I couldn&#8217;t see any trend by quarter.</p>
<p><strong>What about the hockey stick?</strong><br />
Every entrepreneur wants to see a hockey stick in their growth chart. So I plotted out the number of paying customers over time, just to see how things were going. I fully expected to see a curve. </p>
<p><div id="attachment_680" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.techdarkside.com/wp-content/uploads/2011/12/troops.png"><img src="http://www.techdarkside.com/wp-content/uploads/2011/12/troops-300x144.png" alt="" title="Subscribers" width="300" height="144" class="size-medium wp-image-680" /></a><p class="wp-caption-text">That&#039;s a straight line!</p></div>
<p>Sigh.</p>
<p><strong>A different view</strong><br />
Clearly there was a lot of variability in my conversion rate at the quarterly level. What about year over year? That was my next chart.</p>
<div id="attachment_679" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.techdarkside.com/wp-content/uploads/2011/12/progress.png"><img src="http://www.techdarkside.com/wp-content/uploads/2011/12/progress-300x242.png" alt="" title="progress" width="300" height="242" class="size-medium wp-image-679" /></a><p class="wp-caption-text">Conversion Rate by Year</p></div>
<p>Okay, that&#8217;s better. At least on an annual basis, the conversion rate seems to be getting better.</p>
<p><strong>Correlation or causation?</strong><br />
I think that last chart supports the story I was telling myself, that overall the conversion rate was getting better, but it made me think about the impact of good support on the conversion rate. The peaks in 2011 coincided with periods of high interaction between me and the user base. During those times, I was dutifully closing support tickets or rolling out new features accompanied with an email announcement. Were those activities impacting conversion rates? I think they were, and I&#8217;ve added some things to my how-to-turn-shoppers-into-customers list.</p>
<ul>
<li>Customers who have a good experience with a support ticket during their trial have a higher likelihood of purchasing a subscription</li>
<li>Customers who see an improvement made during their trial period have a higher likelihood of purchasing a subscription</li>
</ul>
<p>I think this means I need to roll out a new feature every month. Or at least tell my users about the progress I&#8217;ve made fixing bugs, etc. But there is a bigger lesson here, one that is reinforced by something else I&#8217;ve been doing in the fourth quarter of this year.</p>
<p><strong>Customers who feel like they know me are most likely to purchase a subscription</strong><br />
Many of my customers start support tickets with my first name. They speak to me in familiar ways. Some of them call me on my cell phone. When I hurt my back early this year and fell behind on TroopTrack, several of them called to make sure I was okay. They feel like they know me, and I feel like I know them. These customers are very loyal and they are good advocates for my product.</p>
<p>In Q4 I&#8217;ve been calling every trial troop to see how things are going and to offer help. It can be hard to reach people &#8211; I leave a lot of messages. I don&#8217;t have numbers to prove this yet, but the conversion rate of the customers I am able to personally interact with feels much, much higher. So I&#8217;m going to keep calling them, and maybe I will hire someone to help me with this.</p>
<p><strong>All charts lead to fantasies</strong><br />
You can&#8217;t collect numbers and make charts without thinking about the future. I&#8217;m kind of obsessed with 20,000 subscribers. That&#8217;s the million dollar mark. In terms of making the most impact on my lifestyle, 5000 subscribers is probably a more significant number. That&#8217;s the freedom mark.</p>
<p><a href="http://www.techdarkside.com/wp-content/uploads/2011/12/subscribers.png"><img src="http://www.techdarkside.com/wp-content/uploads/2011/12/subscribers-300x160.png" alt="" title="Subscriber Growth" width="300" height="160" class="aligncenter size-medium wp-image-678" /></a></p>
<p>So, assuming that I add 60% more troops than I did the year before then freedom comes in 2018 and $1,000,000 in revenue comes in 2021.<br />
I came up with 60% fairly non-scientifically. I added 60-something new subscriptions in 2011. I feel comfortable that I can add at least 100 in 2012. That&#8217;s about a 60% acceleration. </p>
<p><a href="http://www.techdarkside.com/wp-content/uploads/2011/12/rev.png"><img src="http://www.techdarkside.com/wp-content/uploads/2011/12/rev-300x181.png" alt="" title="Revenue Growth" width="300" height="181" class="aligncenter size-medium wp-image-677" /></a></p>
<p>Even though this is very, very speculative, it reinforces some very important things about this business of mine:</p>
<ul>
<li>The lifetime value of a subscriber is high. My subscribers are ORGANIZATIONS. Once they pick a product, they tend to stick around. Personal efforts required to obtain a subscriber are worth it</li>
<li>Persistence and consistent improvement is critical</li>
<li>Building my business in a way that I can sustain my efforts for a decade is the key to making it</li>
</ul>
<p>When you are looking at projected revenue growth and the hockey stick is 6 years away, you have to think about your commitment. For me, it&#8217;s easy. I accepted the long road two years ago. To me, six years is nothing. It&#8217;s the light at the end of a tunnel, except the tunnel isn&#8217;t dark, wet, or spooky. It&#8217;s fun, educational, and kind of inspiring. This makes six more years of working hard pretty easy to swallow. Like chocolate ice cream. With hot fudge. Whip cream. A cherry. And banana slices. I&#8217;m just sayin&#8217;. </p>
<p>I love being a bootstrap entrepreneur.</p>
<p>That said, I&#8217;m not against doing things to make it go faster. For instance, I&#8217;m considering raising money to finance TroopTrack mobile and other development efforts. I&#8217;m also working on ways of accelerating TroopTrack&#8217;s viral growth, like welcome kits for new subscribers that include pass-along cards they can give to other scouters, in-store displays, and a direct mailing. I tried a print ad, but it had unimpressive results. I might try that again someday, but for now I&#8217;m going with things that feel more personal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/puzzling-about-conversion-rates/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

