<?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>Edward Yarnold &#187; Best Practice</title>
	<atom:link href="http://www.edwardyarnold.co.uk/blog/category/web-development/best-practice/feed" rel="self" type="application/rss+xml" />
	<link>http://www.edwardyarnold.co.uk/blog</link>
	<description>PHP &#38; MySQL Web Developer</description>
	<lastBuildDate>Mon, 12 Dec 2011 18:12:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Discouraging the accumulation of Technical Debt</title>
		<link>http://www.edwardyarnold.co.uk/blog/discouraging-the-accumulation-of-technical-debt</link>
		<comments>http://www.edwardyarnold.co.uk/blog/discouraging-the-accumulation-of-technical-debt#comments</comments>
		<pubDate>Mon, 12 Dec 2011 18:12:23 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=215</guid>
		<description><![CDATA[I&#8217;m nearly four years on from starting with my current employer. This is quite an interesting phase of my employment, in that sites that I worked on when I first started are all reaching the stage where they&#8217;re being refreshed, upgraded or completely rewritten.  What this seems to be doing is highlighting to me that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m nearly four years on from starting with my current employer. This is quite an interesting phase of my employment, in that sites that I worked on when I first started are all reaching the stage where they&#8217;re being refreshed, upgraded or completely rewritten.  What this seems to be doing is highlighting to me that there really is such a thing as <a href="http://en.wikipedia.org/wiki/Technical_debt">Technical Debt</a> and it really can be as evil as people say it can.</p>
<p><span id="more-215"></span>As developers, we are often rewarded with praise (or more) for turning new features around quickly.  If your company estimates that a particular feature will take eight hours to write, and you take only four, the company&#8217;s making a tidy profit, you can move to the next item in your schedule more quickly and everyone is happy.  This is all very well, so long as that feature has been written properly and in accordance with your company&#8217;s general approach; everything ranging from naming conventions right through to the organisation of the filesystem.  If it hasn&#8217;t been written properly, then you have incurred technical debt, and at a point in the future either you or another developer maintaining your code may need to spend more time writing a feature or changing your feature than anticipated.</p>
<p>This can cause all manner of problems.  When you come to develop on from your last feature, you might estimate that another bit of functionality will take 8 hours to write.  However, when trying to hook in to the existing feature, you discover your technical debt, and end up having to refactor the existing code to allow you to do what you wish.  This might take another 4 hours.  This might not seem to be a disaster; after all, you were 4 hours up on the first feature, and we&#8217;re just back where we should be now, right? Wrong! It is important to remember that managing our time isn&#8217;t  just about managing the absolute amount of time taken, but keeping to schedules.  The 4 hours it takes to sort out the mess in this second round of development delays the next item in your project schedule, which might result in a disappointed client.</p>
<p>In my opinion it would have been better to take the full scheduled 8 hours in the first round of development and avoid the unexpected hold-up during the second round of development.  The 4 hours in the first instance are less expensive than the 4 hours in the second, as they&#8217;ve less of an effect on surrounding projects &amp; priorities.</p>
<p>The trouble is, at the time the new feature is written, it can be difficult for someone non-technical to tell the difference between it having been done quickly and it having been done properly.  In fact, from an end-user&#8217;s point of view, the system can look absolutely identical.   So, given two developers, one who can turn the feature around in 4 hours, and another who takes twice as long at 8 hours, which will the project manager or client be more happy with? My money would nearly always be on the 4 hour guy. But long term, the 8 hour guy is actually going to be less expensive to run, or will at least facilitate more accurate estimates and quotes on the same system in the future.  The problem is, as developers, we need to resist the temptation to be the 4 hour guy. The short term praise can be addictive and it&#8217;s understandable why it seems easier and more tempting to do things as quickly as possible and worry about the consequences later.</p>
<p>What I&#8217;m noticing is, in 2008 I WAS the 4 hour guy. I was turning around features faster than other people had in the past, and grew a reputation for being quicker.  While I was quicker at the time, now, 4 years on, when I&#8217;m revisiting those sites and starting to improve or extend them, I&#8217;m paying off my technical debt with &#8216;expensive&#8217; rewriting and refactoring.  So now I&#8217;m in the position where I am expecting the implementation of a change request to take a given amount of time, but on loading up the project and seeing the way it was written in the first place, the implementation is taking much longer.  This extra development time is difficult to explain and to justify to those responsible for project scheduling, and is something that I&#8217;m going to really strive to avoid in the future, even if it does seem to take me slightly longer to develop new features than before.</p>
<p>It seems sensible to finish this post with one of the more famous quotes about computer programming. I&#8217;m sure you&#8217;ll have <a href="http://c2.com/cgi/wiki?CodeForTheMaintainer">read it before</a>&#8230;</p>
<blockquote><p>Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live</p></blockquote>
<p>Trust me, it&#8217;s bad enough even if it&#8217;s YOU that ends up maintaining your code!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/discouraging-the-accumulation-of-technical-debt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A problem with forms submitting using AJAX: how to resubmit?</title>
		<link>http://www.edwardyarnold.co.uk/blog/ajax-form-problem-resubmissio</link>
		<comments>http://www.edwardyarnold.co.uk/blog/ajax-form-problem-resubmissio#comments</comments>
		<pubDate>Tue, 22 Feb 2011 23:57:04 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=167</guid>
		<description><![CDATA[I&#8217;m a fairly regular user of the twitter web front-end, and of Facebook. Both of these have tremendously wide audiences and are hugely popular. Twitter recently attracted a bit of negative press from the technical community for replacing the old, fairly standard URL structure with one that uses &#8216;hashbangs&#8217; and is fully dependent upon Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a fairly regular user of the twitter web front-end, and of Facebook.  Both of these have tremendously wide audiences and are hugely popular.  Twitter recently <a href="http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs">attracted a bit of negative press</a> from the technical community for replacing the old, fairly standard URL structure with one that uses &#8216;hashbangs&#8217; and is fully dependent upon Javascript to serve the correct content.  But I&#8217;ve another more user-centred complaint about Twitter (and Facebook) relying heavily on Javascript for fundamental parts of their apps (e.g. the ability to tweet, and ability to comment on stuff).  That is the removal of the ability to &#8216;refresh&#8217; or &#8216;resubmit&#8217; a request&#8230;<br />
<span id="more-167"></span><br />
Let me give some background.  I live in quite a rural location, where the broadband is far from perfect.  My packet loss rate is higher than desired which means that sometimes requests for web pages or web services fail in some way.  This is not normally a problem; if the page partially loads or stops loading, I hit refresh and generally get the whole page.  All fine!</p>
<p>In &#8216;the olden days&#8217; when processes such as updating your Facebook status or posting a tweet were done through bog standard HTML forms posted by the browser to a new page request, it didn&#8217;t matter when the page I was posting to didn&#8217;t get posted to fully, or didn&#8217;t respond, because I could hit refresh (or press the submit button again or whatever) and the request would be resubmitted.</p>
<p>Some web developers (myself, at times, included) HATE impatient users who will press buttons twice or refresh the page because it&#8217;s taking too long.  In a lot of apps this means that the action is applied however many times the button is pushed (e.g., two or three orders are placed instead of one). But the reality is, sometimes there is a genuine need to refresh or resubmit, because nothing is *ever* going to happen with the first request that was sent.  This could be due to an internet connection problem or a server-side problem.</p>
<p>Now, more and more web sites seem to favour the &#8220;no new pageload is necessary&#8221; approach which, in itself, I do not have a problem with &#8211; at all.  What I do have a problem is is when the developers choose to disable the submit button once I press it &#8211; permanently.  Because if nothing happens for 2 or 3 seconds, I am pretty damn sure that that status update or tweet is never going to get posted.  What I would like to do at this stage is to resubmit the request.  But at this time, there is no easy way to do this:</p>
<ul>
<li>I have not requested the page in a traditional sense in the browser, so I can not push the &#8216;refresh&#8217; button; that would reload the whole page and typically delete the tweet or status update that I have written.</li>
<li>The submit button for the form is permanently disabled, so I can&#8217;t press it again to submit again.</li>
</ul>
<p>Even if the JS implementation gracefully degrades (e.g. if I have no JS support I get the &#8220;old fashioned&#8221; style normal form), this situation occurs for people with JS enabled.  Just because a user has JS enabled doesn&#8217;t mean that their web connection is faultless or that they won&#8217;t need to push that submit button twice!</p>
<p>I was trying to think of a way around this issue that doesn&#8217;t require scrapping the AJAX submission all together, and came up with only one potential solution, which is to disable the submit button but only for an elected period of time (say 2 or 3 seconds), so that if the request doesn&#8217;t get responded to in that time, the user is given an opportunity to re-submit.</p>
<p>Anyone else&#8217;s ideas of how to work around this problem would be gratefully received through the comments section; I don&#8217;t want to write software that frustrates people in the same way that this frustrates me!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/ajax-form-problem-resubmissio/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Does your website still need to be functional with Javascript disabled or unsupported?</title>
		<link>http://www.edwardyarnold.co.uk/blog/does-your-website-still-need-to-be-functional-with-javascript-disabled-or-unsupported</link>
		<comments>http://www.edwardyarnold.co.uk/blog/does-your-website-still-need-to-be-functional-with-javascript-disabled-or-unsupported#comments</comments>
		<pubDate>Wed, 10 Nov 2010 08:43:37 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Optimisation]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=149</guid>
		<description><![CDATA[We have recently been reviewing the amount of development time spent on projects, and have identified one area where a fair chunk of extra time is spent for relatively little gain: Ensuring that web sites are 100% functional with Javascript disabled. The general concensus on the web is that year on year, the number of [...]]]></description>
			<content:encoded><![CDATA[<p>We have recently been reviewing the amount of development time spent on projects, and have identified one area where a fair chunk of extra time is spent for relatively little gain: Ensuring that web sites are 100% functional with Javascript disabled.  The general concensus on the web is that year on year, the number of people (even those technical in nature that browse w3schools) with javascript disabled <a href="http://www.w3schools.com/browsers/browsers_stats.asp">is falling</a> &#8211; but is this a decent reason to consider removing the true graceful degradation that most front end developers have been obsessed with for the last few years?<br />
<span id="more-149"></span></p>
<p>The main reason for Javascript being used to progressively enhance the user experience rather than be a fundamental &#8216;requirement&#8217; is cited as making the site accessible to as many people as possible.  Importantly, many mobile devices don&#8217;t fully support Javascript (Smart Phones tend to, but I&#8217;m talking true mobile phones here) and screen readers certainly don&#8217;t support Javascript.  Realistically, the percentage of visitors falling in to the &#8216;browsing on a mobile device&#8217; or &#8216;using a screen reader&#8217; will be low, and often low enough for a client (or yourself) to make the judgement &#8220;we&#8217;re not going to bother&#8221;.  It is important to consider that there are advantages to graceful degradation other than making the site as accessible as possible:</p>
<p><strong>Google, Bing, and A.N.Other search engines</strong> &#8211; search engine spiders are still fairly basic creatures.  If your site navigation doesn&#8217;t load a new page but instead loads new content in using Ajax when you click the &#8216;About&#8217; link, how are search engines going to find and index your &#8216;About&#8217; page content if the site is not navigable without Javascript?  It&#8217;s quite simple to make things like this degrade; if Javascript is disabled the link should go to index.php?page=about rather than nowhere.  Importantly, many clients think that <strong>google is the most important visitor</strong>; if they&#8217;ve forced you to put lots of keywords at the bottom of the site despite your pleas for them not to then they wouldn&#8217;t be very pleased to find out that the search engines can&#8217;t get any further than your home page.</p>
<p><strong>Application Design</strong> &#8211; Designing the application so that it works without Javascript and then adding Javascript afterwards often makes the system architecture much more understandable and &#8216;rigid&#8217;.  In fact, if done correctly, this can speed up the Javascript implementation process.  Looking back to our previous example, index.php?page=about will load a completely new version of the page with header, footer and all the bells and whistles.  How about, if you click the &#8216;About&#8217; link with javascript enabled, it will load index.php?page=about but through AJAX?  Using HTTP_X_REQUESTED_WITH we can detect that it was requested through AJAX and serve just the &#8216;meaty&#8217; bit of the page; ie the content that is changing, rather than the whole page.  Does this really add much time to the development process?  In my opinion, no it doesn&#8217;t!</p>
<p>Of course, the user experience will not be identical without javascript, but in my view it is still important to support users with no support for the language on their device, or even those that choose to browse without it.  It is my view that you can treat support for when Javascript disabled in the same way as many designers treat support of Internet Explorer 6: The site should work, but it doesn&#8217;t necessarily have to be perfect.  Sticking to this general guideline will not add huge amounts of time to the development time of a project, and if it does&#8230; you should take a look at how the system is designed, because it really shouldn&#8217;t.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/does-your-website-still-need-to-be-functional-with-javascript-disabled-or-unsupported/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Commenting code &#8211; a minor but invaluable investment of time</title>
		<link>http://www.edwardyarnold.co.uk/blog/commenting-code-invaluable-investment-of-time</link>
		<comments>http://www.edwardyarnold.co.uk/blog/commenting-code-invaluable-investment-of-time#comments</comments>
		<pubDate>Wed, 03 Nov 2010 18:56:04 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=133</guid>
		<description><![CDATA[I&#8217;m a strong believer in code being written in such a way that it is self documenting, but would not use this as an excuse for not adding in English language comments to go alongside the code. After all, comments add a tiny amount to the size of a PHP file and don&#8217;t slow down [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a strong believer in code being written in such a way that it is self documenting, but would not use this as an excuse for not adding in English language comments to go alongside the code.  After all, comments add a tiny amount to the size of a PHP file and don&#8217;t slow down the application at all.  Also, the English language comments alongside the code can be used to justify decisions or assumptions you have made, which might make the next programmer&#8217;s visit to the file a lot quicker and more productive.</p>
<p><span id="more-133"></span></p>
<h3>Explaining and justifying your decisions</h3>
<p>At the most very basic level, take this bit of code for example:</p>
<p><code>ksort($files);</code></p>
<p>To most PHP developers it is obvious that this bit of code sorts the $files array in key order.  But it is not obvious to any PHP developer *why* I have done this.  Adding a comment to say what I am doing and why would help speed up the recognition of what this code does; but more importantly, explain why this code is here.:</p>
<p><code><br />
/**<br />
 * Sort the $files array in Key order. We want them displayed on the<br />
 * page in added order,  and the $files array is not necessarily<br />
 * sorted in that order before this stage.<br />
 */<br />
ksort($files);<br />
</code></p>
<h3>Using code comments as a tool: Autocompletion</h3>
<p>There are other areas of an application where documentation can be even more useful.  Modern Code Editors and IDEs will read what are called &#8216;<a href="http://en.wikipedia.org/wiki/PHPDoc#DocBlock">docblocks</a>&#8216; at the top of class, method or function definitions and add the information in the docblock in to your autocomplete prompts.  So how do these docblocks work?</p>
<p>Docblocks are generally in this format (opened by /**, closed by */, with a * at the start of every line inbetween) and always apply to the next uncommented line of code.  In this case, the line of code beginning with $page_posted_to = is documented by the docblock above.:</p>
<p><code><br />
/**<br />
 * Determine if the page has been posted to with an action.<br />
 */<br />
$page_posted_to = (array_key_exists('action', $_POST) &#038;&#038; !empty($_POST['action']));<br />
</code></p>
<p>Within docblocks you can contain &#8216;tags&#8217;.  These &#8216;tags&#8217; begin with an @ symbol and are often read or interpreted by documentation generation utilities or IDEs/Editors for autocompletion.  A comprehensive list can be found on the <a href="http://en.wikipedia.org/wiki/PHPDoc#Tags">Wikipedia page for Docblocks</a>.   Using these tags can encourage you to include information in your documentation that you might forget to include normally, ie the expected data type of function parameters.</p>
<p>At it&#8217;s most basic use, docblocks usually look something like this when describing a function or method:</p>
<p><code><br />
/**<br />
 * This function adds two values together<br />
 * @param int $a The first value<br />
 * @param int $b The second value<br />
 * @return int The value of $a + $b<br />
 */<br />
function add_together($a, $b) {<br />
     return $a + $b;<br />
}<br />
</code></p>
<p>As you can see, including these docblocks explains in plain english what the function does, what parameters it expects, and what it will return.  This can save the next developer that reads your code tonnes of time and headaches, but most importantly of all, will make your code editor or IDE (if it supports autocompletion and docblock parsing) much more intelligent when it comes to helping you call your own methods or functions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/commenting-code-invaluable-investment-of-time/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coding things the quick way &#8211; often a false economy</title>
		<link>http://www.edwardyarnold.co.uk/blog/coding-things-the-quick-way-often-false-economy</link>
		<comments>http://www.edwardyarnold.co.uk/blog/coding-things-the-quick-way-often-false-economy#comments</comments>
		<pubDate>Wed, 04 Aug 2010 07:37:41 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=129</guid>
		<description><![CDATA[I have recently been tasked with making some changes to the central &#8216;library&#8217; of code that an E-Commerce platform is based on.  Essentially, the &#8216;models&#8217; for this application are all in a central, shared location, and all of the &#8216;installations&#8217; of the e-commerce platform have their own set of controllers and views that interact with [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently been tasked with making some changes to the central &#8216;library&#8217; of code that an E-Commerce platform is based on.  Essentially, the &#8216;models&#8217; for this application are all in a central, shared location, and all of the &#8216;installations&#8217; of the e-commerce platform have their own set of controllers and views that interact with these models.  The changes I am making involve making the deletion of products reversible; so instead of actually deleting products and associated assets, a flag is merely set in the database; is_deleted = 1.  This, at first glance, seems to be quite a simple task; alter the database tables to add the extra column in, and make a change to the central models in Model_Product::deleteProduct and any product &#8216;getter&#8217; functions, eg Model_Product::getProductsByCategoryId.  However, due to the way that the platform has been developed and individual customisations to the installations of that platform have been made, things aren&#8217;t quite so simple.</p>
<p><span id="more-129"></span>The idea of the &#8216;architect&#8217; of this system was that any interaction with databases or storage of data; ie the models; would be shared in the central library.  This would mean that changes such as the one I worked on with is_deleted = 1 would be simple and made in one place, and one place only.  A true implementation of the &#8216;Don&#8217;t Repeat Yourself (DRY)&#8217; principle.</p>
<p>The nature of this platform is that it is exactly that. A platform.  This typically means that no two implementations of the platform are identical, so to speak.  The platform is built upon and &#8216;extended&#8217; to do what the individual customers want from their online shop.  This sometimes means that custom product &#8216;getter&#8217; blocks of code are written.  Often, the &#8216;quick and easy&#8217; approach had been taken with these , and they had simply been added as standalone functions in the <strong>individual project&#8217;s library</strong>, called things such as getAllProductsFlaggedAsSpecial()  This obviously meant that when I implemented my is_deleted changes in the central library, and wasn&#8217;t aware of the custom nature of these custom product selectors, the sites that used those custom product selectors continued to display deleted products.  Big oops!</p>
<p>This now means that I will need to go through the individual implementations of the platform, search for any custom product SQL that is being built, and add the AND p.is_deleted = 0 in to them.</p>
<p>This whole problem got my thinking about how I would approach this issue (The need to build custom product getter functions in individual implementations of the platform), and here&#8217;s how I think I&#8217;d do it.</p>
<p>I think I would ensure that all custom product getter functions were in fact methods in an extension of the main Model class that then called a buildWhereClause method that added any global product SQL (eg AND is_deleted = 0) in, like this:</p>
<p><code><br />
class Model_Product extends Base_Model {<br />
...<br />
function buildWhereClause($sql) {<br />
return 'WHERE p.is_deleted = 0 AND '.$sql;<br />
}<br />
...<br />
}<br />
</code></p>
<p><code><br />
class MyShopNameModel_Product extends Model_Product {<br />
function getProductsFlaggedAsSpecial() {<br />
...<br />
$sql = "SELECT * FROM product ".$this-&gt;buildWhereClause('is_special = 1');<br />
...<br />
}<br />
}</code></p>
<p>Essentially, what I learnt here was that the developer to begin with that wrote these &#8216;quick functions&#8217; saved his or herself half an hour or so, but cost me (2-3 years later) a fair amount of time in debugging.  I think this is evidence that coding things the quick way and implementing a fast solution is often a false economy, and someone later in the life of the software will have to spend the time saved (and possibly more) to work around the disadvantages of the quick approach.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/coding-things-the-quick-way-often-false-economy/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Collective Ownership of Code: Anyone should be able to fix anything that is broken!</title>
		<link>http://www.edwardyarnold.co.uk/blog/collective-ownership-of-code-anyone-should-be-able-to-fix-anything-that-is-broken</link>
		<comments>http://www.edwardyarnold.co.uk/blog/collective-ownership-of-code-anyone-should-be-able-to-fix-anything-that-is-broken#comments</comments>
		<pubDate>Fri, 07 May 2010 18:23:58 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=115</guid>
		<description><![CDATA[In reading up on programming practices and ideals, I have stumbled across a concept called &#8220;Collective Code Ownership&#8221;.  This essentially means that *any developer* can fix bugs or write any new feature in *any project*.  Bug fixing and project development should not be limited to the person that wrote the code in the first place.   [...]]]></description>
			<content:encoded><![CDATA[<p>In reading up on programming practices and ideals, I have stumbled across a concept called &#8220;Collective Code Ownership&#8221;.  This essentially means that *any developer* can fix bugs or write any new feature in *any project*.  Bug fixing and project development should not be limited to the person that wrote the code in the first place.   This introduces both advantages and disadvantages in to project management.</p>
<p><span id="more-115"></span></p>
<h3>The Concept</h3>
<p>The concept behind this is simple.  Every developer can be responsible for the code in any project.  As mentioned above, this means that bug fixes can be made by any developer, and new features can be developed by any developer.  Here&#8217;s wikipedia&#8217;s current take on the matter:</p>
<blockquote><p>Collective code ownership means that everyone is responsible for all the  code; this, in turn, means that everybody is allowed to change any part  of the code.</p></blockquote>
<h3>The Advantages</h3>
<p>In my opinion this introduces the following advantages.</p>
<ul>
<li>If a member of your development team is immersed in an important project and needs to be allowed to &#8220;get in the zone&#8221; and work <a href="http://bigthink.com/ideas/18522">interruption free</a>, then if code they have written is deemed to be broken, any other member of the development team can fix the problem.</li>
<li>This increases exposure of application code.  The more developers that have seen code and got their head around the way it works, the better!  When the developer that wrote the code leaves, it would be helpful to have other people who have at least seen the code and knows that it exists!</li>
<li>Fresh pairs of eyes can foresee other problems with the code.  Imagine constructing a delete query using a function called constructInClause, which is passed an array.  This will return an SQL IN() clause statement.  &#8220;Hang on a minute, what if the function constructInClause returns an empty string? Won&#8217;t that delete everything from the database?&#8221; &#8211; better to spot this before rather than after the bug is exposed.</li>
</ul>
<h3>The Disadvantages</h3>
<p>With every new approach comes disadvantages alongside the advantages.  Unfortunately, I do see a couple with this one:</p>
<ul>
<li>Allowing other developers to fix bugs and modify code can mean that they will not necessarily bear in mind the full knock on effects of a change.  Dependencies on code working a certain way are commonplace &#8211; even if not ideal &#8211; in web based applications.  (Note: Unit Testing could probably avoid this situation!)</li>
<li>There is a danger of one person in the office becoming the &#8220;bug fix person&#8221;.  Not many developers enjoy fixing bugs all day, so in my view it would be important to try to make sure that responsibility for fixing bugs is shared equally between the development team.</li>
</ul>
<h3>Will I be encouraging the company I work for to encourage collective code ownership?</h3>
<p>Probably, yes!  It seems like a very sensible idea, especially considering that at times interruption to fix bugs is really quite infuriating!  If the bug fixing could be assigned to the &#8220;most interruptable&#8221; developer at any one time, I&#8217;m sure that productivity <strong>and</strong> developer mood would both be improved.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/collective-ownership-of-code-anyone-should-be-able-to-fix-anything-that-is-broken/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple steps towards accurate project estimates</title>
		<link>http://www.edwardyarnold.co.uk/blog/accurate-project-estimates</link>
		<comments>http://www.edwardyarnold.co.uk/blog/accurate-project-estimates#comments</comments>
		<pubDate>Wed, 05 May 2010 17:12:50 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=104</guid>
		<description><![CDATA[A mistake that many developers (including myself) have made in the past is to over-promise and under-deliver in terms of the absolute deadline or the number of hours taken on a project.  Getting to the &#8220;missing the deadline&#8221; or &#8220;being over budget&#8221; stage can be especially demotivating &#8211; you&#8217;re costing yourself (or your company) time, [...]]]></description>
			<content:encoded><![CDATA[<p>A mistake that many developers (including myself) have made in the past is to over-promise and under-deliver in terms of the absolute deadline or the number of hours taken on a project.  Getting to the &#8220;missing the deadline&#8221; or &#8220;being over budget&#8221; stage can be especially demotivating &#8211; you&#8217;re costing yourself (or your company) time, which is valuable, and also the client is likely to be getting slightly irritated (if you are late).  The steps or methods to reduce the chances of this happening in the first place are simple, and easy to use.<br />
<span id="more-104"></span></p>
<h3>1. Make sure you understand the problem in full.</h3>
<p>Generally, when we are presented with a problem by either a client, or a project manager, the problem has been simplified somewhat.  A 15 minute phone conversation or meeting is condensed in to a three sentence paragraph asking you the best way around a problem.  In my eyes, there are a couple of approaches to avoid this.</p>
<ol>
<li><strong>Be involved in the meeting, or the phone conversation</strong>.  This is not always possible &#8211; not every developer wants to be interrupted every 30 minutes by client questions, and not every developer is necessarily comfortable talking to a client.  But listening in on (and not participating in) a conversation could always be an option!  This means that you get to hear everything that the client has said about the problem.  It&#8217;s to be expected that the person relaying the message will miss out minor (but not necessarily insignificant) details.  After all, repeating every phone conversation in full could get a bit tiresome, you&#8217;d imagine!</li>
<li><strong>Know to ask the right questions.</strong> A client asks to make their delivery fee increase with every product added.  Let&#8217;s say, increase the delivery fee by 30% for every additional product that needs delivering.  This is simple enough, until you consider that the delivery fee could easily escalate way out of control.  A £10 standard delivery fee could soon escalate to around £50 if someone bought a large amount of products.  This could discourage a purchase.  So should a limit be introduced for the maximum delivery fee?  Remember, the client probably hasn&#8217;t thought around this issue.  Asking the question and getting an answer before work starts could save you from having to rewrite a chunk of code.</li>
</ol>
<h3>2. If dealing with unfamiliar technology&#8230; allow some research time!</h3>
<p>If you&#8217;ve been asked to implement an unfamiliar technology, take 10 or 15 minutes to research how it all works.  15 minutes spent now could stop you from estimating that something will take 5 hours when it might take 20, or from estimating 20 hours when it might take 5!   Additionally, when estimating how long the work will take, remember that you will probably spend a fair chunk of time reading documentation and not actually writing code.  In many places this would be considered billable time &#8211; and it should certainly be taken in to account when working out how soon you could deliver the work.</p>
<h3>3.  Remember to allow time for testing and bug fixing.</h3>
<p>Not everyone does this, but in my opinion it is essential.  Allow some time for proper testing and the time it&#8217;ll take to fix bugs (this can only be estimated) as well as the time taken to write the code in the first place.</p>
<h3>4. If dealing with third party services, you can&#8217;t accurately promise a deadline.</h3>
<p>A lot of the work I do involves integration with third party services &#8211; payment gateway services, SMS services, etc.  These all involve an account application and signup process, and sometimes this process depends on the client completing a form, or submitting payment for the service.   I have found that it is almost impossible to accurately estimate a &#8220;go live&#8221; date when an aspect of your application depends on a third party service being ready for use.  If you do provide an estimated go live date, it could be worth putting in a note that it depends on the client&#8217;s service X application being complete by date Y.</p>
<h3>5. If you feel out of your depth, don&#8217;t be afraid to say!</h3>
<p>This is a very important point.  If you are not confident about working with and fully understanding the technology that you will be using, <strong>tell your manager or your client! </strong>It&#8217;s better to say at this stage than to blindly assume that you will be able to work something out during the work.  They will be a darn sight happier this way around than if you go out of your depth and then the project is late or massively over budget.  Saying now typically will have one of three results:</p>
<ol>
<li><strong>Your company will turn the work away</strong> to avoid a problem (or, your client will go elsewhere).</li>
<li><strong>Measures will be put in place to avoid the issue.</strong> Billing by the hour, or using another developer, for instance.</li>
<li><strong>The project will be quoted anyway at an estimated rate, and your company will take a risk.</strong> In this case, you at least said something at the start &#8211; the risk taken was by someone above you.</li>
</ol>
<p>These are only very basic steps that can be taken to avoid a problem.  But one thing is for certain.  It is typically better to <strong>under promise and over deliver</strong> rather than the other way around.  You just have to be careful that you don&#8217;t fall in to the habit of *massively* over-quoting projects, because this can have a detrimental effect in terms of reducing the percentage of accepted quotations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/accurate-project-estimates/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Should you sanitise your HTML before or after you save to your database?</title>
		<link>http://www.edwardyarnold.co.uk/blog/when-to-sanitise-data</link>
		<comments>http://www.edwardyarnold.co.uk/blog/when-to-sanitise-data#comments</comments>
		<pubDate>Mon, 19 Apr 2010 12:52:58 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=85</guid>
		<description><![CDATA[In starting a new project completely from scratch we need to decide whether to sanitise html (that is, convert &#38; to &#38;amp;, &#60; to &#38;lt;, and strip out blacklisted html) before or after we saved to database.  In projects I&#8217;d worked on in the past this had been done inconsistently in different areas of the [...]]]></description>
			<content:encoded><![CDATA[<p>In starting a new project completely from scratch we need to decide whether to sanitise html (that is, convert &amp; to <code>&amp;amp;</code>, &lt; to <code>&amp;lt;</code>, and strip out blacklisted html) before or after we saved to database.  In projects I&#8217;d worked on in the past this had been done inconsistently in different areas of the application &#8211; ie, pre save in some areas and on select in others.  After having thought through the problem I think I&#8217;ve decided on which option I prefer: Sanitise after selecting from the database, rather than before saving to the database.</p>
<p><span id="more-85"></span>My reasons for this decision are as follows:</p>
<ol>
<li><strong>Database collation</strong>.  Searching for strings <code>LIKE '%Ed, Ed &amp; Eddie%'</code> starts to get complicated if you have converted &amp; to &amp;amp; &#8211; you have to remember to convert entities in your search string as well.  This could also potentially mess up the effect ORDER BY clauses in the SQL queries you write have on the dataset.</li>
<li><strong>Data Integrity</strong>.  If in the future I decide that I all HTML, or just specific previously blacklisted HTML tags to be allowed, the data is all still complete and certain aspects of the data have not been removed.</li>
<li><strong>Application Consistency</strong>.  I know that if I am ever displaying data selected from the database it will need to be &#8216;sanitised&#8217; before being displayed to the user either in repopulated &#8216;edit&#8217; forms or in a normal &#8216;view&#8217; type screen.</li>
</ol>
<p>I also did a little bit of research in the cakephp manual (as we will be using cakephp for this next project) to see what cakephp creators thought about this and it seems they reached the same conclusion (quoted from <a href="http://book.cakephp.org/view/153/Data-Sanitization">this page</a>):</p>
<blockquote><p>For sanitization against XSS its generally better to save raw HTML in  database without modification and sanitize at the time of  output/display.</p></blockquote>
<p>They don&#8217;t give any specific reasons but I imagine that their thought process was similar to mine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/when-to-sanitise-data/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How I organise my project information to save time.</title>
		<link>http://www.edwardyarnold.co.uk/blog/organisation-time-saving</link>
		<comments>http://www.edwardyarnold.co.uk/blog/organisation-time-saving#comments</comments>
		<pubDate>Mon, 12 Apr 2010 06:16:19 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=51</guid>
		<description><![CDATA[It shouldn&#8217;t be news to anyone, but organising your projects (and assets within those projects) in an efficient manner will save you a load of time.   Perhaps not immediately, but at some point in the future you&#8217;ll be thanking yourself hundreds of times over that you took the time to organise things in the first [...]]]></description>
			<content:encoded><![CDATA[<p>It shouldn&#8217;t be news to anyone, but organising your projects (and assets within those projects) in an efficient manner will save you a load of time.   Perhaps not immediately, but at some point in the future you&#8217;ll be thanking yourself hundreds of times over that you took the time to organise things in the first place.</p>
<p><span id="more-51"></span>Starting with the basics, organisation in projects can be as simple as ensuring that you store all information supplied by the client with the project, in a folder called something like &#8216;assets&#8217;.   Typically I would split them by asset type &#8211; images for web, images for print, documents for web download, internal documents, other &#8211; and perhaps include a &#8216;supply date&#8217; in the filename of each.</p>
<p>Next, write stuff down!  If a particular part of the project depends on an external service being available, write this down in a document that stays with the project wherever it goes.  Any useful information that is in your head the day you write the code for the project should probably be written down.  You more than likely won&#8217;t remember in 2 years time when something goes wrong!  All of this information could simply be stored in a README file.</p>
<p>Good organisation doesn&#8217;t boil down to simply putting things in to folders, or keeping notes.  Of course, these actions are a part of the organisation, but don&#8217;t cover everything.  More importantly &#8211; especially in the IT industry &#8211; consistency can be the best time saving characteristic you can introduce to your work.  Being consistent is almost synonymous with being organised when it comes to your project management&#8230;</p>
<p>I save time (and frustration!) by:</p>
<ul>
<li>Naming projects consistently.  My project name tends to match the main part of the domain name on which the web site or project will be hosted.  If I&#8217;ve a domain called edwardyarnold.co.uk, the project in my subversion repository will be called edwardyarnold.  This makes it a lot quicker to put my hand on the correct project if a change needs to be made.</li>
<li>Naming the associated MySQL databases consistently.  For the above project, the CMS database would be called edwardyarnold_cms.  If the site were an ecommerce site, it would be called edwardyarnold_ecom.  This makes finding the relevant database in a phpmyadmin screen much quicker than if the databases weren&#8217;t named consistently.</li>
<li>Ensuring that if a project is replaced with an entirely new version, it is archived with a date.  If I replaced the edwardyarnold.co.uk site with a completely new build, I&#8217;d move the current project to edwardyarnold_2010_archive and create a new one to replace the old.  This is a better approach to dating the new version of the site &#8211; the new version of the site would still exist in 2011 but would appear to be out of date if dated 2010.  Annoying to anyone who didn&#8217;t know that that was the &#8216;latest&#8217; version of the site.</li>
<li>Naming administration area directories according to a set naming pattern (I won&#8217;t disclose that here).  This means that anyone who I work with that knows the pattern can find the administration area without looking up the directory name.  (They will of course have to look up the username and password, if not saved in their browser).</li>
</ul>
<p>These save a tiny amount of time individually, but collectively &#8211; and applied over multiple projects &#8211; the tiny amounts of time soon add up, and you can start to actually notice the saving.  Additionally, following these &#8216;rules&#8217; means that new people joining your team can begin to understand and get a grip of the way you work quicker than if everything was done differently for each project.  In larger organisations this can reduce recruitment costs (remember, downtime whilst training your new staff member is a hidden recruitment cost&#8230;!) as well as saving your existing team time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/organisation-time-saving/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Developers (and Web Design companies): Consider using someone else to check your work!</title>
		<link>http://www.edwardyarnold.co.uk/blog/php-developers-and-web-design-companies-consider-using-someone-else-to-check-your-work</link>
		<comments>http://www.edwardyarnold.co.uk/blog/php-developers-and-web-design-companies-consider-using-someone-else-to-check-your-work#comments</comments>
		<pubDate>Mon, 22 Mar 2010 22:00:42 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=31</guid>
		<description><![CDATA[We&#8217;ve all been there.  Working flat out on a project for day after day, to finally see the light at the end of the tunnel and start to consider launching.  But wait!  This is a dangerous situation to be in.  Having looked at the same site for so long, you&#8217;re not going to be able [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve all been there.  Working flat out on a project for day after day, to finally see the light at the end of the tunnel and start to consider launching.  But wait!  This is a dangerous situation to be in.  Having looked at the same site for so long, you&#8217;re not going to be able to spot the mistakes that you&#8217;ve made.  It&#8217;s worth spending an extra couple of hours to double-check your work &#8211; rather than have the embarassing situation of launching a site with mistakes present.</p>
<p><span id="more-31"></span>Until I worked for a couple of established Web Development companies, I never realised the importance of a &#8216;Checklist&#8217; at the end of a project.  You know, simple things.  Does the site&#8217;s markup validate?  Do all images have alt tags?  Is php display_errors off?  But even after getting in the habit of ticking all of the items off this checklist for every site I build, there are still little mistakes that creep through &#8211; miscapitalised letters, incorrectly pluralised nouns&#8230; eg &#8220;There are 1 comments on this post&#8221; should be &#8220;There is 1 comment on this post&#8221;.   No checklist can possibly cover all of these possible errors (though the one I link to later in this post gives it a good go!).</p>
<p>The best way of discovering these problems is to ask a favour of (or even to employ) someone you know &#8211; preferably without a technical background &#8211; to go through the site and see if they can spot anything that needs changing or fixing.  You will find that they will probably produce a list twice as long as your original checklist!</p>
<p>The beauty of this approach is &#8211; as well as spotting spelling mistakes and other simple errors &#8211; you may also get some <strong>vital</strong> usability feedback, especially if you are with them when they are checking the site.  Do they seem frustrated? Did they use the site in the manner you would expect them to?</p>
<p>I was once fortunate enough to be behind a one-way mirror in a usability testing session and it was simply amazing.  We had a captcha image on a form (I know, I know.. don&#8217;t start) and the error message was misunderstood or found to be confusing by nearly every user.  The abandonment (and frustration) rate on the contact form <a href="http://www.webmasterworld.com/new_web_development/3463891.htm">was therefore extremely high</a>.  This kind of problem would not normally be picked up in smaller projects where a usability testing session is not included (and you wrote the error message &#8211; so find it simple, right?), but if you run through the site with someone to whom the site is fresh, there&#8217;s a much higher chance that you will pick up the problem.  Remember that this issue wouldn&#8217;t be picked up by a checklist either!</p>
<p>So.. checking through a site with somebody non-technical (and who has never seen the site before) can save you a whole bunch of headaches in the future.  And remember &#8211; if you&#8217;re launching your web sites without a <a href="http://www.boxuk.com/blog/the-ultimate-website-launch-checklist">flight check list (check this one out from Box UK)</a>, that&#8217;s probably one of the first things you should consider implementing in your project schedule.  It will save you a lot more support time than it costs you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/php-developers-and-web-design-companies-consider-using-someone-else-to-check-your-work/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

