<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Telematter, Inc - Home</title>
  <id>tag:www.telematter.com,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  
  <link href="http://www.telematter.com/" rel="alternate" type="text/html" />
  <updated>2008-03-01T06:47:05Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/telematter-blog" type="application/atom+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2008-03-01:22</id>
    <published>2008-03-01T06:46:00Z</published>
    <updated>2008-03-01T06:47:05Z</updated>
    <category term="awesome" />
    <category term="birthday" />
    <category term="first" />
    <category term="happy" />
    <category term="joy" />
    <category term="telematter" />
    <link href="http://www.telematter.com/2008/3/1/happy-birthday-telematter-inc" rel="alternate" type="text/html" />
    <title>Happy Birthday Telematter, Inc!</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;“You are only young once, but you can be immature for a lifetime.” – John P. Grier&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.telematter.com/assets/2008/2/28/birthday_cupcake.jpg" alt="Birthday Cupcake!" /&gt;&lt;br /&gt;
&lt;em&gt;&lt;a href="http://flickr.com/photos/zesmerelda/857663693/"&gt;This photo&lt;/a&gt; is licensed under the &lt;a href="http://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons License&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Telematter, Inc just turned 1 – well, on February 27th actually.  I was going to submit this post back then, but we ran into some issues with our blog platform.  There’s still some kinks to work out, but I wanted to get something up..&lt;/p&gt;

&lt;p&gt;I was on the company jabber server chatting with the team, announcing the importance of the day (on Wednesday I mean, on the 27th..).  The chat log went something like (not exact quotes):&lt;/p&gt;

&lt;p&gt;me: guys!  guess what today is!  that’s right, it’s Telematter’s first birthday!&lt;br /&gt;
nabil (one of our awesome developers): woah.  why aren’t we partying it up?&lt;br /&gt;
me: well, Telematter’s just a faceless corporation.&lt;br /&gt;
me: it doesn’t have feelings.  just as long as annual franchise tax gets paid on time.  &lt;/p&gt;

&lt;p&gt;I think that’s pretty much true, but I will say that if it DID have feelings, it would certainly be smiling.  Anyway, happy birthday you crazy little company you.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2008-01-30:8</id>
    <published>2008-01-30T23:38:00Z</published>
    <updated>2008-01-30T23:43:02Z</updated>
    <category term="growing office employees books" />
    <link href="http://www.telematter.com/2008/1/30/now-we-re-talking" rel="alternate" type="text/html" />
    <title>Now we're talking</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;”A man who has no office to go to, I don’t care who he is, is a trial of which you can have no conception” – George Bernard Shaw&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.telematter.com/assets/2008/1/30/growing.jpg" alt="Growing" /&gt;
&lt;em&gt;&lt;a href="http://flickr.com/photos/bonguri/128765190/"&gt;This photo&lt;/a&gt; is licensed under the &lt;a href="http://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons License&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Finally!  Telematter has an office!  Besides my apartment I mean &lt;code&gt;*grin*&lt;/code&gt;.  “Liberty Square” – that’s the new home of Telematter, Inc.&lt;/p&gt;

&lt;p&gt;Or to be exact:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;3200 Penn Terrace Suite 108
Columbia, MO 65202
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since my last post, Telematter has leased an office and hired two very talented developers.  I’ll let them introduce themselves (they both start next week) but needless to say, I am super excited to see this company developing.&lt;/p&gt;

&lt;p&gt;In other news, I wanted to mention two great books I’m reading.  One is called &lt;a href="http://www.amazon.com/gp/product/0066620996?ie=UTF8&amp;amp;amp;tag=telematter-20&amp;amp;amp;linkCode=as2&amp;amp;amp;camp=1789&amp;amp;amp;creative=9325&amp;amp;amp;creativeASIN=0066620996"&gt;Good to Great: Why Some Companies Make the Leap… and Others Don’t&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=telematter-20&amp;amp;amp;l=as2&amp;amp;amp;o=1&amp;amp;amp;a=0066620996" height="1" alt="" width="1" /&gt; and the other is &lt;a href="http://www.amazon.com/gp/product/0307352188?ie=UTF8&amp;amp;amp;tag=telematter-20&amp;amp;amp;linkCode=as2&amp;amp;amp;camp=1789&amp;amp;amp;creative=9325&amp;amp;amp;creativeASIN=0307352188"&gt;The Breakthrough Company: How Everyday Companies Become Extraordinary Performers&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=telematter-20&amp;amp;amp;l=as2&amp;amp;amp;o=1&amp;amp;amp;a=0307352188" height="1" alt="" width="1" /&gt;.  Good to Great came recommended to me by one of my favorite friends.  The book is chock full of great information on what makes a stellar company.  Jim Collins led a research team to pour over empirical market data to identify companies that outperformed their market sector by a wide margin, and then conducts interviews with the executives to find out what makes a winning company tick.  The Breakthrough Company seems to have been largely inspired by Good to Great.  The key difference being that it is tailored to small companies.  Where Good to Great focuses on companies which are already pulling revenues of hundreds of millions or billions of dollars, The Breakthrough Company is aimed at the little guys like us.  Great reading for any entrepreneur, in the tech field or otherwise.  Check them out!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2007-12-31:7</id>
    <published>2007-12-31T07:30:00Z</published>
    <updated>2007-12-31T18:01:48Z</updated>
    <category term="newyear business update paul graham startup" />
    <link href="http://www.telematter.com/2007/12/31/countdown-to-the-new-year" rel="alternate" type="text/html" />
    <title>Countdown to the new year</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;”It is a most mortifying reflection for a man to consider what he has done, compared to what he might have done.” – Samuel Johnson&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.telematter.com/assets/2007/12/27/happy_new_year.jpg" alt="Happy New Year" /&gt;
&lt;em&gt;&lt;a href="http://flickr.com/photos/sally_12/339912423/"&gt;This photo&lt;/a&gt; is licensed under the &lt;a href="http://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons License&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ok, so maybe the quote is a bit overdramatic.  Looking back, we’ve had a great year.  We built a good brand.  We incorporated and managed to shake up some business, including one very key partnership in particular.  I cannot wait until we’re able to launch and showcase the fruits of our labor.  This year has been a great year for laying a strong foundation, but we’ve also had our fair share of setbacks.  I’m reminded again how dangerous it can be to mix friendship with business.  It seems to me like the best relationships for business are ones that start out nearly purely professional but soon turn friendly (all the while staying focused on success, of course).  It doesn’t seem to work so well the other way.  Whenever I have dared to pull friends into business, it seldom ends well.&lt;/p&gt;

&lt;p&gt;I’m also reminded of how easy it can be to underestimate the scope of a project (or maybe overestimate our abilities..  or both?).  I’ve drawn the analogy of feeling like an architect working on a cathedral.  I’ve laid out the plans, acquired all of the materials, but instead of leaning on a strong team of masons to lay the brick, I’m on my knees with the trowel.  Maybe this isn’t exactly fair either.  I’ve worked with a handful of very talented designers and programmers this year – but ultimately I feel like I’ve failed to scale and delegate properly.  Part of the problem is that it’s very difficult to find talent that understands the business domain that we’re working in.  Mostly though, I think I just have trust issues.  I still have major paranoia about outsourcing important work to people who I’ve never met, in most cases.&lt;/p&gt;

&lt;p&gt;Looking forward, I believe 2008 is going to be a pivotal year for us.  “Us” really will become an us, instead of just me and a loose-knit team of freelancers dotted across the globe.  Securing a physical location for our office and recruiting a team of developers to work on-site will go a long way in enabling this business to scale rapidly.  I’m really excited to think about writing a blog post a year from now, and comparing it to the sentiment of this post.&lt;/p&gt;

&lt;p&gt;I still believe the year has been a success.  I think back on the paragraph which &lt;a href="http://en.wikipedia.org/wiki/Paul_Graham"&gt;Paul Graham&lt;/a&gt; opened with in his essay &lt;a href="http://www.paulgraham.com/start.html"&gt;How to Start a Startup&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;”You need three things to create a successful startup: to start with good people, to make something customers actually want, and to spend as little money as possible. Most startups that fail do it because they fail at one of these. A startup that does all three will probably succeed.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’ve done an excellent job at managing costs.  We’ve incorporated processes which allow us to build software more effectively than a huge segment of the competition.  But we’re still struggling with building a team of talented people.  This is one of my primary goals for 2008, and I’m confident that this is just another obstacle that will be negotiated.  Like Graham says, “Hard, but doable”.&lt;/p&gt;

&lt;p&gt;So here’s to reflecting on past success and failure, but more importantly to a fantastic year ahead.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2007-11-20:6</id>
    <published>2007-11-20T07:00:00Z</published>
    <updated>2007-11-20T12:17:24Z</updated>
    <category term="logic problem brain teaser ruby" />
    <link href="http://www.telematter.com/2007/11/20/brain-exercise" rel="alternate" type="text/html" />
    <title>A little brain exercise</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;”Practice doesn’t make perfect.  Perfect practice makes perfect.” – Vince Lombardi&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s a cool logic problem that a friend shared recently:&lt;/p&gt;

&lt;p&gt;There are 14 cards on a table.  Each card can be numbered with a number 1 through 10.  Each three consecutive cards must sum to 18.  The fourth card is a 7, and the twelfth card is an 8.  What is the eighth card?&lt;/p&gt;

&lt;p&gt;I had problems reasoning it out, so I decided &lt;a href="http://www.ruby-lang.org/Ruby"&gt;Ruby&lt;/a&gt; would save the day!  So I wrote some code to try a brute force search, and here’s what I came up with:&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;35&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/ruby&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;O&lt;/span&gt; = [&lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="i"&gt;7&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;     &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;     &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="i"&gt;8&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;];&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;checker&lt;/span&gt;(arr)&lt;tt&gt;
&lt;/tt&gt;    (&lt;span class="i"&gt;0&lt;/span&gt;..(arr.length&lt;span class="i"&gt;-3&lt;/span&gt;)).each &lt;span class="r"&gt;do&lt;/span&gt; |i|&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;false&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; (arr[i].nil? &lt;span class="r"&gt;or&lt;/span&gt; arr[i&lt;span class="i"&gt;+1&lt;/span&gt;].nil? &lt;span class="r"&gt;or&lt;/span&gt; arr[i&lt;span class="i"&gt;+2&lt;/span&gt;].nil?)&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;if&lt;/span&gt; ((arr[i] + arr[i&lt;span class="i"&gt;+1&lt;/span&gt;] + arr[i&lt;span class="i"&gt;+2&lt;/span&gt;]) != &lt;span class="i"&gt;18&lt;/span&gt;) &lt;span class="r"&gt;then&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;k = &lt;span class="co"&gt;O&lt;/span&gt;.clone&lt;tt&gt;
&lt;/tt&gt;(&lt;span class="i"&gt;0&lt;/span&gt;..(k.length&lt;span class="i"&gt;-1&lt;/span&gt;)).each &lt;span class="r"&gt;do&lt;/span&gt; |i|&lt;tt&gt;
&lt;/tt&gt;    k[i] = &lt;span class="i"&gt;1&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; k[i].nil?&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;stop = &lt;span class="pc"&gt;false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;MAX&lt;/span&gt; = &lt;span class="i"&gt;10&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;p = &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;cnt = &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;while&lt;/span&gt; (!checker(k)) &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    cnt += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;while&lt;/span&gt; k[p] == &lt;span class="co"&gt;MAX&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        k[p] = &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        p += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;while&lt;/span&gt; (&lt;span class="co"&gt;O&lt;/span&gt;[p] != &lt;span class="pc"&gt;nil&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;            p += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    k[p] += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    p = &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;puts k.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Feeling quite satisfied with myself, I set my machine into motion.  Then I added some puts trace statements to see how quickly I could expect my answer.  Finally, the reality of the situation came into focus, as rough estimates showed me that it would take about 400 hours to arrive at the answer with this code running on my setup.&lt;/p&gt;

&lt;p&gt;Sure it could be tweaked to use heuristics of the problem to search more efficiently, but the point of my idea was to try and be lazy and let Ruby do all the work.  I even tried a random search before the current version of the code, that wasn’t happening either.  Although imagine how crazy it would have been if it did!  Sometimes it’s easy to underestimate a problem.&lt;/p&gt;

&lt;p&gt;Anyway, after revisiting the problem and just applying some simple logic, the answer came pretty quickly.  Sometimes it’s also easy to overestimate a problem.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2007-10-28:5</id>
    <published>2007-10-28T20:00:00Z</published>
    <updated>2007-10-28T20:12:59Z</updated>
    <category term="version control cvs subversion software engineering development methodology" />
    <link href="http://www.telematter.com/2007/10/28/the-virtues-of-version-control" rel="alternate" type="text/html" />
    <title>The virtues of version control</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;”History is the version of past events that people have decided to agree upon.” – Napoleon Bonaparte&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s always a good idea to maintain a network of colleagues that you can call on for advice when you need it.  Recently a friend and I were discussing our respective software projects, and I started asking him questions about his methodology.  I asked if he was making use of any continuous integration systems, like &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt; or &lt;a href="http://sourceforge.net/projects/ccnet/"&gt;CruiseControl.NET&lt;/a&gt;.  He wasn’t.  I asked him if he had used any tools for &lt;a href="http://ncover.org/"&gt;coverage analysis&lt;/a&gt; or &lt;a href="http://www.redhillconsulting.com.au/products/simian/"&gt;similarity analysis&lt;/a&gt; in his build process.  He didn’t.  I asked him what he was using for &lt;a href="http://www.junit.org/"&gt;unit testing&lt;/a&gt;, and he replied that he wasn’t doing any.&lt;/p&gt;

&lt;p&gt;Many software teams I’ve encountered (or even been a part of) have ignored these tools.  This isn’t terribly uncommon.  Finally I ask him, “are you even doing any &lt;a href="http://en.wikipedia.org/wiki/Revision_control"&gt;version control&lt;/a&gt;?”.  He was not.&lt;/p&gt;

&lt;p&gt;I found this to be very surprising, because my buddy has been working on his project for the better part of a year.  He hopes to productize his software and take it to market.  It’s apparently a fairly mature codebase, and yet it is not under the safe watch of any versioning system.  It’s shocking to me, because here we are in the year 2007.  We have the best tools the world has ever known to create software, and yet to a large extent they go unused.  Why is this?&lt;/p&gt;

&lt;p&gt;With regards to versioning, my friend has several options.  Traditionalists are still using &lt;a href="http://www.nongnu.org/cvs/"&gt;CVS&lt;/a&gt;.  &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; has gained all kinds of momentum in the past few years (and incidentally, it’s what we use at &lt;a href="http://www.telematter.com/"&gt;Telematter&lt;/a&gt;).  Microsoft has its line in the water with &lt;a href="http://msdn.microsoft.com/ssafe/"&gt;SourceSafe&lt;/a&gt;, which I think has been integrated into TeamSystem, but I’m not quite sure.  Even some of the strongest opensource advocates I know readily plop down cash for &lt;a href="http://www.perforce.com/"&gt;Perforce&lt;/a&gt;, they say it’s THAT good.  There’s new entrants to the arena all of the time, like &lt;a href="http://www.sourcegear.com/"&gt;Sourcegear&lt;/a&gt;.  Linus Torvalds uses &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; to help manage the development of the Linux kernel.&lt;/p&gt;

&lt;p&gt;There are many options.  My buddy’s reason for not using any of them?  “I’m the only person working on the code.  Why would I need to version it?”&lt;/p&gt;

&lt;p&gt;I believe this is the most common reason for not using a versioning system – people just don’t know when the project is established enough to merit using one.  Many less experienced developers feel that the right time to start using version control is when there are multiple developers touching the codebase.  While this would certainly be a good reason (and I can’t imagine many successful teams of developers NOT using versioning), I think it’s terrible thinking to reason that the lone coder working in isolation doesn’t benefit from the virtues of version control.  My take on it is that you should be using version control as soon as you have code that you care about enough that you would be disappointed to lose it.  That’s when it’s important enough to version it.&lt;/p&gt;

&lt;p&gt;All of this of course inspired me to climb up on my soapbox and preach about the many reasons for versioning your software.  I hear that lists are good for blogs, so here’s my top 10 reasons for using a version control system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never again suffer from the confusion of juggling multiple versions of your codebase by hand.&lt;/li&gt;
&lt;li&gt;Provides a single source for backups.&lt;/li&gt;
&lt;li&gt;Multiple developers easily work against the same code base.&lt;/li&gt;
&lt;li&gt;Branches are easily managed with version control.  Sometimes you want to experiment and take the project in a whole new direction.&lt;/li&gt;
&lt;li&gt;Commits can reference ticket #s or bug ids so that developers can easily answer the question “When did we fix that bug?”.&lt;/li&gt;
&lt;li&gt;Easily diff new versions against old ones to pinpoint changes.&lt;/li&gt;
&lt;li&gt;Easily integrate with a web tool like &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; to provide project statistics at a glance.&lt;/li&gt;
&lt;li&gt;Plays a key role in continuous integration systems.&lt;/li&gt;
&lt;li&gt;No real software engineer or manager will take your project seriously unless it’s under version control.&lt;/li&gt;
&lt;li&gt;Develop with impunity.  You have a safety net with version control.  If you screw something up, it’s no big deal to revert your changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For these reasons, I believe that just after the compiler/interpreter and debugger, a versioning system is the most useful tool in the software engineer’s arsenal.  If your project isn’t under version control yet, what are you waiting for?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2007-10-17:4</id>
    <published>2007-10-17T05:18:00Z</published>
    <updated>2008-07-16T08:17:16Z</updated>
    <link href="http://www.telematter.com/2007/10/17/hollywood-uses-static-analysis" rel="alternate" type="text/html" />
    <title>Hollywood uses static analysis?</title>
<content type="html">
            &lt;p&gt;So, my brother and I recently started working on a screenplay.  We haven’t been able to spend too much time together to work on it, but we did make some good progress this past weekend.  We’re using this software called &lt;a href="http://www.finaldraft.com/"&gt;Final Draft&lt;/a&gt; which saves us a ton of hassle.  One of the interesting things about &lt;a href="http://www.screenwriting.info/"&gt;screenplays&lt;/a&gt; is that they have a very unique format.  It’s a lot like computers in this respect.  In fact, the feature I wanted to talk about in this blog post has a very strong analogy in the software world.&lt;/p&gt;

&lt;p&gt;Here’s an example of a scene with a bug:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;INT. LIVING ROOM - NIGHT

ROBERT BOYD sits at his keyboard, working on his latest blog post.  He�??s trying to demonstrate how static analysis works, and
this action text is serving as an object lesson.  He�??s about to add some empty dialogue, and that�??s not going to go over so well
with Final Draft�??s static analyzer.

                                                                    ROBERT BOYD
                                                            (speechless)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And here’s what happens when you run &lt;a href="http://www.finaldraft.com/"&gt;Final Draft’s&lt;/a&gt; Format Assistant tool:&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/2007/10/17/format_assist.png" alt="Format Assist Report" /&gt;&lt;/p&gt;

&lt;p&gt;See what happened there?  Since my character doesn’t have any dialogue, Format Assist knows to complain in the report.  No, that “(speechless)” doesn’t count for dialogue, that’s actually a &lt;a href="http://www.screenwriting.info/08.php"&gt;Parenthetical&lt;/a&gt;.  The dialogue is supposed to come on the next line (and is also closer to the left border).&lt;/p&gt;

&lt;p&gt;This functionality is very similar to what’s called &lt;a href="http://en.wikipedia.org/wiki/Static_code_analysis"&gt;static analysis&lt;/a&gt; in the software world.  There are some older tools like &lt;a href="http://www.splint.org/"&gt;Splint&lt;/a&gt; which actually analyze the syntax of your source code, and some newer ones like &lt;a href="http://www.gotdotnet.com/Team/FxCop/"&gt;FxCop&lt;/a&gt; and &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; which analyze compiler-generated bytecode to find errors.  Check out this &lt;a href="http://video.google.ca/videoplay?docid=-8150751070230264609"&gt;video&lt;/a&gt; where several different classes of bugs are described, all of which can be found using static analysis techniques.  These are great tools which work surprisingly well and can save heaps of time.&lt;/p&gt;

&lt;p&gt;I’m not aware of any static analysis tools for Actionscript or ABC (Actionscript Byte-Code), but it certainly seems like a good candidate for such technology.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2007-10-11:3</id>
    <published>2007-10-11T18:55:00Z</published>
    <updated>2007-10-11T18:57:40Z</updated>
    <category term="cairngorm" />
    <category term="flex" />
    <category term="patterns" />
    <category term="programming" />
    <category term="software" />
    <link href="http://www.telematter.com/2007/10/11/three-cheers-for-cairngorm" rel="alternate" type="text/html" />
    <title>Three cheers for Cairngorm!</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;�??Architecture is the learned game, correct and magnificent, of forms assembled in the light.” – Le Corbusier&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ve been working on a project for the past few months which involves porting a Flash/AS2 application to Flex/AS3.  With any new technology, there’s always a bit of a learning curve.  The concept of MXML in Flex was familiar because of my research into Microsoft’s XAML technology, but it wasn’t immediately obvious to me how to build a clean interface between my MXML components and AS3 business objects.  I dug into this book: &lt;a href="http://www.amazon.com/gp/product/059652689X?ie=UTF8&amp;amp;amp;tag=telematter-20&amp;amp;amp;linkCode=as2&amp;amp;amp;camp=1789&amp;amp;amp;creative=9325&amp;amp;amp;creativeASIN=059652689X"&gt;Programming Flex 2: The comprehensive guide to creating rich media applications with Adobe Flex (Programming)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=telematter-20&amp;amp;amp;l=as2&amp;amp;amp;o=1&amp;amp;amp;a=059652689X" height="1" alt="" width="1" /&gt;, and I started building various toy applications to get acquainted (mostly with the object model).  Finally I started building out the client’s application.&lt;/p&gt;

&lt;p&gt;During implementation I caught myself implementing various &lt;a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)"&gt;design patterns&lt;/a&gt;, and I started wondering if there was an existing framework to make use of.  It turns out that there is.  The &lt;a href="http://labs.adobe.com/wiki/index.php/Cairngorm"&gt;Cairngorm Microarchitecture&lt;/a&gt; provides a fantastic MVC framework for developing RIAs.  It also addresses an issue that I’m always worried about, which is maintainability.  With Cairngorm, if another developer inherits my application, he will have a much easier time learning his way around the codebase.  Even if the developer has no experience with Cairngorm, there is pretty extensive &lt;a href="http://www.cairngormdocs.org/"&gt;documentation&lt;/a&gt; on the framework.  Cairngorm builds as a .SWC, so all you need to do is grab the binary distribution and drop it in your build path to start playing around.  I recommend starting with the &lt;a href="http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html"&gt;six-part tutorial&lt;/a&gt; before splashing around too much.&lt;/p&gt;

&lt;p&gt;The developers of Cairngorm have done an excellent job, and I think anyone building with Flex should strongly considering leveraging their work.  Cairngorm has significantly reduced the complexity and time to implementation of our project, and I’m very satisfied with it.  Give it a try!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.telematter.com/">
    <author>
      <name>rboyd</name>
    </author>
    <id>tag:www.telematter.com,2007-10-06:1</id>
    <published>2007-10-06T14:38:00Z</published>
    <updated>2008-04-04T14:27:42Z</updated>
    <link href="http://www.telematter.com/2007/10/6/test-post" rel="alternate" type="text/html" />
    <title>The birth of a blog</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;“Men are equal; it is not birth but virtue that makes the difference.” – Voltaire&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every blog has a first post, and so now does this one.&lt;/p&gt;

&lt;p&gt;I’ll be using this blog mainly to document the latest happenings with my software company, Telematter.  I’ll also be posting about various ideas I have, or reporting on my experiences developing software.&lt;/p&gt;

&lt;p&gt;I really don’t have much of a track record for maintaing any sort of blog, so I hope I can keep this up.&lt;/p&gt;

&lt;p&gt;Beyond documenting my own experiences, I hope this blog can serve to connect with other developers.  Hopefully it will also serve as a marketing tool to open the door to prospective clients.&lt;/p&gt;
          </content>  </entry>
</feed>
