<?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</title>
	<atom:link href="http://www.edwardyarnold.co.uk/blog/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>Working from home: Month 1</title>
		<link>http://www.edwardyarnold.co.uk/blog/working-from-home-month-1</link>
		<comments>http://www.edwardyarnold.co.uk/blog/working-from-home-month-1#comments</comments>
		<pubDate>Wed, 31 Aug 2011 07:09:01 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Me]]></category>
		<category><![CDATA[Remote Working]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=199</guid>
		<description><![CDATA[I have just completed my first full calendar month of the new teleworking arrangement I have with my current employer, so feel it is a good time to write down some of my feelings and detail my experience thus far.  My arrangement is to work remotely for 3 days of my 5 day week, travelling [...]]]></description>
			<content:encoded><![CDATA[<p>I have just completed my first full calendar month of the new teleworking arrangement I have with my current employer, so feel it is a good time to write down some of my feelings and detail my experience thus far.  My arrangement is to work remotely for 3 days of my 5 day week, travelling in to the office on two consecutive days, typically Wednesday and Thursday.  This tends to break up my week very nicely in to easy chunks: Monday-Tuesday at home, Wednesday-Thursday in office, Friday at home, and then the weekend.  This in itself is one of the biggest advantages in my view; I get 3 &#8216;fresh starts&#8217; per week where I can be ultra-productive.  Rarely do I now get &#8216;that Friday Afternoon feeling!   Following are some tips I have if you are about to start working remotely (and a lot of these points apply to freelance workers too)</p>
<h3><span id="more-199"></span>Tip: Have your own work space or room</h3>
<p>In our house I am fortunate enough to have reserved the &#8216;box room&#8217; bedroom for the sole purpose of serving as my office.  This gives me an opportunity to enter &#8216;a work environment&#8217; and close the door on home (and vice versa at the end of each day).  This focuses the mind on work matters and keeps me from being distracted by the massive amount of DIY work that remains incomplete in our house at the moment.  I recall reading articles before I asked for this arrangement with regards to <a href="http://www.alistapart.com/articles/habit-fields/" target="_blank">habit fields</a>, and really am a believer in this concept.  I think I would find remote-working so much more difficult if I had to sit somewhere that also served as a relaxation area.</p>
<h3>Tip: Set up your working environment properly</h3>
<p>Set up your working environment as if you were in an office for a company.  By this, I mean everything; ranging from the bare bones of your work environment to your software setup.  Actually pay attention to health and safety regulations with regards to monitor and keyboard/mouse use; make sure your chair is correctly adjusted (and is adjustable at all! Don&#8217;t work on a dining chair!) &#8211; in my early days as a freelancer I used to sit on a non-adjustable chair for about 5 hours a day and ended up needing physiotherapy on my lower back as I was in utter agony.</p>
<p>Try not to compromise on your software setup either.  Install the same FTP client you use at work, and configure your IDE or text editor in the same way as your work, including indentation and layout settings; it&#8217;s amazing how a little effort to get the environment consistent can make your life so much easier.  My advice extends to, if possible, having a computer for work and a laptop for pleasure.  This further extends the separation of work time and play time; if this is financially not viable then a good compromise is to have two users on your desktop machine; one for work and one for personal use.  I&#8217;ll bet your bookmarks for work in your bookmarks toolbar are substantially different to the bookmarks for home in your home bookmarks toolbar!</p>
<p><strong>Keep work and pleasure separate in your software environment too</strong></p>
<p>Moving on from that point, I used to have all of my bookmarks for freelancing and general interests in one bookmarks toolbar folder, meaning BBC News was mixed up with the PHP Manual and a bookmark to my phpmyadmin directory.  This made it <em>too easy</em> to see the BBC news bookmark and check the news for 5 minutes.  5 minutes turns in to 10, in to 15, etc.  Now, I keep my bookmarks separate, by using different browsers. I use Mozilla Firefox for work; and Firefox only has my work bookmarks in it, and I use Google Chrome for pleasure; this has my personal bookmarks in it.  Largely I won&#8217;t even use my desktop PC for &#8216;play&#8217; or &#8216;relaxation&#8217; and try to reserve that stuff for my laptop.</p>
<h3>Don&#8217;t get work done in your house when you&#8217;re supposed to be working</h3>
<p>For the first two days of the remote working arrangement we had ongoing building work.  It is very difficult indeed to get good runs of concentration with the noise, and interaction with the tradesmen.  If you&#8217;re having any considerable work done to your house my advice would be, if possible, to go in office for that period.  It&#8217;s much quieter and you&#8217;ll be much more productive.</p>
<h3>Communication</h3>
<p>Assuming you are moving from an office environment, you will be used to being tapped on the shoulder and asked questions, and being asked for updates on the state of work on a fairly regular basis.  Though these distractions are often labelled unnecessary and irritating, they naturally lessen in frequency if you&#8217;re not in the office.  This doesn&#8217;t mean that you should make yourself completely impossible to contact!  I ensured I invested in an unlimited call plan on a home number so that I can call the office as frequently as needed to ask questions to which I need immediate answers, and so that the office have a reliable line on which they can contact me.  Thus far I have more than made good use of the phone line!</p>
<p>Your project manager will largely appreciate frequent, detailed updates of your progress.  There&#8217;s nothing worse than having a developer working for a solid few days with no good indication of where they are at with a project.  It&#8217;s good to say &#8220;all&#8217;s going well and we&#8217;re on time&#8221; and it&#8217;s responsible to inform if you&#8217;re having difficulties and look to be struggling to deliver for the target time.</p>
<h3>Work Time</h3>
<p>Something said fairly frequently to me is &#8220;oh so you can work whenever you want then&#8221;.  I&#8217;m not sure that this is entirely true, and my advice would always be to try to be at your desk between the hours that your office would normally be open (in my case 9am to 5pm).  This means:</p>
<ul>
<li>You are contactable via email and on the phone all day, should you be needed.</li>
<li>You maintain a fairly normal working life and have similar spare time as other people (provided your friends work normal hours!)</li>
<li>You are guaranteed to put in the required number of hours per week.</li>
</ul>
<div>I know that I would find it very difficult, for example, to start working at 1pm and work through to 9pm while all of my friends relax and enjoy themselves.  It&#8217;s easy to maintain the discipline of being &#8216;at work&#8217; from 9 until 5!</div>
<h3>Quick advice for those who do freelance work alongside a full time job</h3>
<ul>
<li>The hours of 9am &#8211; 5pm are strictly your company&#8217;s time.  Make your freelance clients aware of this. Break the rule for <strong>noone</strong>.  <em>In my opinion, to freelance when you&#8217;re being paid to work by someone else is criminal!</em></li>
<li>You will find it much more difficult to motivate yourself to freelance after having spent 8 hours each day working in your own house (I used to find working 12 hour days fairly easy if 8 hours were in-office and 4 hours at home).  My solution to this is to work in my office for work, and to move to the sofa on a laptop to freelance.  This does break slightly from my laptop == pleasure rule but at least gives me some separation in terms of the type of work I do!</li>
</ul>
<h3>Summary</h3>
<p>Overall, it took me a week or two to get in to the swing of working remotely full-time, but I&#8217;ve got there now, and it feels good! I get distracted a lot less on an hour-by-hour basis and feel that I get more done in terms of pure development, and also the three segments to each working week really help me with maintaining my productivity at a high level right from Monday morning to Friday afternoon.  For any employee with the option of working remotely: give it a go, but only if you can separate work and home properly!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/working-from-home-month-1/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Distractions &#8211; a useful Firefox plugin to stop them in their tracks</title>
		<link>http://www.edwardyarnold.co.uk/blog/distractions-a-useful-firefox-plugin-to-stop-them-in-their-tracks</link>
		<comments>http://www.edwardyarnold.co.uk/blog/distractions-a-useful-firefox-plugin-to-stop-them-in-their-tracks#comments</comments>
		<pubDate>Thu, 31 Mar 2011 08:30:34 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=183</guid>
		<description><![CDATA[At work, I occasionally found that if faced with a particularly mundane piece of work, or something that dragged out for a long period of time, it would be quite easy to get distracted by popular sites such as twitter, BBC news, engadget and various other tech-related but not entirely productive sites. I thought &#8220;someone [...]]]></description>
			<content:encoded><![CDATA[<p>At work, I occasionally found that if faced with a particularly mundane piece of work, or something that dragged out for a long period of time, it would be quite easy to get distracted by popular sites such as twitter, BBC news, engadget and various other tech-related but not entirely productive sites.</p>
<p>I thought &#8220;someone else must have had this problem&#8221;, and if they hadn&#8217;t, I was going to write a Firefox Add On to help maintain productivity by blocking distraction web sites.  But, alas, someone has beaten me to it! I have found and installed the <a href="https://addons.mozilla.org/en-US/firefox/addon/leechblock/">LeechBlock</a> Firefox add on and it is fantastic. I&#8217;ve added my favourite sites to a list of sites to block at any time that isn&#8217;t a break time (so here, 9-11, 11.15-1, 1.30-3, 3.15-5) and it&#8217;s proven very effective.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/distractions-a-useful-firefox-plugin-to-stop-them-in-their-tracks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux: How to recursively download contents of an FTP directory</title>
		<link>http://www.edwardyarnold.co.uk/blog/linux-how-to-recursively-download-contents-of-an-ftp-directory</link>
		<comments>http://www.edwardyarnold.co.uk/blog/linux-how-to-recursively-download-contents-of-an-ftp-directory#comments</comments>
		<pubDate>Tue, 08 Mar 2011 18:21:43 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Linux Command Line]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=177</guid>
		<description><![CDATA[I was looking for a quick way to recursively download the entire FTP directory for a site that we are transferring. This was, I found, the easiest and most straightforward way: On the command line interface, assuming you have wget installed, type: wget -r ftp://USERNAME:PASSWORD@mysite.com/ Hit enter and wait while it retrieves everything for you. [...]]]></description>
			<content:encoded><![CDATA[<p>I was looking for a quick way to recursively download the entire FTP directory for a site that we are transferring.  This was, I found, the easiest and most straightforward way:</p>
<p>On the command line interface, assuming you have wget installed, type:</p>
<p><code>wget -r ftp://USERNAME:PASSWORD@mysite.com/</code></p>
<p>Hit enter and wait while it retrieves everything for you.</p>
<p>I did it this way because I didn&#8217;t want to download 4gb of data to upload again, so ran this command direct from the &#8216;production&#8217; server with its stupidly fast internet connection. Hours and hours saved!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/linux-how-to-recursively-download-contents-of-an-ftp-directory/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>Some simple steps on the &#8220;front end&#8221; to reduce web page download time</title>
		<link>http://www.edwardyarnold.co.uk/blog/some-simple-steps-to-reduce-web-page-download-time</link>
		<comments>http://www.edwardyarnold.co.uk/blog/some-simple-steps-to-reduce-web-page-download-time#comments</comments>
		<pubDate>Wed, 14 Jul 2010 07:48:13 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Optimisation]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=125</guid>
		<description><![CDATA[A few years ago, page download time was a big focus for most web developers, as the majority of people connected to the internet were accessing through &#8220;dial up&#8221; connections, which we all remember for their awful connection noises and the horrific download speeds.  But with the development of faster internet connections in the developed [...]]]></description>
			<content:encoded><![CDATA[<p>A few years ago, page download time was a big focus for most web developers, as the majority of people connected to the internet were accessing through &#8220;dial up&#8221; connections, which we all remember for their awful connection noises and the horrific download speeds.  But with the development of faster internet connections in the developed world, the focus on page load times has been sacrificed for nice looking graphics, chunky javascript libraries and massive CSS files.  But there are some quick, simple steps that can be taken to keep all of the improved functionality and look of a web site but reduce the page load time a little.<br />
<span id="more-125"></span><br />
Before I get in to the tips themselves, here are a few basic rules of web site optimisation:</p>
<ul>
<li>HTTP requests are <a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/">expensive in terms of time</a>.  Reducing the number speeds page load time.</li>
<li>Browsers can &#8211; and do &#8211; cache effectively.  Inline CSS and Javascript can&#8217;t be cached for later page requests.</li>
<li>Images can be optimised on the web without any major loss in visual quality.</li>
</ul>
<h2>Javascript Files</h2>
<h3>Minify Them!</h3>
<p>Firstly, remember that if you are including libraries such as jQuery, there are a few ways in which you can do so.  They offer a &#8220;minified&#8221; or &#8220;compressed&#8221; version, which is at least half the size in KB of the uncompressed version.  Given that you are extremely unlikely to need to ever modify the jQuery core, I don&#8217;t see any argument for including the full version of the library, and would choose to include the smaller, minified version every time.</p>
<p>If you have your own javascript files that are particularly hefty, you can minify those for production sites too, by using tools such as <a href="http://www.crockford.com/javascript/jsmin.html">JSMin</a>.  The only problem with doing this is you tend to need to maintain two versions of the file.  The minification process tends to be irreversible so you will need to keep a &#8220;development&#8221; copy of the javascript, just in case you need to make changes or additions in the future.</p>
<h3>Use a Content Delivery Network for your javascript libraries!</h3>
<p>If you want to go one step further, you can include libraries such as jQuery from &#8220;Content Delivery Networks&#8221;.  Here is what wikipedia defines a CDN as:</p>
<blockquote><p>A content delivery network or content distribution network (CDN) is a  system of computers containing copies of data, placed at various points  in a network so as to maximize bandwidth for access to the data from  clients throughout the network</p></blockquote>
<p>Put simply, CDNs are probably much more capable of delivering the javascript files to the web browser accessing your page quickly and reliably than your own server.  Additionally, remember that this means that the CDN is taking some of your bandwidth costs away &#8211; at least 50kb per new visitor.  An additional strange secondary advantage is that it is possible that the user has previously visited a page including the javascript library from the same CDN earlier in their internet browsing session, so it will already be cached in their machine, and will not need to be loaded for a second time.</p>
<p>If you are looking for a quick link to the Google Javascript CDN,  you can access it here:</p>
<p><a href="http://code.google.com/apis/ajaxlibs/">http://code.google.com/apis/ajaxlibs/</a></p>
<h3>Include them only when they are needed!</h3>
<p>Imagine that you have a &#8220;google map&#8221; page on your web site that integrates with the Google Maps API.  You have a fairly chunky 15kb Javascript file that handles your personal Google Maps integration, as well as including Google&#8217;s own API file for the maps.  Why would you want this javascript on every page of the site?  A lot of web developers and designers are guilty of putting the javascript in every single page of the site, which means that the request and corresponding bandwidth associated with the maps integration would be used even if the visitor never viewed that area of the site.</p>
<h2>Images</h2>
<p>This section is going to be quite short, as it isn&#8217;t really my department, but my main understanding is:</p>
<ul>
<li>Adobe Photoshop has a save for web feature. Use it.</li>
<li>Application specific META data is not needed in images on the web (I understand that Adobe Photoshop again can be a devil for this). Remove it if you can!</li>
<li>If you have &#8220;hover&#8221; states on buttons or navigation items, use <a href="http://www.alistapart.com/articles/sprites">CSS Sprites</a> rather than two separate images.  The reasons why are explained in the link supplied, but mainly revolve around making the hover work immediately, and reducing the number of HTTP requests.</li>
</ul>
<h2>CSS</h2>
<p>There are two situations here, really.  The majority of the time, most of the CSS will be used on all of the pages of the site, so it makes sense to make this one external cacheable file.  It is important that the CSS isn&#8217;t included in &lt;style type=&#8221;text/css&#8221;&gt;&lt;/style&gt; tags in the document itself, as this information is not cacheable and will be individually reloaded on the following page.</p>
<p>A lot of sites will include two or three CSS files. One for the site itself, and one for a plugin such as &#8220;lightbox&#8221; or &#8220;slimbox&#8221; or something similar.  If lightbox/slimbox is used on most pages, why not combine the CSS files in to one slightly larger one?  This will reduce the number of HTTP requests and put all of the CSS in to a single cached file.</p>
<p>There is an argument, also, that if there is a particularly complicated section of the web site that takes up 10kb of a CSS file all by itself, then that 10kb of the CSS should be split out in to a separate css file and included only in the complicated section, where it is needed.  This kind of optimisation will need to be assessed on a per-case basis!</p>
<p>Finally, remember that css itself can be written efficiently.</p>
<p>Compare these two blocks of code, which do the same thing, and you will see what I mean!</p>
<p><code><br />
margin-top: 10px;<br />
margin-bottom: 15px;<br />
margin-right: 5px;<br />
margin-left: 2px;<br />
</code></p>
<p><code><br />
margin: 10px 5px 15px 2px;</code></p>
<p>In conclusion, the steps above often take less than an hour to implement on a well built web site, and can save a couple of seconds per page load, and a fair amount of bandwidth costs.  With google&#8217;s <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">recent introduction of a small focus on page load time in terms of a web site&#8217;s ranking</a>, these kind of improvements have more benefits than just making the site appear faster, and are worth paying some attention!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/some-simple-steps-to-reduce-web-page-download-time/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are we there yet?</title>
		<link>http://www.edwardyarnold.co.uk/blog/are-we-there-yet</link>
		<comments>http://www.edwardyarnold.co.uk/blog/are-we-there-yet#comments</comments>
		<pubDate>Thu, 24 Jun 2010 06:31:40 +0000</pubDate>
		<dc:creator>Ed Yarnold</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.edwardyarnold.co.uk/blog/?p=120</guid>
		<description><![CDATA[I recently stumbled upon a blog post at Joel on Software about &#8216;The Iceberg Secret&#8216; &#8211; put simply, Joel explains that non technical people will judge the completeness and effectiveness of an application on the GUI alone.  You can write an amazingly complicated and involving application, put a basic unstyled page as the GUI and [...]]]></description>
			<content:encoded><![CDATA[<p>I recently stumbled upon a blog post at Joel on Software about &#8216;<a href="http://www.joelonsoftware.com/articles/fog0000000356.html">The Iceberg Secret</a>&#8216; &#8211; put simply, Joel explains that non technical people will judge the completeness and effectiveness of an application on the GUI alone.  You can write an amazingly complicated and involving application, put a basic unstyled page as the GUI and it will be assumed to be a very very early instance or to be simply terrible.  Similarly, your user interface guy can put together a beautiful  page littered with graphics &#8211; not linked to anything processing wise &#8211; and the project will be assumed to be &#8216;almost finished&#8217; or at least &#8216;not far off&#8217;.</p>
<p><span id="more-120"></span>I have worked for both technical and non technical people, and can say that it&#8217;s not only whether or not the app is finished that is judged based on the quality of the UI.  A more important factor that is judged is the productivity of the development team.  If you are a developer (which you might be if you&#8217;re reading this blog), you will know that writing models and controllers is particularly time consuming with little &#8220;real time&#8221; reward &#8211; that is,  people who aren&#8217;t programmers can&#8217;t see and don&#8217;t understand the work that you have put in.  Sometimes, this can lead to these people thinking that the programmers are doing nothing but twiddle their thumbs and get excited about charsets, or whatever it is programmers do.</p>
<p>Unfortunately I don&#8217;t think there is a lot that can be done about this, other than perhaps using these two useful analogies.</p>
<ul>
<li><strong>Writing an application is like building a house.</strong> The expensive and time consuming part is the groundwork to prepare the site, the digging of the trenches for the foundations, and the laying of those foundations.  During this time the client thinks that you&#8217;ve just made a big mess and spent lots of their money, and they haven&#8217;t got anything resembling a house to show to anybody.  Additionally, if the foundations aren&#8217;t laid correctly, the reset of the building will be more likely to fail.</li>
<li><strong>An application is like a car</strong>.  It doesn&#8217;t matter how much time the engineers spend perfecting the handling and power delivery of the vehicle.  If it doesn&#8217;t look nice, the majority of people won&#8217;t like it, and even more people would decline the opportunity to buy it.  The engineering team needs to be backed up by a telented designer to make a successful product.</li>
</ul>
<p>The judgement of quality or completeness of an application makes it difficult as a developer to put together any kind of portfolio.  You want your portfolio to *look* good &#8211; in full knowledge that people will judge the sites you have built on look and feel over functionality &#8211; despite the fact that you are not applying for a designer&#8217;s job at all.  But quite often the projects that look the prettiest are the most mundane and simple in terms of technology behind the scenes.  In addition to this, it&#8217;s rare (but not impossible) that you find an interviewer who is genuinely interested or excited by the way that you have achieved things technically, so talking through how you fully integrated your web application with Microsoft Sharepoint won&#8217;t interest them.  After all, all those months of development and there&#8217;s nothing fancy to see, only an &#8220;Update Website from Sharepoint&#8221; button in the web app&#8217;s control panel.  Really, it took 3 months to add that button?  I have a cousin in London who can do that kind of thing in an hour or two.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.edwardyarnold.co.uk/blog/are-we-there-yet/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

