<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Matt McCormick &#187; software</title>
	<atom:link href="http://mattmccormick.ca/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://mattmccormick.ca</link>
	<description>Improving Software</description>
	<lastBuildDate>Fri, 03 Feb 2012 02:23:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to Refactor a PHP Application</title>
		<link>http://mattmccormick.ca/2011/10/13/how-to-refactor-a-php-application/</link>
		<comments>http://mattmccormick.ca/2011/10/13/how-to-refactor-a-php-application/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 22:33:07 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://mattmccormick.ca/?p=197</guid>
		<description><![CDATA[The great thing about PHP is how easy it is to get started. The bad thing about PHP is how easy it is to get started. I&#8217;ve worked on a few PHP sites where the code lived up to these statements. While it is incredibly easy to get a site up and running with PHP, [...]]]></description>
			<content:encoded><![CDATA[<p>The great thing about PHP is how easy it is to get started.</p>
<p>The bad thing about PHP is how easy it is to get started.</p>
<p>I&#8217;ve worked on a few PHP sites where the code lived up to these statements.  While it is incredibly easy to get a site up and running with PHP, that ease of getting started could turn into a nightmare as the site grows and becomes more complex.</p>
<p>When you&#8217;re faced with a site which has no separation of view code, business logic and model code, it can be daunting to figure out where to start.  Here is a simple list you can follow to keep from getting overwhelmed.</p>
<p><strong>1. Write PHPUnit Tests</strong></p>
<p>In Martin Fowler&#8217;s book on <a href="http://www.amazon.com/gp/product/0201485672/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=mattmccormick-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0201485672">Refactoring</a>, he proposes to always write tests before changing code.  It is an easy way to know that the output remains the same even if the underlying code has changed.  I think this is a great practice to follow, however, with a PHP site that may not necessarily be broken into neat, testable units, this may be a difficult process to follow.</p>
<p>Edit: Since I posted this, I came across the <a href="http://www.simpletest.org/">SimpleTest</a> testing framework which provides an excellent format for testing PHP applications by imitating the browser.</p>
<p><strong>2. Create models</strong></p>
<p>If you have MySQL queries mixed in with HTML code, the first thing I like to do is get that SQL outta there! SQL should only be seen inside model classes.  Each <code>mysql_query()</code> function should be replaced with a call to a model&#8217;s method for the table that is being accessed.  For example, if there is a statement like:</p>
<p><code>mysql_query("SELECT * FROM users WHERE id = $id");</code></p>
<p>I would create a Users.php class that can be used as a model for the users table.  Since the code above is needed quite often, it would be a good idea to have a parent class that the Users class can extend from which implements something like a <code>find_by_id()</code> method.</p>
<p>That would allow you to something like:</p>
<p><code>$users = new Users();<br />
$user = $users->find_by_id($id);<br />
</code></p>
<p>If the site isn&#8217;t using <a href="http://ca2.php.net/pdo">PDO</a>, this is also a good time to set that up.  There is no reason not to be using PDO these days.  It helps with security and Object-Oriented design while keeping queries cleaner.</p>
<p><strong>3. Consolidate duplicate code</strong></p>
<p>I&#8217;m a big fan of DRY &#8211; Don&#8217;t Repeat Yourself &#8211; and have worked many times with sites that have a lot of duplicated code.  After separating the models,  identify duplicated code and start separating that code into libraries.  Use a tool like <a href="https://github.com/sebastianbergmann/phpcpd" title="PHP Copy/Paste Detector">PHP Copy/Paste Detector</a> which can help identify duplicate code or just keep your eyes open for code that looks like you&#8217;ve come across it before.</p>
<p><strong>4. Separate views and controllers</strong></p>
<p>Once the model code is separated out, the view and controller code should be separated from each other.  In combination with the previous step, sometimes the header or footer HTML might be duplicated throughout the site.  It&#8217;s good to create a standard layout that contains the common HTML.  You might choose to use a templating tool like <a href="http://www.smarty.net" title="Smarty">Smarty</a> which can help to make sure PHP code stays outside of your templates and views.</p>
<p><strong>5. Clean up PHP errors and notices</strong></p>
<p>Make sure you have PHP <a href="http://php.net/manual/en/function.error-reporting.php">error_reporting</a> turned on to include all errors including Strict. (In PHP 5.4, E_STRICT will start to be included under E_ALL).  This can help you identify stray variables, deprecated code, non-existent array indexes and much more.  Cleaning up these errors and notices will make your application run smoother and can help reduce bugs.</p>
<p>Refactoring a whole PHP application can seem like a daunting task.  Depending on the size of the application, it&#8217;s not something that can be done overnight or even within several weeks.  It may take several months of minor, gradual improvements but the end result will be worth it.  You&#8217;ll be able to add new features quicker, reduce the number of bugs and increase your enjoyment while working on the application.</p>
<p>These steps may not all be applicable to your refactoring challenge but the key thing to keep in mind is to break down a large and complex refactoring job into a series of smaller parts and steps.</p>
<p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;count=none&amp;text=How%20to%20Refactor%20a%20PHP%20Application" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;count=none&amp;text=How%20to%20Refactor%20a%20PHP%20Application" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;linkname=How%20to%20Refactor%20a%20PHP%20Application" title="Email" rel="nofollow" target="_blank"><img src="http://mattmccormick.ca/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F10%2F13%2Fhow-to-refactor-a-php-application%2F&amp;title=How%20to%20Refactor%20a%20PHP%20Application" id="wpa2a_2">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://mattmccormick.ca/2011/10/13/how-to-refactor-a-php-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make Time for the Long Term</title>
		<link>http://mattmccormick.ca/2011/09/22/make-time-for-the-long-term/</link>
		<comments>http://mattmccormick.ca/2011/09/22/make-time-for-the-long-term/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 00:07:36 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://mattmccormick.ca/?p=186</guid>
		<description><![CDATA[The biggest mistake I see with fellow colleagues are people that just focus on the immediate tasks at hand. Day after day they only work on the tasks given to them and just try to get them done. Focusing on the immediate short-term tasks all the time is a recipe for mediocrity. It also leads [...]]]></description>
			<content:encoded><![CDATA[<p>The biggest mistake I see with fellow colleagues are people that just focus on the immediate tasks at hand.  Day after day they only work on the tasks given to them and just try to get them done.  Focusing on the immediate short-term tasks all the time is a recipe for mediocrity.  It also leads to boredom.</p>
<p>Everyone should block off a portion of their day for thinking long-term and investing in skills that may pay off later.  Unfortunately, many work places don&#8217;t see the value in doing this.  </p>
<p>Do it anyway.  </p>
<p>My first job post-university was relatively slack.  There would usually be extra time every day.  Luckily, this workplace had an awesome IT library with pretty much every technical book I could want.  (This was before I discovered <a href="http://safaribooksonline.com/Corporate/Index/">Safari Books Online</a>)  Knowing that I had extra time, one day I decided to bring in &#8220;<a href="http://www.amazon.com/gp/product/0201835959/ref=as_li_ss_tl?ie=UTF8&#038;tag=mattmccormick-20&#038;linkCode=as2&#038;camp=217145&#038;creative=399369&#038;creativeASIN=0201835959">The Mythical Man-Month</a>&#8221; to work to read on my downtime.  I figured since it was a book about IT projects, it was related to my work and should be no problem for me to read.</p>
<p>After I started reading, my manager came by and asked what I was doing.  I said I was learning.  He looked at my book and told me &#8220;You can&#8217;t read here.  If you need something to do, ask me and I&#8217;ll give you something.&#8221;  That was probably the moment that I knew I wouldn&#8217;t work there much longer.  From then on, I just read on my computer so he wouldn&#8217;t know.</p>
<p>Some people might say &#8220;You shouldn&#8217;t be reading on company time&#8221; but as long as it is related to the work you&#8217;re doing, I see it as a benefit to the company.  After a while of doing this, I definitely noticed that I was progressing faster than colleagues and that long-term investment started to pay off in my work.  A couple times, senior developers with many years more experience than me would be discussing a problem and I would propose a solution from something I had read which they then implemented.  These are the times when the long-term investment starts to yield short-term rewards.</p>
<p>Only enlightened managers will understand the payoff an hour or two of long-term investment can bring and, unfortunately, we can&#8217;t all work for the enlightened ones.  That is why, as a programmer, you need to take control of your own craft.  Software development is a profession that not everyone can do.  It&#8217;s kind of like plumbing in that aspect.  Most of the people who plumbers work for do not know anything about plumbing.  Most of the people software developers work for know next to nothing about software development.  Remember that you are responsible for being the expert so be sure to develop your expertise.</p>
<p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;count=none&amp;text=Make%20Time%20for%20the%20Long%20Term" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;count=none&amp;text=Make%20Time%20for%20the%20Long%20Term" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;linkname=Make%20Time%20for%20the%20Long%20Term" title="Email" rel="nofollow" target="_blank"><img src="http://mattmccormick.ca/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F22%2Fmake-time-for-the-long-term%2F&amp;title=Make%20Time%20for%20the%20Long%20Term" id="wpa2a_4">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://mattmccormick.ca/2011/09/22/make-time-for-the-long-term/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Do you program 4th dimensionally?</title>
		<link>http://mattmccormick.ca/2011/09/02/do-you-program-4th-dimensionally/</link>
		<comments>http://mattmccormick.ca/2011/09/02/do-you-program-4th-dimensionally/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 20:20:03 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://mattmccormick.ca/?p=156</guid>
		<description><![CDATA[I&#8217;ve worked on a few different types of applications at this point in my career and one sure sign of poor programming I&#8217;ve noticed is the inability to program 4th dimensionally. You notice this when the application may be working but implementing features begins to take longer and longer. The performance starts to become an [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_157" class="wp-caption aligncenter" style="width: 460px"><a href="http://mattmccormick.ca/wp-content/uploads/2011/09/tumblr_lishpiSM8O1qgubxao1_1280.png"><img src="http://mattmccormick.ca/wp-content/uploads/2011/09/tumblr_lishpiSM8O1qgubxao1_1280-1024x550.png" alt="" title="tumblr_lishpiSM8O1qgubxao1_1280" width="450" height="241" class="size-large wp-image-157" /></a><p class="wp-caption-text">&quot;Marty, you&#039;re just not thinking 4th dimensionally&quot;</p></div>
<p>I&#8217;ve worked on a few different types of applications at this point in my career and one sure sign of poor programming I&#8217;ve noticed is the inability to program 4th dimensionally.  You notice this when the application may be working but implementing features begins to take longer and longer.  The performance starts to become an issue when more users are added to the system.  These problems are a result of the programmer not thinking about the future.</p>
<p>PHP code is notorious for this problem because it is so easy and tempting to write code that just focuses on the immediate problem.  A programmer gets the task done quickly and he is happy and the client is happy.  It&#8217;s also the reason why on outsourcing sites there are many job postings looking for PHP programmers at $5/hour.  I don&#8217;t see many postings looking for Ruby on Rails developers at that rate.  Ruby on Rails forces developers to use a well-established framework that adheres to good design practices.  With PHP, especially without using a framework, developers have the ability to just throw everything together if they so choose.  This leads to a big mess.  If the application grows, this mess gets bigger and bigger until it needs to be cleaned up.</p>
<p>Cleaning up a code mess involves a lot of work and it shouldn&#8217;t be done all at once.  It&#8217;s like switching bank accounts.  I&#8217;ve switched my main banking account before and it is a hassle that takes months to complete.  Any direct deposits and automated bill payments need to be changed to the new bank account.  Money needs to be transferred.  When you think you&#8217;ve got everything switched over, it&#8217;s also good to leave the old bank account active for a little while longer until you are reasonably confident that you haven&#8217;t forgotten anything.</p>
<p>Cleaning up a code mess is similar.  First you want to make sure that the logic will not break.  This involves writing tests for the current system.  These will most likely have to be done from scratch because if the codebase is a mess, chances are there is no testing being done.</p>
<p>Secondly, start with simple modules that are easy to understand and are loosely coupled to other parts of the application.  These parts of the application are the easiest to switch over to cleaner code because you can be relatively confident that they will still work without breaking the application.  Move on to more complicated modules as you understand the system better and all the connections.</p>
<p>Finally, when the modules have been re-coded into a more fluid design,  remove the old code.  Old code on a system just confuses new developers who don&#8217;t know if it&#8217;s important or not.  Throw it out to keep things simple.  You aren&#8217;t going to use it.</p>
<p>As a developer, how can you better program for the future?  There are a few things you can do:</p>
<p>Every time you write code think about how it will look in the future.  How easily can someone understand this code when they read it 6 or 12 months from now?  What if the code needs to be used somewhere else?  Is it easy to call from another part of the application?</p>
<p>In addition to thinking long-term while performing short-term tasks, start noticing code messes.  Anytime you see the same code repeated more than once in an application, alarm bells should start going off in your head alerting you to a possible mess.  Make a note of it.</p>
<p>Take some time regularly to clean up messy code you notice.  This is probably the most difficult as it requires a developer to think independently.  In my experience, very few managers are going to come to you and say &#8220;You should take the next week to work on cleaning up the code while no features are getting implemented.&#8221;  As a developer, you need to just clean up the code as you go along without being asked to do so.  You do it because even though the immediate task may take a little bit longer, you are saving more time down the road.</p>
<p>If all the effort is placed on the immediate short-term you will be like a public company that just focuses all its attention on the next quarter&#8217;s results.  It may work for a while but after cutting their Research and Development budget to save costs and boost short-term profits, the company then realises that they have nothing in the pipeline for the upcoming years and begins to lose market share.</p>
<p>Your manager/client is always going to be providing the short-term, immediate tasks you need to work on but to become a professional developer, you need to carve out a part of your day to think 4th dimensionally.</p>
<p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;count=none&amp;text=Do%20you%20program%204th%20dimensionally%3F" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;count=none&amp;text=Do%20you%20program%204th%20dimensionally%3F" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;linkname=Do%20you%20program%204th%20dimensionally%3F" title="Email" rel="nofollow" target="_blank"><img src="http://mattmccormick.ca/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fmattmccormick.ca%2F2011%2F09%2F02%2Fdo-you-program-4th-dimensionally%2F&amp;title=Do%20you%20program%204th%20dimensionally%3F" id="wpa2a_6">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://mattmccormick.ca/2011/09/02/do-you-program-4th-dimensionally/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developing Software when you are Technically Challenged</title>
		<link>http://mattmccormick.ca/2009/12/29/developing-software-when-you-are-technically-challenged/</link>
		<comments>http://mattmccormick.ca/2009/12/29/developing-software-when-you-are-technically-challenged/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 07:34:29 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://mattmccormick.ca/?p=37</guid>
		<description><![CDATA[Recently I read a blog post from one of the RSS feeds I subscribe to. The author was looking to create an iPhone app to promote his business. He researched a few options &#8211; one quoted him $20-$30,000, another $8-10,000 and he also came across a website offering to create one for $499. From reading [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I read a blog post from one of the RSS feeds I subscribe to.  The author was looking to create an iPhone app to promote his business.  He researched a few options &#8211; one quoted him $20-$30,000, another $8-10,000 and he also came across a website offering to create one for $499.</p>
<p>From reading his blog, I assume he has little-to-no software development experience.  This is a scary position to be in.  How do you choose between widely varied options?  What could the difference possibly be if the product is the same?</p>
<p>To the layperson, the obvious choice is the $499 option.  The logic for choosing this option is sound &#8211; he wants an iPhone app; these companies all make iPhone apps; therefore the cheapest one will be the best option for me.</p>
<p>Unfortunately, it is not so simple with software.</p>
<p>After being involved in software development for the past five years I&#8217;ve learned that out of the full cost of developing software, only a part of it comes from the initial creation.  To rephrase, much of the cost of developing software comes <strong>after</strong> the software has been created.</p>
<p>How can this be?</p>
<p>Many non-technical people put in charge of software projects do not <strong>really</strong> know what they want.  Usually, they have a vague idea but as the product is developed, more ideas will come.  These new ideas require changes to the product.  If you&#8217;re not familiar with the way software is developed, you may think this is simply moving around text as you would with a text editor like Microsoft Word.  Nothing could be further from the truth.  In practice, software development is a type of architecture.</p>
<p>Let&#8217;s say you want to build a house.  You have a general idea of what kind of house you want so you tell the designer you want a house with a certain number of rooms and so on.  He designs the plans and begins building the house.  Part-way through, you walk through the half-completed house and realise you would like the kitchen to be bigger and the bedroom to be moved to a different location.  Is it going to be easy to make this change?  No.  Although software is not quite as inflexible to dynamic changes, it still requires the foundation to change which can be major.</p>
<p>Now a good software architect will try to design the software to allow easy adjustments along the way.  However, these architects usually learn how to do this through years of experience.  This means you won&#8217;t find them at the cheap end of the pricing spectrum.</p>
<p>So what is the $499 option offering?  After taking a look at their website, they are offering a simple template option to create an iPhone app.  This means you are locked into their system.  If you want to add changes later, it is going to cost a lot.</p>
<p>If you are really, absolutely, positively sure that you will not want changes, then this option is a good deal.  In my experience, this is rarely the case.  Many clients come up with new ideas only after seeing the product in action.</p>
<p>If you go with the $499 option and you want custom changes, you will probably have to hire another firm as I doubt this company is in the custom-development business.  That means that the new firm will have to invest time learning the system and implementing the changes.  I&#8217;ve even worked on projects where it has been cheaper to throw away the original work and start over from scratch.  This means the initial cost for developing the software was a complete waste.  Either the company doing the work did not fully understand the client&#8217;s requirements or the client did not know what they wanted well enough to explain it.</p>
<p>Probably the worst thing you can do as a non-technical person starting a software project is to just go with the cheapest option.  The initial development cost can be only a small part of the final cost.</p>
<p>Detail what you are looking to accomplish with the software.  Spend time communicating with the vendor what your end goal is.  Make sure any potential vendor has clear guidelines what they will support after development and make sure they are asking lots of questions to fully understand your requirements.  Many software projects go awry not because of technical challenges, but because of communication challenges.  Good communication will help your software project immensely.</p>
<p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=like&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;size=medium&amp;count=false" scrolling="no" style="border:none;overflow:hidden;width:32px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;count=none&amp;text=Developing%20Software%20when%20you%20are%20Technically%20Challenged" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;counturl=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;count=none&amp;text=Developing%20Software%20when%20you%20are%20Technically%20Challenged" scrolling="no" style="border:none;overflow:hidden;width:55px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;linkname=Developing%20Software%20when%20you%20are%20Technically%20Challenged" title="Email" rel="nofollow" target="_blank"><img src="http://mattmccormick.ca/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fmattmccormick.ca%2F2009%2F12%2F29%2Fdeveloping-software-when-you-are-technically-challenged%2F&amp;title=Developing%20Software%20when%20you%20are%20Technically%20Challenged" id="wpa2a_8">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://mattmccormick.ca/2009/12/29/developing-software-when-you-are-technically-challenged/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

