<?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>fav.or.it &#187; Programming</title>
	<atom:link href="http://blog.fav.or.it/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fav.or.it</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sat, 08 Aug 2009 10:51:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Searching for a more Agile, Agile process&#8230;&#8230;</title>
		<link>http://blog.fav.or.it/2008/07/searching-for-a-more-agile-agile-process/</link>
		<comments>http://blog.fav.or.it/2008/07/searching-for-a-more-agile-agile-process/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 13:58:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[fav.or.it]]></category>

		<guid isPermaLink="false">http://blog.fav.or.it/?p=102</guid>
		<description><![CDATA[Agile is a great methodology, and applied right it can make your development process less like a [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F07%2Fsearching-for-a-more-agile-agile-process%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F07%2Fsearching-for-a-more-agile-agile-process%2F" height="61" width="51" /></a></div><p>Agile is a great methodology, and applied right it can make your development process less like a black box, and more open to the stakeholders. It can do wonders for improving the reputation of your dev team with the rest of your company.</p>
<p>However:</p>
<div>There are a few things that make me nervous about the process, I have worked with it at Yahoo, and seen some the ways its original goals can become subverted. </p>
<p>1. It can become the ultimate micromanagement tool, some aspects of agile are a PM&#8217;s wet dream, being able to capture and track exactly the number of hours each team member spends on each each task in a sprint, gives the PM a unique view on progress etc. But it can also become very time driven, with team members feeling pressure to wrap up a task quickly to stay inside the timebox. It can make your team feel like a row of battery hens if not managed sensibly.</p>
<p>I prefer not to assign tasks on a number of hours basis, rather on a complexity and resource basis, in reality the time element is only required to aid in the planning stage for sprint, to ensure they don&#8217;t bite off more than they can chew.  Instead we will assign tasks to Tiny, Small, Medium, Large and Huge timeboxes.</p>
<p>2. What is it with the obsession with statistics and graphs that most agile implementations seem to spawn?, if the process is consuming considerable time in itself producing statistics on a continuous basis, then it is not full-filling its aim. If we are spending more time on documenting the process and its progress than actually doing the work, then something is amiss, so for small teams with good internal communications, you should reduce the stats produced to the bare minimum.</p>
<p>A good ticketing/issue tracker is an absolute essential, and if configured right should produce all the reports that are needed without the need to generate any by hand.</p>
<p>Especially if the PM/SCRUMM master is themselves a productive team member producing work towards the sprint goals.</p>
<p>So i&#8217;m currently designing a bare bones, pared down, minimalist SCRUMM agile process for <a href="http://fav.or.it/">fav.or.it</a>, one that hopefully wont hit the pain points listed above.</p>
<p>I&#8217;ll let you know how we get on&#8230;&#8230;&#8230; </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.fav.or.it/2008/07/searching-for-a-more-agile-agile-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What comes next</title>
		<link>http://blog.fav.or.it/2008/06/what-comes-next/</link>
		<comments>http://blog.fav.or.it/2008/06/what-comes-next/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 20:49:19 +0000</pubDate>
		<dc:creator>Nick Halstead</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.fav.or.it/2008/06/06/what-comes-next/</guid>
		<description><![CDATA[We have taken down the main fav.or.it service while we upgrade to the new version. What is [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F06%2Fwhat-comes-next%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F06%2Fwhat-comes-next%2F" height="61" width="51" /></a></div><p>We have taken down the main fav.or.it service while we upgrade to the new version. What is included? Well I will not ruin the surprise but we believe it is a generation shift for social news and the way we all interact with blogs. Although a selected few have had the chance to preview the reader what we are about to release is the next step in our evolution. This will be the culmination of all our efforts over the last year and we are very excited that it is now very near to launch. &lt;!&#8211; more &#8211;&gt;</p>
<h2>Not Closed</h2>
<p>The other important aspect is that when this goes live, it will be live for everyone! The product will still be in beta (and likely to stay that way for several months) but we hope that it is going to have something for everyone.</p>
<p>Keep an eye on this blog for updates or follow me on <a href="http://www.twitter.com/nickhalstead">twitter</a> to get the latest news on the new release.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fav.or.it/2008/06/what-comes-next/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fixing Twitter</title>
		<link>http://blog.fav.or.it/2008/05/fixing-twitter/</link>
		<comments>http://blog.fav.or.it/2008/05/fixing-twitter/#comments</comments>
		<pubDate>Mon, 26 May 2008 21:58:43 +0000</pubDate>
		<dc:creator>Nick Halstead</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.fav.or.it/2008/05/26/fixing-twitter/</guid>
		<description><![CDATA[I am getting sick of talk about twitter and it&#8217;s scalability problems and also frankly unqualified people [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F05%2Ffixing-twitter%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F05%2Ffixing-twitter%2F" height="61" width="51" /></a></div><p>I am getting sick of talk about twitter and it&#8217;s scalability problems and also frankly unqualified people slagging the service for it&#8217;s unreliability and also coming up with stupid ignorant answers to how it should be fixed.<br />
<span id="more-29"></span><br />
As part of our future we do see a many-to-many problem arising so I put some thought to how we would tackle it (like any of our other problems) by doing some &#8216;planning&#8217;.</p>
<p>In a recent post Robert Scoble tries to explaining how <a href="http://scobleizer.com/2008/05/26/should-services-charge-super-users/">twitter works</a> by saying that twitter is using some form of &#8216;<a href="http://en.wikipedia.org/wiki/Pivot_table">pivot table</a>&#8216; &#8211; (my terminology for what he explains) and says that a model that others have put forward (i.e. a de-normalized system of inserting messages into everyones queues) was akin to microsoft exchange, now these two examples are so horribly not connected &#8211; and I won&#8217;t rant about how BAD exchange is efficiency wise, but please Robert do not get into any technical arguments please.</p>
<h2>How it should be done</h2>
<p>So what did I come up with for solving the many-to-many problem?</p>
<p>Firstly let me explain my terminology, I use the term &#8217;shard&#8217; because a shard could be a physical server or a daemon running alongside other daemon&#8217;s running on a server or even a grid platform.</p>
<p>The basic idea is to build a system in which no one particular element is unscalable. So the design takes into account that however big things get just larger numbers of shards would be required.</p>
<p>First a diagram (which I hope makes some sense of the complexity described below)<br />
<img src="http://blog2.fav.or.it/wp-content/uploads/2008/05/tweetshards.jpg" alt="tweetshards.jpg" /></p>
<h2>Queue Shard</h2>
<p>The queue shard stores the message queue for a set number of users the shard would be found by a hashing mechanism that would map the user id to the particular user. The queue system would use a purely in-memory storage that would allow the for the really fast insertion speeds that would required.</p>
<p>The other really important point to make is that this server is only dealing with dates and the id of the tweet that it references (tweet id&#8217;s covered below)</p>
<h2>Friend Shard</h2>
<p>The friend shard stores the friends list for a number of users, this is likely to be a larger number of users per shard than the queue shard purely because its job is a lot easier. So lets say each shard can work with 100,000 users. When this shard gets told about a new message for a user it looks up its list of friends.</p>
<p>Then using the hashing algorithm that maps each user id to a specific queue shard it builds up a list of friends that live on each of those queue shards.</p>
<p>So in the extreme example of Robert Scoble of 25k friends we hope to split up the task so that no queue shard would have to deal with more than 1000 inserts.</p>
<h2>Joiner Shard</h2>
<p>Because we are only storing the id&#8217;s of each tweet in the queue when a query comes in for a stream we fetch the list of the 20 (or however many) tweets from the queue shard for that particular user then we need to go get each actual text tweet from a tweet shard. The joiner shard would very likely use a memcache (across a lot of servers) so that the tweet storage would get hit as little as possible.</p>
<p>The second thing to note is that as described the queue shards are in-memory only &#8211; they are storing data very inefficiently (e.g. totally de-normalized) but it would be a serious overhead for them to store to disk. The joiner shard would need to be able to cope with only getting partial results back from the queue shard &#8211; and then have to look it up from the &#8216;normalized&#8217; version of the database (described below)</p>
<h2>Tweet Shards</h2>
<p>When new tweets come in they are stored in a tweet shard, we use a hash algorithm to spread them across a set number of servers. The algorithm should take into account that over time tweets get moved onto archive servers which are designed more for mass storage rather than quick retrieval.</p>
<h2>Normalized Queue Storage</h2>
<p>Because the in-memory queue shards are very fast but very inefficient it would be not sensible to store more than a weeks worth of data in them (and maybe even less) &#8211; as the many-to-friendlist-to-queue system even when stored just using id&#8217;s is still a large storage overhead compared with storing the data in a standard pivot/normalized style. So for every request that comes in it is also passed into this shard to be archived and also for when you do get the rare request for older data.</p>
<h2>Web Shard</h2>
<p>This is the easy bit, the other shards described so far have all done the complex database work, the web shard is responsible for dealing with the actual requests be they API / HTTP / whatever, and then pass on the request into the relevant other shards.</p>
<p>I will describe below the order in which the shards are called for particular actions (the two that are most common)</p>
<p><strong>Sending a Tweet</strong><br />
The following is a rough step list of how a new tweet gets insert into the database.</p>
<ol>
<li>Web Shard &#8211; Receives the request &#8211; First it sends a request off to the Tweet shard to store the message itself which then returns an ID that will then be used for all the other requests. Then it looks up which friend shard stores the particular user that the request is coming from.
<ol>
<li><em>Tweet Shard</em> &#8211; Receives message to store the tweet and returns the new ID</li>
</ol>
</li>
<li><em>Friend Shard</em> &#8211; Receives the message &#8211; then sends out signals to all the relevant queue shards for all the friends of that user.</li>
<li><em>Queue Shard</em> &#8211; Gets a list of friends (that it deals with) and inserts the id of the message into each of their queues.</li>
<li><em>Normalized Queue Shard</em> &#8211; We also store the data in this archive database for long term storage (and slow retrieval)</li>
</ol>
<p><strong>Building the Stream</strong><br />
This is a few short steps of how we build up a stream for a particular user.</p>
<ol>
<li><em>Web Shard</em> &#8211; Receives the request &#8211; sends a request to a joiner shard asking for the stream for that user</li>
<li><em>Joiner Shard</em> &#8211; Looks up which queue shard has the data it is looking for &#8211; gets the list of id&#8217;s &#8211; then looks up those messages within the tweet shards &#8211; it then puts them together and returns them back to the web shard</li>
<li><em>Tweet Shard</em> &#8211; Returns the actual text tweets</li>
</ol>
<p>The above could be more complex in circumstances when the data is not available within the queue shards &#8211; or within the tweet shards &#8211; at which point they both seamlessly go look up the data in the archive instead.</p>
<h2>Conclusion</h2>
<p>This looks complex &#8211; (well it is..) but in general terms of complexity of building large scale web applications this is pretty simple stuff (fav.or.it has far more complex problems!). I understand that the twitter people now have the extremely hard task of slowly improving each module rather than a complete redesign. Whatever the future I wish them well. btw &#8211; if you want you can follow me (and fav.or.it&#8217;s exploits) via my <a href="http://www.twitter.com/nickhalstead">twitter feed</a></p>
<p>(just as an aside &#8211; the fav.or.it blog will be going through a major overhaul soon and more of our wonderful employees we start posting (they already have their own individual persona blogs) so we have had to cater for this in our new design, but fear not we will also be splitting up the feed so if you only want product updates you can still have that, if you want development/tips/programmer/design stuff you will also have the option to subscribe to an overall feed or to individual topics.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fav.or.it/2008/05/fixing-twitter/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>fav.or.it API &#8211; The future of comment distribution</title>
		<link>http://blog.fav.or.it/2008/01/favorit-api-the-future-of-comment-distribution/</link>
		<comments>http://blog.fav.or.it/2008/01/favorit-api-the-future-of-comment-distribution/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 22:24:48 +0000</pubDate>
		<dc:creator>Nick Halstead</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[api]]></category>

		<guid isPermaLink="false">http://blog.fav.or.it/2008/01/07/favorit-api-the-future-of-comment-distribution/</guid>
		<description><![CDATA[The fav.or.it API is designed to allow access to many of it&#8217;s core services. The first round [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F01%2Ffavorit-api-the-future-of-comment-distribution%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F01%2Ffavorit-api-the-future-of-comment-distribution%2F" height="61" width="51" /></a></div><p>The fav.or.it API is designed to allow access to many of it&#8217;s core services. The first round of exposed requests allow comments to be distributed from external clients through fav.or.it back to the host of the specified blog. It is our desire that by opening up our core platform that we start a new flow of comments around the blogosphere and that by doing so everyone will benefit from a &#8216;better conversation&#8217;. The API will become available for testing sometime this week, we will make a further announcement when it is ready. We hope that this documentation will allow you to get started on developing exciting applications.</p>
<p>For full documentation on the API we have a <a href="http://groups.google.com/group/favorit-development-talk/web/api">Google Group</a> which has detailed description of each request and more detailed information on all our services.</p>
<p><strong>Suggested uses:</strong></p>
<ul>
<li>Give commenting functionality to PC/Based RSS Readers</li>
<li>Extending web based RSS Readers</li>
<li>Send comments from embedded widgets</li>
<li>Supply comments from external blogs (that fav.or.it cannot aggregate)</li>
</ul>
<h2>The API</h2>
<p>fav.or.it exposes many of it&#8217;s data services via an application programming interface (API). Developers and power users may sign up for access the API by registering with fav.or.it and agree to our terms of service to use fav.or.it services and data in their applications.</p>
<h2>RESTful Resources</h2>
<p>The fav.or.it API tries to conform as much as possible to the design principles of Representational State Transfer (REST). You’ll find that you can simply change the file extension on almost any request to get results in the format of your choice. This document notes which formats are available for each method.</p>
<p>fav.or.it presently supports the following data formats: XML, JSON, and PHP (serialized)</p>
<h2>Identity Management</h2>
<p>fav.or.it has an internal identity system that allows the mapping of multiple identities from external providers onto a single fav.or.it user. Within fav.or.it a user may identify themselves across multiple services which then links any incoming comments/posts as being owned by that user.</p>
<p>The following services can be authenticated by fav.or.it &#8211; we will be announcing further services in the near future.</p>
<ul>
<li>openid</li>
<li>twitter</li>
<li>blogger (blogspot)</li>
<li>wordpress.com</li>
<li>bloglines</li>
</ul>
<h2>Partner Services</h2>
<p>A partner service is any external site that supplies fav.or.it with authenticated data. In most cases this means supplying authenticated comments from their own user base. fav.or.it has an internal identity management system that allows the mapping of multiple identities across comment systems. If you are interested in becoming a partner service please get in touch.</p>
<h2>Parameters</h2>
<p>Some API methods take optional or requisite parameters. Where applicable, we’ve documented those parameters. Remember to convert to UTF-8 and URL encode parameters that take complex strings.<br />
HTTP Requests</p>
<p>Unless otherwise noted, methods exposed by the fav.or.it API require a GET request. Methods that post new comments require a POST.  Where noted, some API methods will return different results based on HTTP headers sent by the client.</p>
<h2>Rate Limiting</h2>
<p>Public clients are allowed 500 requests in a 24 hour time period, starting from their first request. Notification that a client has exceeded the rate limit will be sent as JSON,XML or PHP when either is the requested format, and otherwise will be sent in plain text.</p>
<h2>Example XML failure</h2>
<pre lang="PHP" line="1">
<?xml version="1.0" encoding="UTF-8" ?>
<result>
  <status>failure</status>
  <reason>missing param 'comment_id'</reason>
</result>
</pre>
<h2>Spam</h2>
<p>fav.or.it takes spam very seriously and will not tolerate spam sent through it&#8217;s API. Our community + technologies identify spam before it is forwarded onto external blogs.</p>
<p>In the case of persistent spamming an API Key will be disabled along with the account that it is associated with.</p>
<h2>Requests</h2>
<ul>
<li><a href="http://groups.google.com/group/favorit-development-talk/web/sendcomment">sendcomment</a></li>
<li><a href="http://groups.google.com/group/favorit-development-talk/web/sendcommentas">sendcommentas</a></li>
<li><a href="http://groups.google.com/group/favorit-development-talk/web/commentstatus">commentstatus</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fav.or.it/2008/01/favorit-api-the-future-of-comment-distribution/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>fav.or.it needs you!</title>
		<link>http://blog.fav.or.it/2008/01/favorit-needs-you/</link>
		<comments>http://blog.fav.or.it/2008/01/favorit-needs-you/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 11:03:08 +0000</pubDate>
		<dc:creator>Nick Halstead</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[recruitment]]></category>

		<guid isPermaLink="false">http://blog.fav.or.it/2008/01/02/favorit-needs-you/</guid>
		<description><![CDATA[Talented Web Developer
It is the new year and we are looking for talented web developers to join [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F01%2Ffavorit-needs-you%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.fav.or.it%2F2008%2F01%2Ffavorit-needs-you%2F" height="61" width="51" /></a></div><h2>Talented Web Developer</h2>
<p>It is the new year and we are looking for talented web developers to join our development team working on <a href="http://fav.or.it">fav.or.it</a>. We are preferably looking for PHP 5 developers but will cross-train from Perl/Ruby/Python. We are looking for pure programming skills first and foremost so if your not an uber-geek who can do hex calculations in your head then don&#8217;t bother applying. The winner gets all the monitors they desire, the best development tools and a great start-up environment.</p>
<p>This a fantastic opportunity to get involved with an exciting project and make a real difference to the landscape of blogosphere.</p>
<h2>Essential skills</h2>
<ul>
<li>Triple ‘A’ Programming skills in any of the following (PHP, Ruby, Perl)</li>
</ul>
<h2>Desirable skills</h2>
<ul>
<li>PHP 5 (OO)</li>
<li>Experience with one of the following PHP Frameworks</li>
<li>CakePHP</li>
<li>Zend Framework</li>
<li>Symphony</li>
<li>XHTML, CSS, JavaScript, DHTML/AJAX, XML</li>
<li>MySQL relational DB design</li>
<li>Linux, Apache, MySql administration</li>
<li>XML-RPC</li>
<li>Code versioning tools (Subversion, CVS)</li>
</ul>
<h2>Role Involves</h2>
<ul>
<li>Development, maintenance and support of new functionalities</li>
<li>Analysis of business and user requirements and production of functional specifications;</li>
<li>Project implementation from inception through development and support;</li>
<li>Testing of web functionality;</li>
<li>Resolving problems on specific platforms.</li>
</ul>
<h2>Location: Reading (UK)</h2>
<p>Salary based upon experience</p>
<p>Send CV&#8217;s + Sample of code to <img src='http://blog.assembleron.com/wp-content/2008/01/recruitment.jpg'/></p>
<h2>Find A Geek &#8211; Get Paid!</h2>
<p>We are also paying a £500 finders fee if you introduce someone to us that we then hire.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fav.or.it/2008/01/favorit-needs-you/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Finding Developers</title>
		<link>http://blog.fav.or.it/2007/11/finding-developers/</link>
		<comments>http://blog.fav.or.it/2007/11/finding-developers/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 09:49:09 +0000</pubDate>
		<dc:creator>Nick Halstead</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[recruitment]]></category>

		<guid isPermaLink="false">http://blog.fav.or.it/2007/11/05/finding-developers/</guid>
		<description><![CDATA[Looking for a new job? Based in the UK? Want to work for one of the hottest [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.fav.or.it%2F2007%2F11%2Ffinding-developers%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.fav.or.it%2F2007%2F11%2Ffinding-developers%2F" height="61" width="51" /></a></div><p>Looking for a new job? Based in the UK? Want to work for one of the hottest start-ups in the web arena? Count yourself as one of the top Ruby/PHP/Perl/Python programmers? We are looking for a Senior Web Developer to work on <a href="http://fav.or.it">fav.or.it</a> and help shape the future of the blogosphere.</p>
<p>If you know someone who is looking for a job and thinks fits the description we will give you a £250 finders fee if they accept the job (and stick around long enough to work out where the toilets are e.g. 8 weeks)</p>
<h2>Senior Web Developer</h2>
<p>We are looking for very experienced web developer, if you cannot name ten web technologies off the top of your head you&#8217;re not the right person for us. Building large structured code must be<br />
your bread and butter and being at the cutting edge of web development your goal.</p>
<p>You will be working on a very exciting project with massive global potential, your contributions will help shape the future of the blogosphere and how the mass market interacts with it.</p>
<p>We are preferably looking for PHP 5 experience but are happy to work with anyone who understands the web programming space and is willing to quickly learn a new language.</p>
<h2>Essential skills</h2>
<ul>
<li>Triple &#8216;A&#8217; Programming skills in any of the following (PHP, Ruby, Perl)</li>
</ul>
<h2>Desirable skills</h2>
<ul>
<li>PHP 5 (OO)</li>
<li>Experience with one of the following PHP Frameworks
<ul>
<li>CakePHP</li>
<li>Zend Framework</li>
<li>Symphony</li>
</ul>
</li>
<li>XHTML, CSS, JavaScript, DHTML/AJAX, XML</li>
<li>MySQL relational DB design</li>
<li>Linux, Apache, MySql administration</li>
<li>XML-RPC</li>
<li>Code versioning tools (Subversion, CVS)</li>
</ul>
<h2>Role Involves</h2>
<ul>
<li>Development, maintenance and support of new functionalities</li>
<li>Analysis of business and user requirements and production of functional specifications;</li>
<li>Project implementation from inception through development and support;</li>
<li>Testing of web functionality;</li>
<li>Resolving problems on specific platforms.</li>
</ul>
<p>Location: Reading<br />
Salary £35,000 to £50,000 + share options<br />
<br />
To apply for this role send your CV to <img src='http://blog2.fav.or.it/wp-content/uploads/2007/10/jobs.gif' /> or use my contact form.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fav.or.it/2007/11/finding-developers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
