<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Bryant Rethinks Software</title>
	
	<link>http://www.bryanthankins.com/techblog</link>
	<description>So you don't have to...</description>
	<pubDate>Sun, 07 Mar 2010 04:18:25 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BryantRethinksSoftware" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="bryantrethinkssoftware" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Getting Started With OpenID</title>
		<link>http://www.bryanthankins.com/techblog/2010/03/06/getting-started-with-openid/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/03/06/getting-started-with-openid/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 04:18:25 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/03/06/getting-started-with-openid/</guid>
		<description><![CDATA[ 
Recently, I integrated OpenID into the latest revision of the Cub Scout BragVest site and I think it’s truly the wave of the future. But, as of yet, it’s a highly underutilized technology so I wanted to give a brief overview of it here.
What is it?
The OpenID site has a good description to start [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/03/openidlogo.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="openid-logo" border="0" alt="openid-logo" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/03/openidlogo-thumb.png" width="240" height="240" /></a> </p>
<p>Recently, I integrated <a href="http://www.openID.net" target="_blank">OpenID</a> into the latest revision of the Cub Scout <a href="http://www.bragvest.com" target="_blank">BragVest</a> site and I think it’s truly the wave of the future. But, as of yet, it’s a highly underutilized technology so I wanted to give a brief overview of it here.</p>
<h2>What is it?</h2>
<p>The <a href="www.openID.net" target="_blank">OpenID site</a> has a good description to start with:</p>
<blockquote><p>OpenID allows you to use an existing account to sign in to multiple websites, without needing to create new passwords. With OpenID, your password is only given to your identity provider, and that provider then confirms your identity to the websites you visit. Other than your provider, no website ever sees your password</p>
</blockquote>
<p>So let’s unwrap this. In a nutshell, OpenID allows you to use your existing accounts at big sites (like Google, Yahoo, MySpace, Hotmail, Facebook and Twitter) to login to other sites. All without creating a new username and password.</p>
<p>You are simply redirected to the site of your choice to login and then securely redirected back to the original site with an authentication token. The original site never sees your password.</p>
<h2>What Problem Does it Solve?</h2>
<p>Imagine that you find a cool new site (like <a href="http://www.bragvest.com" target="_blank">BragVest</a>) and you want start tracking your cub scout achievements. But you don’t want to create yet another login and password. With OpenID you can login to that site using your existing account at Facebook or Google account.&#160; </p>
<p>It also means that you instantly have an account at the new site. No need to go through a new account creation or email verification process. Pretty cool, huh?</p>
<h2>How Do I Use It?</h2>
<p>The simplest way to get started with OpenID is to use a widget like the one provided by <a href="www.rpxnow.com" target="_blank">RPX Now</a>. It’s free for basic use and lets you choose up to six “providers” (Google, Yahoo, etc).</p>
<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/03/rpxnow.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="rpxnow" border="0" alt="rpxnow" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/03/rpxnow-thumb.png" width="484" height="230" /></a> </p>
<p>To get going, you just go to <a href="http://www.rpxnow.com" target="_blank">RPX now</a> and create an account. Then they walk you through the following three steps:</p>
<ol>
<li><strong>Generate Widget Code: </strong>RPX provides you with the code for a simple iFrame that displays their widget inline on your page.&#160; It’s used to let the user select their provider in a user-friendly format.</li>
<li><strong>Receive Tokens: </strong>After the user has been authenticated on their favorite site, you will receive a token value. You use that token to make auth_info call and retrieve more data (email, username, etc) about the user. RPX provides you with sample code to do this in a variety of languages.</li>
<li><strong>Choose Providers: </strong>On the RPX site, you can choose which providers (Yahoo, Facebook, Google, etc) that you’d like their widget to display.</li>
</ol>
<p>After that, you’re done!&#160; I’m hoping to see more sites start utilizing openID so I can stop having to remember so many usernames and passwords.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/03/06/getting-started-with-openid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>5 Things That ASP.NET Developers Would Love about Ruby on Rails</title>
		<link>http://www.bryanthankins.com/techblog/2010/02/23/5-things-that-aspnet-developers-would-love-about-ruby-on-rails/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/02/23/5-things-that-aspnet-developers-would-love-about-ruby-on-rails/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 04:29:01 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/02/23/5-things-that-aspnet-developers-would-love-about-ruby-on-rails/</guid>
		<description><![CDATA[ 
I’m a longtime ASP.NET developer, and indeed that’s how I’ve made my professional living for many years now, but I have to say there is a lot to love about Ruby on Rails.    There’s a simplicity and common sense approach that I really like. 
I think other ASP.NET developers would enjoy [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/nettorails.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="NetToRails" border="0" alt="NetToRails" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/nettorails-thumb.jpg" width="392" height="251" /></a> </p>
<p>I’m a longtime ASP.NET developer, and indeed that’s how I’ve made my professional living for many years now, but I have to say there is a lot to love about Ruby on Rails.    <br />There’s a simplicity and common sense approach that I really like. </p>
<p>I think other ASP.NET developers would enjoy certain aspects of Rails as well, so I put together a list of my 5 favorite things (in no particular order):</p>
<h2>1) Migrations</h2>
<p>If you’re like me, you really don’t like writing database change scripts in SQL. Wouldn’t it be nice if you could write the scripts in your favorite programming language rather than resorting to T-SQL? Well, with rails migrations you can!</p>
<p>You write your schema changes as a ruby class (or even generate them) and run it at the database to modify your schema. For example, to create a posts table, on the command line just type:</p>
<p>$ script/generate model Post name:string content:text</p>
<p>This will automatically generate the required class for you which looks like this:</p>
<pre class="brush: ruby;">class CreatePosts &lt; ActiveRecord::Migration
  def self.up
    create_table :posts do |t|
      t.string :name
      t.string :title
      t.text :content

      t.timestamps
    end
  end

  def self.down
    drop_table :posts
  end
end</pre>
<p>Then you just run “rake db:migrate” at the command line and your table is created. The framework even keeps track of which migrations have been run and versions them all so you can roll back to previous DB versions at any time. </p>
<h2>2) Active Record</h2>
<p>I love how active record does not force you to model out all your fields as properties. You simply build your table with migrations and then create a class of the same name that derives from ActiveRecord and Rails figures out the rest. No config files to set up or angle brackets to mess with.</p>
<p>It adds all the properties based on the table columns and a bunch of helper methods for finding records and working with the dataset, but your code is as simple as this:</p>
<pre class="brush: ruby;">class Post &lt; ActiveRecord::Base
end</pre>
<h2>3) Opinionated</h2>
<p>With Rails a lot of decisions are made for you and that’s a good thing! Instead of endlessly debating which of the 10 ORMs to use for your data layer, you just use Active Record because that’s what’s built-in out of the box and works for 90% of the cases. </p>
<p>Rails has a specific way of doing things, and if you buy into it, you can let the framework take care of a lot of the little details for you.</p>
<h2>4) Lightweight</h2>
<p>There’s something wonderful about not having to fire up a huge IDE to do development. Just launch your favorite text editor and start writing code. My personal preference for writing Rails code on windows is the <a href="http://www.e-texteditor.com/" target="_blank">E-TextEditor</a> (which is modeled after <a href="http://macromates.com/" target="_blank">TextMate</a>), but I could just as easily use <a href="http://notepad-plus.sourceforge.net/uk/site.htm" target="_blank">notepad++.</a>&#160;</p>
<p>This simply would not be possible with ASP.NET as there are just too many frameworks and libraries to deal with as well as just a lot of code to write that you almost need the IDE’s help to sort them all out. Not to mention, you need the IDE to compile your code (or the cmd line with hundreds of switches) which is not necessary in the the interpreted world of Ruby. The code and run cycle is almost instantaneous.</p>
<h2>5) Less Code</h2>
<p>After porting an ASP.NET MVC app to rails I was amazed with how little code it took in rails. The rails version was only about 25% of the code that was required for the ASP.NET MVC version.So, how is that possible?</p>
<p>Much of this is due to Active Record and the fact that I didn’t have to write any DB connector code, but also Ruby’s terse syntax and lack of strong typing just means that the amount of code you write is much less.</p>
<p>For example, a typical controller method in Rails looks like this:</p>
<pre class="brush: ruby;">  def show
     @post = Post.find(params[:post_id])
  end</pre>
<p>And then @post is automatically visible in the corresponding view. Nice and elegant – the way coding should be.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/02/23/5-things-that-aspnet-developers-would-love-about-ruby-on-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Can Programming be Art?</title>
		<link>http://www.bryanthankins.com/techblog/2010/02/14/can-programming-be-art/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/02/14/can-programming-be-art/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 03:06:03 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/02/14/can-programming-be-art/</guid>
		<description><![CDATA[ 
Lately I’ve been reading Seth Godin’s Linchpin. It’s an excellent book and the key point is that your work should be a platform for art:
Art [in this context] is a personal act of courage, something one human does that creates change in another. &#8230; I think it&#8217;s art when a great customer service person [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/image-thumb.png" width="351" height="264" /></a> </p>
<p>Lately I’ve been reading <a href="http://sethgodin.typepad.com/" target="_blank">Seth Godin’s</a> <a href="http://www.amazon.com/Linchpin-Are-Indispensable-Seth-Godin/dp/1591843162" target="_blank">Linchpin</a>. It’s an excellent book and the key point is that your work should be a platform for art:</p>
<blockquote><p>Art [in this context] is a personal act of courage, something one human does that creates change in another. &#8230; I think it&#8217;s art when a great customer service person uses a conversation to convert an angry person into a raving fan. And it&#8217;s art when Craig Newmark invents a new business model that uses the Internet to revolutionize classifieds.&quot; &#8230;</p>
</blockquote>
<p>Godin really expands the traditional definition of “art”; It doesn’t have to just be a painting that you hang on a wall, but it’s something that you create which <em><strong>directly impacts another in a dramatic and positive way.</strong></em></p>
<p>Given that I’m a programmer, It makes me wonder in what ways programming and it’s output can be considered art&#8211; Is twitter art? What about facebook? </p>
<p>According to Godin, both of those sites would be art. They are unique and they have profoundly impacted people (as opposed to most software).</p>
<p>So a software product can be art, but what about an individual piece of code. Can that be art? </p>
<p>Obviously, <a href="http://oreilly.com/" target="_blank">O’Reilly</a> thinks so given that they’ve published a book on the topic of <a href="http://oreilly.com/catalog/9780596510046" target="_blank">beautiful code</a>. I have to agree that some code and frameworks (eg - jQuery and Rails).are so elegant and&#160; well-written that they are a true joy to work with.</p>
<p>It seems odd at first to be to lump programmers in with artists. Aren’t they two totally different types of people – one left-brained and the other right-brained? Yet, in many ways, they’re closer than you think. </p>
<h2>Hackers and Painters</h2>
<p>Paul Graham nailed this strange dichotomy in his classic essay entitled <a href="http://www.paulgraham.com/hp.html" target="_blank">Hackers and Painters</a>:</p>
<blockquote><p>Hacking and painting have a lot in common. In fact, of all the different types of people I&#8217;ve known, hackers and painters are among the most alike.</p>
<p>What hackers and painters have in common is that they&#8217;re both makers. Along with composers, architects, and writers, what hackers and painters are trying to do is make good things. They&#8217;re not doing research per se, though if in the course of trying to make good things they discover some new technique, so much the better.</p>
</blockquote>
<p>At the end of the day, both are craftsman. </p>
<p>I can appreciate this more than most because I actually studied art and computer science in school. Both held great appeal for me and most likely for similar reasons:<em><strong>They both allow you to perform solitary acts of creation</strong></em>.</p>
<h2>Software Craftsmanship</h2>
<p>In fact, there’s a powerful new movement in software focusing on craftsmanship – they even have their own <a href="http://manifesto.softwarecraftsmanship.org/" target="_blank">manifesto</a>:</p>
<blockquote><p>As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value:</p>
<p>Not only working software, but also well-crafted software       <br />Not only responding to change, but also steadily adding value       <br />Not only individuals and interactions, but also a community of professionals       <br />Not only customer collaboration, but also productive partnerships </p>
</blockquote>
<p>This movement is largely a reaction to offshoring and businesses trying to treat software developers as replaceable cogs. The movement focuses more on individuals and their specific skills. These software craftsmen <strong><em>strive to create not just software that meets spec, but hand-crafted pieces of art. </em></strong></p>
<p>Seth Godin would be proud.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/02/14/can-programming-be-art/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Is it Time to Join the NoSQL Movement?</title>
		<link>http://www.bryanthankins.com/techblog/2010/02/08/is-it-time-to-join-the-nosql-movement/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/02/08/is-it-time-to-join-the-nosql-movement/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 03:40:06 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/02/08/is-it-time-to-join-the-nosql-movement/</guid>
		<description><![CDATA[ Photo Credits: James Fee
The Battle Cry
There’s a new revolution brewing in the software industry, and it goes something like this…
For too long software developers have been oppressed by the tyranny of relational database! Are they really the right tool for every job? Should we really have to map our OO code to a relational [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/nosqlteaparty.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="no-sql-tea-party" border="0" alt="no-sql-tea-party" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/nosqlteaparty-thumb.jpg" width="490" height="294" /></a> <span style="font-size: 0.75em">Photo Credits: <a href="http://www.spatiallyadjusted.com/2009/07/06/here-comes-the-anti-database-movement/"><font size="1">James Fee</font></a></span></p>
<h2>The Battle Cry</h2>
<p>There’s a new revolution brewing in the software industry, and it goes something like this…</p>
<blockquote><p>For too long software developers have been oppressed by the tyranny of relational database! Are they really the right tool for <em>every</em> job? Should we really have to map our OO code to a relational DB?</p>
<p><em>Now the time has come to throw off those shackles and enter the free world of NoSQL! <strong>Who’s with me</strong>?…&lt;sound of crickets chirping&gt;</em></p>
</blockquote>
<p>Ok. So maybe people aren’t <em>quite</em> ready to join the revolution yet, but let’s dig into this new movement and understand what it it.</p>
<h2>What is it?</h2>
<p>According to Wikipedia, NoSQL is:</p>
<blockquote><p>an umbrella term for a loosely defined class of non-<a href="http://en.wikipedia.org/wiki/Relational_model">relational</a> data stores that break with a long history of relational databases and <a href="http://en.wikipedia.org/wiki/ACID">ACID</a> guarantees. Data stores that fall under this term may not require fixed table schemas, and usually avoid <a href="http://en.wikipedia.org/wiki/Join_(SQL)">join</a> operations. The term was first popularised in early 2009.</p>
</blockquote>
<p>In other words, it’s <em>not:</em> SQL Server, mySQL or Oracle &#8212; the leading relational database engines in the market. </p>
<p>By contrast, NoSql databases usually involve persisting objects to the database through key-value pairs, XML and/or JSON. They are often called document databases or object-oriented databases. </p>
<p>The benefits are primarily two-fold:</p>
<ul>
<li><strong>Developer Efficiency: </strong>Because you don’t need to map your objects to database tables, the classic <a href="http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch" target="_blank">object-relational impedance mismatch is gone</a>. This allows developers to simply focus on building their objects persisting them to the database as is. </li>
<li><strong>Database Performance: </strong>When you have a database that is nothing but key-value pair lookups it becomes lightning fast which is why NoSQL databases are used by the largest websites out there like: Facebook (<a href="http://incubator.apache.org/cassandra/">Cassandra</a>), Amazon (<a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo</a>) &amp; Google (<a href="http://labs.google.com/papers/bigtable.html">BigTable</a>) </li>
</ul>
<p>So if you’re convinced that NoSQL is the wave of the future, here’s how you get started.</p>
<h2>How Do I Get Started?</h2>
<p>The first choice you have to make is which NoSQL DB you’d like to use. From what I’ve read, here are the most common options:</p>
<ul>
<li><strong><a href="http://www.mongodb.org/display/DOCS/Home" target="_blank">MongoDB</a>:</strong> From the MongoDB site:”MongoDB (from &quot;humongous&quot;) is a scalable, high-performance, open source, schema-free, document-oriented database. Written in C++”. MongoDB seems to be a good choice if you are working in rails because of a MongoMapper which makes it easy to plug rails code into a MongoDB. There are also a series of <a href="http://www.tekpub.com/preview/byob-rails" target="_blank">Tekpub screencasts for using MongoDB with Rails</a> </li>
<li><strong><a href="http://couchdb.apache.org/" target="_blank">CouchDB</a>: </strong>From the CouchDB site: “CouchDB is a document-oriented database…[that] provides a RESTful JSON API than can be accessed from any environment that allows HTTP requests.” It does seem like CouchDB is not ready for production yet and most people are just experimenting with it at this point. </li>
<li><a href="http://www.db4o.com/" target="_blank"><strong>DB40</strong></a><strong>: </strong>From the DB40 site: “db4o is the open source <a href="http://www.db4o.com/s/objectdb.aspx">object-oriented database</a> that enables Java and .NET developers to store and retrieve any application object with only one line of code, eliminating the need to predefine or maintain a separate, rigid data model.” DB40 does seem to be production ready (it even supports LINQ) and Rob Conery has a <a href="http://blog.wekeroad.com/blog/crazy-talk-reducing-orm-friction/" target="_blank">great series of articles on getting started with it in .NET</a> </li>
</ul>
<p>Does the NoSql movement have legs or is it just the most recent shiny object for developers to talk about? </p>
<p>I don’t know, but I like the idea of looking at new options for database engines, and plan to try them out in some test projects. I think we’re still at a point where we spend far to much time writing CRUD code. Maybe NoSql DBs can solve that?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/02/08/is-it-time-to-join-the-nosql-movement/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What’s the Value of Software Documentation?</title>
		<link>http://www.bryanthankins.com/techblog/2010/02/03/whats-the-value-of-software-documentation/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/02/03/whats-the-value-of-software-documentation/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 03:44:05 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/02/03/whats-the-value-of-software-documentation/</guid>
		<description><![CDATA[ 
There was an interesting debate on the Stack Overflow podcast regarding the value of software documentation. On one hand, organizations always think they need more of it. On the other hand, programmers typically hate writing it and usually think it’s worthless. 
Who’s right?
The Problems with Docs
The real problems with software documentation for large internal [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/documentation.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="documentation" border="0" alt="documentation" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/documentation-thumb.jpg" width="281" height="335" /></a> </p>
<p>There was an interesting debate on the <a href="http://blog.stackoverflow.com/2010/01/podcast-80/" target="_blank">Stack Overflow podcast</a> regarding the value of software documentation. On one hand, organizations always think they need more of it. On the other hand, programmers typically hate writing it and usually think it’s worthless. </p>
<p>Who’s right?</p>
<h2>The Problems with Docs</h2>
<p>The real problems with software documentation for large internal applications is threefold:</p>
<ul>
<li><strong>Small Audience</strong>: You may write the most beautifully detailed document in the world, but odds are it will only be skimmed and never actually read. As we all know from Steve Jobs famous quote “No one reads anymore”.&#160; If people don’t read normal books by popular authors, are they really going to read your dry 20-page detailed software doc? </li>
<li><strong>Already Obsolete</strong>: When programmers start new projects, they typically don’t read the documents because they assume they are obsolete, and most of the time they’re correct. By the time the massive doc is finished, the software has often already changed by 20% and the screenshots need to redone. </li>
<li><strong>Great Programmer != Great Writer: </strong>Great programming and great writing do not necessarily go hand in hand. <em>In fact, some people get into programming so that don’t have to communicate with anything other than a compiler</em>. There’s nothing wrong with that, but don’t expect your programmer to write the clearest software documentation. </li>
</ul>
<p>So, given that we’re up against all of this, is there any hope for software documentation?</p>
<h2>The Bare Minimum</h2>
<p>There are some types of documentation that add real value to a project. Let me list those and then talk about style:</p>
<ul>
<li><strong>Scope Doc: </strong>In some form, you need to document what you’re going to build. Now, I’m not advocating a 200-page waterfall-style spec doc. But I’m saying that everyone has to be on the same page with what is being built and a scope doc is the best way to do that. Mockups using something like <a href="http://www.balsamiq.com/" target="_blank">balsamiq</a> are a nice touch in a scope doc as well. Spolsky has the <a href="http://www.joelonsoftware.com/articles/fog0000000036.html" target="_blank">canonical post on writing scope docs.</a> </li>
<li><strong>Install Guide: </strong>The install guide has two functions: 1) It tells new developers what they need to install to get the project running, and begin development on it 2) It also helps the IT staff know how to rebuild the app if the server dies. This doc would typically include items like location of source control code and third party apps to install. </li>
<li><strike><strong>User Guide</strong></strike> <strong>Inline Help: </strong>Instead of a user guide that no one will read, implement some sort of inline help in your software application that appears right where the user needs it and helps them understand their specific problem. </li>
</ul>
<p>For each of these docs, <em><strong>they need to be light: 5 pages or less, and heavy on bullet points, images and sub headings</strong></em>. The bottom line is that people don’t read anymore; they skim and software docs need to accommodate this fact.</p>
<blockquote><p>Rule 1 of writing software for nontechnical users is this: if they have to read documentation to use it you designed it wrong.&#160;&#160; </p>
<p>&#8211;Eric S. Raymond</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/02/03/whats-the-value-of-software-documentation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>5 Tips for Getting Started With LINQ</title>
		<link>http://www.bryanthankins.com/techblog/2010/02/02/5-tips-for-getting-started-with-linq/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/02/02/5-tips-for-getting-started-with-linq/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 14:40:37 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/?p=205</guid>
		<description><![CDATA[ 
Photo by Matti Mattila
Recently, I’ve had the opportunity to actually begin using Microsoft’s LINQ (language-integrated query) in a few “real” projects. So I’ve tried to spend some time actually understanding it rather than just copying examples.
Throughout this process I’ve gleaned a few key concepts:
1. Determine which LINQ you will use
One of the confusing aspects [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/link.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="link" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/02/link-thumb.jpg" border="0" alt="link" width="442" height="332" /> </a><br />
<span style="font-size: 0.75em">Photo by <a href="http://www.flickr.com/photos/mattimattila/4001221570/sizes/m/" target="_blank">Matti Mattila</a></span></p>
<p>Recently, I’ve had the opportunity to actually begin using Microsoft’s <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a> (language-integrated query) in a few “real” projects. So I’ve tried to spend some time actually understanding it rather than just copying examples.</p>
<p>Throughout this process I’ve gleaned a few key concepts:</p>
<h2>1. Determine which LINQ you will use</h2>
<p>One of the confusing aspects of LINQ is that it comes in five flavors:</p>
<ul>
<li><strong>LINQ to XML:</strong> Used to query XML documents. Can be used in place of XPath or DOM manipulation.</li>
<li><strong>LINQ to Objects: </strong>Used to query object collections. Can be used instead of looping through the collection.</li>
<li><strong>LINQ to SQL: </strong>Basically an ORM (Object-Relational Mapper) used to map classes to DB tables and query them in code. Can be used in place of another ORM.</li>
<li><strong>LINQ to Dataset: </strong>Used to query datasets. Can be used instead of looping through a dataset or using the filter method.</li>
<li><strong>LINQ to Entities: </strong>Used to query conceptual database models rather than the strict table to class model that LINQ to SQL uses. Based around Microsoft’s Entity Framework.</li>
</ul>
<p>Once you know which one you’re after, it makes looking online for examples much easier.</p>
<h2>2. It’s all Extension Methods on IEnumerable</h2>
<p>Here is the key thing to know about LINQ. <em><strong>It’s primarily a set of extension methods to IEnumerable</strong></em>. Extension methods allow you to add new methods to existing classes.</p>
<p>So if you want to start using LINQ just add a reference to System.LINQ and look at the intellisense on an object that implements IEnumerable. You’ll see a bunch of new methods like: Where, Order By, and Select. These are the core LINQ methods.</p>
<h2>3. Prefer the Method Syntax over the Query Syntax</h2>
<p>LINQ let’s you write queries using two different methods – the method (or dot) syntax and the query syntax. Here is an example of both:</p>
<pre class="brush: csharp;" style="width: 664px; height: 211px;">     //Query Syntax
       var queue = from q in dc.SomeTable
               where q.SomeDate &lt;= DateTime.Now
               orderby (q.Priority, q.TimeCreated)
               select q;
   //Method Syntax
        var queue2 = dc.SomeTable
             .Where( q =&gt; q.SomeDate &lt;= DateTime.Now)
             .OrderBy(q =&gt; q.Priority)
             .ThenBy(q =&gt; q.TimeCreated);</pre>
<p>When starting out, <em><strong>I think it’s MUCH easier to begin with the method syntax</strong></em>. It just makes more sense to a seasoned .NET developer and it doesn’t get confused with long-held SQL knowledge.</p>
<p>At the end of the day, the query syntax gets compiled into the method syntax anyway.</p>
<h2>4. Understand Deferred Execution</h2>
<p>In LINQ query execution is usually deferred until you request the data. So, consider the following example from <a href="http://weblogs.asp.net/psteele/archive/2008/04/18/linq-deferred-execution.aspx" target="_blank">Patrick Steele</a>:</p>
<pre class="brush: csharp;">  string firstLetter = "B";
   //Query NOT run here
   var query = from c in customers
               where c.Name.StartsWith(firstLetter)
               select c;

   firstLetter = "J";
   //Query actually executes here
   foreach (Customer c in query)
   {
       Console.WriteLine(c.Name);
   }</pre>
<p><strong><em>The query doesn’t get executed until it is actually used</em></strong> – in this case in the foreach. The implications are that the “J” filter is applied to the above code rather than the “B” filter.</p>
<h2>5. Learn Lambda Syntax</h2>
<p>You can’t get away from Lambdas if you use LINQ. Basically anytime you use the “Where” statement you will need to use a Lambda. <em><strong>A lambda is just a fancy name for an inline function with a specific syntax. </strong></em>You’ll know that you need to use a Lambda, if you see “Func” in intellisense. Here is an example of a lambda:</p>
<pre class="brush: csharp;"> .Where( q =&gt; q.SomeDate &lt;= DateTime.Now &amp;&amp; q.Locked != true )</pre>
<p>This snippet says that q (which is just an arbitrary parameter) should be filtered by the SomeDate and Locked properties. It is equivalent to a function that takes a parameter called q and applies the filter. The only difference is that it’s all written inline.</p>
<p>I hope these five tips help you in your journey to use and understand LINQ!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/02/02/5-tips-for-getting-started-with-linq/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using VS.NET Key Commands in MonoDevelop on the Mac</title>
		<link>http://www.bryanthankins.com/techblog/2010/01/29/using-vsnet-key-commands-in-monodevelop-on-the-mac/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/01/29/using-vsnet-key-commands-in-monodevelop-on-the-mac/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 13:46:40 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/01/29/using-vsnet-key-commands-in-monodevelop-on-the-mac/</guid>
		<description><![CDATA[ 
One of the more frustrating aspects about switching to MonoDevelop on the Mac after many years of developing with Visual Studio on the PC is the key commands. We all know that programmers are typists first, and programmers second so I’ve spent a good amount of time learning to do everything with the keyboard [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/optimuskeyboard-300.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="optimus-keyboard_300" border="0" alt="optimus-keyboard_300" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/optimuskeyboard-300-thumb.jpg" width="244" height="244" /></a> </p>
<p>One of the more frustrating aspects about switching to <a href="http://monodevelop.com/Download" target="_blank">MonoDevelop on the Mac</a> after many years of developing with Visual Studio on the PC is the key commands. We all know that <a href="http://www.codinghorror.com/blog/archives/001188.html" target="_blank">programmers are typists first, and programmers second</a> so I’ve spent a good amount of time learning to do everything with the keyboard rather than the mouse.</p>
<p>The problem is I’m now hardwired to hit certain commands (ctrl+shift+b) when developing and it’s tough to fight that muscle memory. When I started using MonoDevelop, I would unconsciously start hitting the same key commands only to see them fail in various crazy ways. </p>
<p><em><strong>Let me be clear that many of these issues are due more to how the Mac works than anything that MonoDevelop is doing. </strong></em>With that caveat in mind, here are some tips to get MonoDevelop on the Mac to behave a little more like Visual Studio.</p>
<h2>Take Command</h2>
<p>The very first change you will want to make is map your keyboard control key to the mac command key. This will make simple actions like copy (ctrl+c) and paste (ctrl+v) work like a PC user expects. You can put it back to “normal” by using the following tip:</p>
<blockquote><p><strong>Tip: </strong>Go to System Preferences &gt; Keyboard &amp; Mouse &gt; Keyboard &gt; Modifier Keys &gt; swap the Command and Option keys.</p>
</blockquote>
<h2>Go Home</h2>
<p>In VS.NET, I am forever pressing Shift + End or Shift + Home to select entire lines. Not having the Home and End buttons working on the Mac is a cardinal sin in my depraved PC mind. This one took some research to solve because there is no built-in solution. Luckily, there is a third party program that can help:</p>
<blockquote><p><strong>Tip: </strong><a href="http://doublecommand.sourceforge.net/" target="_blank">DoubleCommand</a> is a free program that you can download on your Mac which allows you to configure your Home and End keys by setting “PC Style Home and End keys” on the dialog.</p>
</blockquote>
<h2>Bind Your Own</h2>
<p>One awesome feature of MonoDevelop 2.2 is that it allows you to set the key bindings to whatever you like. For example, I’ve set ctrl+L to delete a line like it does in VS.NET since I use that command all the time. By default it executes “Go to line” in MonoDevelop, but it’s a great feature to be able to set your own key commands.</p>
<blockquote><p><strong>Tip: </strong>Under the MonoDevelop-&gt;Preferences menu, go to Key Bindings and set the keys to whatever you’re most comfortable with.</p>
</blockquote>
<h2>The Nuclear Option</h2>
<p>If it’s all just too overwhelming for you. There is a small faction of the MonoTouch community that is pioneering the ability to open MonoTouch solutions inside VS.NET on the PC. </p>
<p><a href="http://manniat.pp-p.net/" target="_blank">ManniAT</a> has even created a <a href="http://manniat.pp-p.net/blog/post/2009/11/18/MonoTouch-in-Visual-Studio.aspx" target="_blank">stand-alone converter</a> that you can use to open MonoTouch projects in VS.NET. It’s not quite there yet because you can’t compile on the PC, but he’s getting there. I actually used this solution to do some simple MonoTouch dev on my PC and it worked pretty well.</p>
<blockquote><p><strong>Tip</strong>: Open MonoTouch projects in VS.NET by using <a href="http://manniat.pp-p.net/blog/post/2009/11/18/MonoTouch-in-Visual-Studio.aspx" target="_blank">ManniAT’s converter</a>.</p>
</blockquote>
<h2>Nirvana</h2>
<p>The ultimate solution would be for someone to put together some VS.NET-like key bindings in a file that you can import into MonoDevelop. I haven’t been able to find this yet, and I’m not even sure if you can import key bindings into MonoDevelop, but I’ll cross my fingers because you never know what the Mono team or community will come up with next!</p>
<blockquote><p>“I was trying to figure out which is the most important computer science course a CS student could ever take, and eventually realized it&#8217;s Typing 101. </p>
<p>The really great engineers I know, the ones who build great things, they can type.”</p>
<p>- Steve Yegge</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/01/29/using-vsnet-key-commands-in-monodevelop-on-the-mac/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Chrome – Now with Extensions!</title>
		<link>http://www.bryanthankins.com/techblog/2010/01/25/google-chrome-now-with-extensions/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/01/25/google-chrome-now-with-extensions/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 03:55:07 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/01/25/google-chrome-now-with-extensions/</guid>
		<description><![CDATA[
 
Google Chrome has reached a turning point. In the past, I’ve liked the speed and simplicity of Chrome, but never enough to discard my beloved Firefox. Why? Well, as everyone knows, it’s all about the extensions!
Extensions
I just couldn’t part with AdBlock Plus and Firebug for Firefox. But that’s all changed with the release of [...]]]></description>
			<content:encoded><![CDATA[</p>
<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/chromelogoelements.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="chrome-logo-elements" border="0" alt="chrome-logo-elements" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/chromelogoelements-thumb.png" width="370" height="307" /></a> </p>
<p>Google Chrome has reached a turning point. In the past, I’ve liked the speed and simplicity of Chrome, but never enough to discard my beloved Firefox. Why? Well, <em><strong>as everyone knows, it’s </strong></em><a href="http://www.bryanthankins.com/techblog/2009/06/29/its-all-about-the-apps/" target="_blank"><em><strong>all about the extensions</strong></em></a>!</p>
<h2>Extensions</h2>
<p>I just couldn’t part with AdBlock Plus and Firebug for Firefox. But that’s all changed with the release of <a href="http://www.google.com/landing/chrome/beta/" target="_blank">Google Chrome 4 Beta</a>. <em><strong>Chrome now supports extensions</strong></em>, and out of the gate it has the ones I need:</p>
<ul>
<li><a href="https://chrome.google.com/extensions/detail/gighmmpiobklfepjocnamgkkbiglidom" target="_blank"><strong>AdBlock</strong></a>: The web is a much different (and better) place without ads. Ad Block takes you to that happy web by obliterating nearly all inline, flashing and dreaded pop in-front ads.</li>
<li><a href="https://chrome.google.com/extensions/detail/hehijbfgiekmjfkfjpbkbammjbdenadd" target="_blank"><strong>IE Tab</strong></a>: I frequently use Outlook Web Access (OWA) for checking email and it’s optimized for IE. The interface is totally different if you use any other browser so I like to have the ability to switch to IE rendering inline.</li>
</ul>
<h2>Developer Tools</h2>
<p>Another requirement of any browser that I commit to is a developer toolbar such as Firebug for Firefox or the <a href="http://msdn.microsoft.com/en-us/library/dd565628(VS.85).aspx" target="_blank">IE 8 Developer Tools</a>. These tools let you trace CSS styles, debug JavaScript and generally make a web developers life much easier. </p>
<p>Chrome <em><strong>now supports its own built-in set of Developer tools</strong></em>. They are somewhat hidden, but can be summoned by pressing Ctrl+Shift+J. It looks similar to the developer toolsets built into the other browsers.</p>
<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/image-thumb1.png" width="494" height="349" /></a> </p>
<h2>Blazing Speed</h2>
<p>Finally, the best feature of Chrome is its speed. As Jeff Atwood often says, “<a href="http://www.codinghorror.com/blog/archives/000722.html" target="_blank">Speed is a feature</a>”: </p>
<blockquote><p>Maybe I&#8217;m just impatient. However, there&#8217;s a lot of concrete data to support the theory that <b>unless you make it load fast, nobody will stick around long enough to find out what you have to offer</b>. For instance, <a href="http://www.akamai.com/html/about/press/releases/2006/press_110606.html">a recent study</a> found that most shoppers will only wait four seconds for a page to load before abandoning the site entirely.</p>
</blockquote>
<p>To me Chrome feels faster than Firefox and IE in nearly every way – from cold startup to page browsing. It’s obvious that Google has been doing some heavy optimization.</p>
<p>I also like the sheer simplicity of Google Chrome (ie – one box for searching or typing URLs). Will it win out in the end? Who knows, but now that it has extensions I’m trying it as my main browser. What about you?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/01/25/google-chrome-now-with-extensions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Home Backup Smackdown!: Time Machine vs Carbonite vs iDrive</title>
		<link>http://www.bryanthankins.com/techblog/2010/01/23/home-backup-smackdown-time-machine-vs-carbonite-vs-idrive/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/01/23/home-backup-smackdown-time-machine-vs-carbonite-vs-idrive/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 01:22:03 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/01/23/home-backup-smackdown-time-machine-vs-carbonite-vs-idrive/</guid>
		<description><![CDATA[Home backup systems are the ugly step-child of technology. No one likes to talk about them or think about them, but they’re still an important part of the family. In fact, they’re becoming even more important as families store all of their digital memories or writing on their computers. 
It’s getting to the point where [...]]]></description>
			<content:encoded><![CDATA[<p>Home backup systems are the ugly step-child of technology. No one likes to talk about them or think about them, but they’re still an important part of the family. In fact, they’re becoming even more important as families store all of their digital memories <a href="http://www.codinghorror.com/blog/archives/001315.html" target="_blank">or writing</a> on their computers. </p>
<p>It’s getting to the point where I don’t even get prints of pictures anymore and just assume that I’ll store and share them digitally. So if a hard drive goes, there go all my memories…</p>
<p>So what’s a home user to do? Backups of course!</p>
<p>Once you decide that backups are a good idea, you have to decide which backup solution you’d like to use. Hopefully, I can help with that because it seems like I’ve tried them all…. </p>
<h2>The Brute Force Method </h2>
<p>The simplest and cheapest option would just be to regularly burn DVDs or even better regularly copy the data to an external USB drive. This was the very first back method that I used back in the day. </p>
<p>The problem is that it is an extremely manual process and there’s a certain amount of weight that hangs over your head because you have to remember to do those annoying backups. </p>
<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/621pxdvd.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="621px-DVD" border="0" alt="621px-DVD" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/621pxdvd-thumb.png" width="159" height="153" /></a></p>
<p>The bottom line is that I would not recommend this approach any more as there are many better options. Computers are supposed to automate this stuff. Right?</p>
<h2>Where’s my Time Machine?</h2>
<p>If you are lucky enough to have a Mac, backup is relatively easy and built-in. You just plug in a USB drive and all the sudden this nifty program called <a href="http://www.apple.com/macosx/what-is-macosx/time-machine.html" target="_blank">Time Machine</a> just starts using it to regularly backup your machine. </p>
<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/20090329timemachinestep1.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="20090329time-machine-step-1" border="0" alt="20090329time-machine-step-1" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/20090329timemachinestep1-thumb.gif" width="455" height="319" /></a> </p>
<p>The best aspect of time machine is that it’s built-in to OS X and it’s all very seamless. You just don’t have to think about it.</p>
<p>This is a great option if you have a Mac. For example, we have Macs and PCs at home, but we copy all of our photos to the Mac and let time machine back them up to an external USB drive.</p>
<p>Frankly, I wish the PC had an option as simple and intuitive as Time Machine, but sadly it does not so If you’re a PC user, read on…</p>
<h2>Trapped in Carbonite!</h2>
<p><a href="http://www.carbonite.com/" target="_blank">Carbonite</a> is probably the best-known online home backup system. The way it works is you install an application on your machine that runs in the background and backs up your system to their online data storage. </p>
<p>They have plans for around $50/year so it’s affordable for the average home user. In theory this is great idea because you can set it and forget it. And you get the added benefit of having your data backed up offsite, so if your house burns down your priceless family photos are still safe. What could go wrong? </p>
<p>After using Carbonite myself for about six months, I have two problems with the service. The first is that backing up lots of large files over the internet can be very slow. Now your mileage may vary depending on your internet speed and the amount of stuff you want to backup and this is true of any online backup.</p>
<p>But, by far, the biggest issue I had with Carbonite was that when a machine did fail, <em><strong>I wasn’t able to get my data back from Carbonite</strong></em>. I tried all of their restore options and their program just kept crashing. I even installed their program on fresh machine and logged into my account to no avail. It just kept crashing.</p>
<p>After trying to call them and waiting on hold forever, I finally gave up. <em><strong>My data was essentially trapped in Carbonite!</strong></em></p>
<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/hansolofrozenincarbonite-3.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="han-solo-frozen-in-carbonite_3" border="0" alt="han-solo-frozen-in-carbonite_3" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/hansolofrozenincarbonite-3-thumb.jpg" width="351" height="281" /></a> </p>
<p>This illustrates an important point of backup solutions. If you can’t restore your data, <em>then the </em><a href="http://www.joelonsoftware.com/items/2009/12/14.html" target="_blank"><em>backup is worthless</em></a>!</p>
<h2>iDrive (no it’s not an Apple product)</h2>
<p><a href="http://www.idrive.com" target="_blank">iDrive</a> works much like Carbonite in that it’s an online backup system with a monthly cost of roughly $50/year, but that’s where the similarities end.</p>
<p>First off, iDrive has <em><strong>a totally free version that lets you backup 2GB of data</strong></em>. This is a nice solution for folks who don’t have a ton of pictures to back up.</p>
<p>Secondly, iDrive has a <strong><em>great web interface for restoring files </em></strong>whereas Carbonite forces you to install their software before you can restore. This makes it MUCH easier to your data back.</p>
<p>Carbonite needed me to install their software before I could get my data back, and when their software kept crashing I was stuck. With iDrive, you can simply login to their site and grab the files you like &#8212; right from your browser. </p>
<p>That combination of easy “set it and forget it” along with simple restore options have me sold on iDrive. It’s what I currently use for my PCs.</p>
<h2>Others</h2>
<p>The above are the solutions that I’ve had personal experience with. I’ve also heard good things about Windows Home Server, but have yet to try it myself. Mainly because it requires a dedicated machine. It’s hard to pull the trigger on a $400 machine dedicated to backup. I think it’s probably overkill for the average home user. </p>
<p><a href="http://www.acronis.com/homecomputing/products/trueimage/" target="_blank">Acronis True Image</a> or even the built in Vista and Windows 7 imaging are also good options to consider. My only problem with these is that imaging often is beyond the average home user, and I typically end up buying a new machine when one crashes. An image requires the exact same hardware to be restored, so it doesn’t work if you end up buying a new machine.</p>
<h2>Conclusion</h2>
<p>If you have a Mac, the built-in Time Machine is an excellent solution for the regular home user. It’s extremely intuitive, and for the cost of a USB drive you are all set. Just remember that it requires a blank USB drive and provides no offsite protection.</p>
<p>For the PC, my choice is iDrive. It provides inexpensive, offsite backup and because it has a web interface, you can always get your files back from nearly anywhere.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/01/23/home-backup-smackdown-time-machine-vs-carbonite-vs-idrive/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MonoTouch Review: Porting an Obj-C App</title>
		<link>http://www.bryanthankins.com/techblog/2010/01/17/monotouch-review-porting-an-obj-c-app/</link>
		<comments>http://www.bryanthankins.com/techblog/2010/01/17/monotouch-review-porting-an-obj-c-app/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 19:19:01 +0000</pubDate>
		<dc:creator>Bryant</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.bryanthankins.com/techblog/2010/01/17/monotouch-review-porting-an-obj-c-app/</guid>
		<description><![CDATA[ 
Because Objective-C sometimes makes me want to poke out my eyes with sharp sticks, I’m relieved to see that there are finally other options. Now let me be clear. I think objective-C would be a fine language if it was something that I used day in and day out, but given that I only [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.bryanthankins.com/techblog/wp-content/uploads/2010/01/image-thumb.png" width="240" height="153" /></a> </p>
<p>Because Objective-C sometimes makes me want to poke out my eyes with sharp sticks, I’m relieved to see that there are finally other options. Now let me be clear. I think objective-C would be a <em>fine language </em>if it was something that I used day in and day out, but given that I only tinker in it and spend the majority of my time in .NET, I can’t help but see <a href="http://monotouch.net/" target="_blank">MonoTouch</a> as a godsend.</p>
<p>MonoTouch is a framework, created by the <a href="http://tirania.org/blog/" target="_blank">brilliant mono team at Novell</a>, that allows developers to use C# for coding iPhone apps. Not only have they ported the .NET framework to run on the iPhone, but they’ve bound it to the iPhone API. In addition, they provide a first class develop environment in the form of <a href="http://monodevelop.com/" target="_blank">MonoDevelop</a> on the Mac.</p>
<p>This brings up an important point. You still need a Mac to develop C# on the iPhone using MonoTouch. Luckily, I have my trusty Mac mini so I thought I’d take MonoTouch for a spin by porting my existing Objective-C app to MonoTouch.</p>
<h2>Background</h2>
<p>I developed an iPhone app in Objective-C over the summer and it was approved by Apple. It’s called <a href="http://www.bragvest.com/" target="_blank">BragVest</a> and allows Cub Scouts to track their progress toward ranks. It’s currently live in the app store and getting some great feedback from users. I have a lot of ideas for new features, but implementing them is a different story. </p>
<p>When coding in Objective-C, I spend too much time just looking up how to do simple operations. What’s the best way to load a plist? How should I best concatenate that string? Operations that should be simple and probably are to a Mac developer or someone who spends a lot of time with the language. </p>
<p>It’s a simple case of focusing on your strengths. I’m a professional .NET programmer and have been for a long time. I can crank out .NET code in my sleep, but <em><strong>programming in objective-C sometimes feels like I’m pushing a boulder up a hill</strong></em>. It just takes a lot longer to get a feature implemented and I spend a lot of time just looking up language features.</p>
<p>So, in theory, MonoTouch would be a great fit for me. I’ve already mostly learned a lot of the iPhone API, and now I get to use a language I know and love &#8212; C#. </p>
<p>At this point, I’m about 75% through porting my app to MonoTouch, and here’s what I’ve learned.</p>
<h2>The Good</h2>
<p>There’s a lot to enjoy about working with MonoTouch:</p>
<ul>
<li><strong>MonoDevelop</strong>: MonoDevelop feels much more like Visual Studio.NET (my native development environment) than XCode does. I spent many months in XCode and it just takes a different approach to development. MonoDevelop seems like it was modeled after VS.NET so I felt productive almost immediately.</li>
<li><strong>C# language</strong>: It’s great to have access to the C# language. It feels much more natural to me than Objective-C. I’m sure this is just a matter of experience, but the bulk of my experience is with C#. Also, I’m glad not to have to deal with memory management so I can focus on developing new features and not writing plumbing code.</li>
<li><strong>.NET Framework</strong>: Being able to access the .NET framework is huge, and probably one of the biggest selling points of MonoTouch. Need to parse a plist? <em>No longer do you have to resort to NSArrays and NSDictionaries. Just fire up LINQ to XML!</em> Need to do some fancy string parsing? Don’t use NSString. Just use the standard .NET string type. They also put a lot of thought into translating between the Apple and .NET APIs so it’s mostly seamless. If you need to see how a particular class or API was translated, check out the <a href="http://tirania.org/tmp/rosetta.html" target="_blank">MonoTouch Rosetta Stone</a>.</li>
</ul>
<h2>The Bad</h2>
<p>Most of the issues that I ran into have to do with the fact that this is still a very new platform:</p>
<ul>
<li><strong>Lack of Samples/Docs/Community</strong>: This was the hardest part of developing with MonoTouch. When I was working with the apple tools, if I wanted to know how to do something in Objective-C, I could generally google for it and quickly find an example. The blogs and docs are just starting to pop-up for MonoTouch so it can be much harder to find real-world examples.</li>
<li><strong>Stability</strong>: One of the most frustrating parts of developing in MonoTouch was that the IDE&#160; (MonoDevelop) would crash on me or throw strange exceptions periodically. It seems to mostly be related to the subversion integration so maybe if I disabled that I’d have more stability. That said, I have not seen any stability issues when the code is running on the phone so that’s what’s important.</li>
<li><strong>Not Fully Implemented</strong>: Every now and then, I would want to do something with MonoTouch and get a “Not Implemented Exception” (such as some LINQ features) or I couldn’t figure out how it was translated (such as NSMutableDictionary).</li>
</ul>
<p>Some people would also mention cost ($399), but I don’t think that’s fair. The mono team have put in an amazing amount of work that provides real value to developers. It’s only natural, that they should be compensated for it.</p>
<p>I also think the increased file size of MonoTouch app is small price to pay for all the features and frameworks you get.</p>
<h2>Verdict</h2>
<p>In my opinion, there is more than enough good to outweigh the bad in MonoTouch. I’m also hoping that much of the bad will disappear as the platform matures.</p>
<p>For an experienced .NET developer, it will give you a huge head start in iPhone development especially if C and memory management make you squeamish. That said, there is still a heavy learning curve with getting used to the Mac, the iPhone API, and Interface Builder. And MonoTouch does not eliminate the need to learn how to make a iPhone app that fits Apple’s design guidelines (which you will have to do to get it approved).</p>
<p>Overall, I’m planning to invest in it, and if you are an experienced .NET developer wanting to develop apps on an iPhone I would recommend you take a look as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthankins.com/techblog/2010/01/17/monotouch-review-porting-an-obj-c-app/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
