<?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>Richard Lord &#187; Best practice</title>
	<atom:link href="http://www.richardlord.net/blog/tag/best-practice/feed" rel="self" type="application/rss+xml" />
	<link>http://www.richardlord.net</link>
	<description>Actionscript/Flex, PHP and Java developer</description>
	<lastBuildDate>Mon, 23 Jan 2012 17:07:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The I in Interface</title>
		<link>http://www.richardlord.net/blog/the-i-in-interface</link>
		<comments>http://www.richardlord.net/blog/the-i-in-interface#comments</comments>
		<pubDate>Thu, 06 Aug 2009 14:44:04 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Best practice]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/the-i-in-interface</guid>
		<description><![CDATA[<p>I'm often asked why the interfaces in <a href="http://flintparticles.org">Flint</a> don't start with a letter I. The simple reason is that I think this practice, while common among Actionscript developers, is so seriously flawed that it's better not to do it, even if it is common among other developers and may cause some initial confusion for some...</p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m often asked why the interfaces in <a href="http://flintparticles.org">Flint</a> don&#8217;t start with a letter I. The simple reason is that I think this practice, while common among Actionscript developers, is so seriously flawed that it&#8217;s better not to do it, even if it is common among other developers and may cause some initial confusion for some.</p>

<h3>The argument for</h3>

<p>The only argument I&#8217;ve heard in favour of this practice is that it enables a developer to know whether a type is a class or an interface just by looking at the name, but I&#8217;m not convinced.</p>

<h3>It&#8217;s more confusing</h3>

<p>Looking through the core Actionscript classes, I do a double-take at classes like ID3Info &#8211; (What&#8217;s a D3Info? Oh, it&#8217;s a class not an interface.)</p>

<p>Or, consider what might happen if you were creating an application that interacts with mobile phones. You are very likely to have a type called IPhone. But is that a standard phone interface that all phone classes should implement? Or is it a class for the iPhone implementation?</p>

<h3>Same name, different type</h3>

<p>And it&#8217;s not just confusion over whether something is an interface or not. What makes a class an EventDispatcher? Is it any type that extends EventDispatcher, or is it any type that implements IEventDispatcher. The I is just a prefix indicating that a type is an interface, so we have two EventDispatcher types. Without the I prefix this wouldn&#8217;t be possible.</p>

<h3>But we copied it from Java, didn&#8217;t we?</h3>

<p>Actionscript developers have adopted the I prefix because Adobe did so. But why did Adobe adopt this idea? Common thinking is that they adopted the idea from the Java community, which sounds plausible. Many of the ideas in Actionscript originated in other languages.</p>

<p>However, using an I prefix on interfaces isn&#8217;t a standard in Java. In fact, it&#8217;s just the opposite. Look at any of the <a href="http://java.sun.com/javase/6/docs/api/">Java core api</a>, or any other code developed by Sun, and you&#8217;ll not see an I prefix on the interfaces. And it&#8217;s not just Sun, many other large Java development companies don&#8217;t use the I prefix (<a href="http://code.google.com/p/google-guice/">Google, for example</a>). Far from being a Java standard, the I prefix is an aberration adopted in some corners of the Java world, possibly by ex-Microsoft developers.</p>

<h3>Hungarian Notation</h3>

<p>Why ex-Microsoft developers? Because Microsoft used to use <a href="http://msdn.microsoft.com/en-us/library/aa260976(VS.60).aspx">Hungarian Notation</a> in all their code (Charles Simonyi, who invented Hungarian Notation, became chief architect at Microsoft). The reason Hungarian Notation works is because it requires every name to have a prefix. So iPhone is the Phone interface (i prefix for interface) and cIPhone is the IPhone class (c prefix for class).</p>

<h3>Mixing it</h3>

<p>Problems occur when only some names have prefixes, as with the I prefix for interfaces and no prefix for classes. Unfortunately, this is the pattern that Adobe have adopted for Actionscript (and that Microsoft have adopted for C#, but even C# isn&#8217;t perfect).</p>

<h3>So&#8230;</h3>

<p>This is why I don&#8217;t use the I prefix on interfaces in any of my code, including Flint.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/the-i-in-interface/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Continuous learning</title>
		<link>http://www.richardlord.net/blog/continuous-learning</link>
		<comments>http://www.richardlord.net/blog/continuous-learning#comments</comments>
		<pubDate>Tue, 02 Jun 2009 08:49:56 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/continuous-learning/</guid>
		<description><![CDATA[<p>I'm often asked what is the secret to being a good programmer, and the simple answer is to keep studying and learning throughout your career. If you're not currently learning something, then you're holding up your development. This morning, <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=259358">Bruce Eckel wrote a lot more about this. Read it at his blog.</a></p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m often asked what is the secret to being a good programmer, and the simple answer is to keep studying and learning throughout your career. If you&#8217;re not currently learning something, then you&#8217;re holding up your development. This morning, <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=259358">Bruce Eckel wrote a lot more about this. Read it at his blog.</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/continuous-learning/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Law of Demeter</title>
		<link>http://www.richardlord.net/blog/law-of-demeter</link>
		<comments>http://www.richardlord.net/blog/law-of-demeter#comments</comments>
		<pubDate>Fri, 24 Apr 2009 08:32:59 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>
		<category><![CDATA[Law of Demeter]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/law-of-demeter/</guid>
		<description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Law_of_Demeter">The Law of Demeter</a> sounds grand and perhaps a little difficult, but in fact it's a very simple, basic principle of good programming style. It's also a principle that all actionscript developers can apply, whatever their level of skill, to improve the quality and maintainability of their code. <a href="http://www.as3dp.com/2009/04/23/design-pattern-principles-for-actionscript-30-the-least-knowledge-principle/">Bill Sanders describes it on his blog</a>. Read it, then apply it.</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Law_of_Demeter">The Law of Demeter</a> sounds grand and perhaps a little difficult, but in fact it&#8217;s a very simple, basic principle of good programming style. It&#8217;s also a principle that all actionscript developers can apply, whatever their level of skill, to improve the quality and maintainability of their code. <a href="http://www.as3dp.com/2009/04/23/design-pattern-principles-for-actionscript-30-the-least-knowledge-principle/">Bill Sanders describes it on his blog</a>. Read it, then apply it.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/law-of-demeter/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Writing Software is Like &#8230; Writing</title>
		<link>http://www.richardlord.net/blog/writing-software-is-like-writing</link>
		<comments>http://www.richardlord.net/blog/writing-software-is-like-writing#comments</comments>
		<pubDate>Wed, 22 Apr 2009 07:50:50 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/writing-software-is-like-writing/</guid>
		<description><![CDATA[<p>I was going to comment on <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=255898">this post by Bruce Eckel</a>, but find I have nothing to add. <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=255898">Go read it.</a></p>]]></description>
			<content:encoded><![CDATA[<p>I was going to comment on <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=255898">this post by Bruce Eckel</a>, but find I have nothing to add. <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=255898">Go read it.</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/writing-software-is-like-writing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technical Debt</title>
		<link>http://www.richardlord.net/blog/technical-debt</link>
		<comments>http://www.richardlord.net/blog/technical-debt#comments</comments>
		<pubDate>Mon, 02 Mar 2009 09:11:17 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/technical-debt/</guid>
		<description><![CDATA[<p>It seems particularly relevant during this credit crunch to be talking about <a href="http://martinfowler.com/bliki/TechnicalDebt.html">Technical Debt</a> - the debt you owe when implementing a solution in a quick and dirty way, which accrues interest every time you need to alter or add to the code, and can be paid off by taking tome to refactor the code...</p>]]></description>
			<content:encoded><![CDATA[<p>It seems particularly relevant during this credit crunch to be talking about <a href="http://martinfowler.com/bliki/TechnicalDebt.html">Technical Debt</a> &#8211; the debt you owe when implementing a solution in a quick and dirty way, which accrues interest every time you need to alter or add to the code, and can be paid off by taking time to refactor the code.</p>

<p>The metaphor is particularly useful when trying to balance the desire to create maintainable code with business demands for quick results. Incurring the debt may be a sensible, strategic business decision, but one should always plan on paying off the debt later, and how much later affects the interest payments accrued in the meantime.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/technical-debt/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hiring developers</title>
		<link>http://www.richardlord.net/blog/hiring-developers</link>
		<comments>http://www.richardlord.net/blog/hiring-developers#comments</comments>
		<pubDate>Wed, 25 Feb 2009 09:28:51 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/hiring-developers/</guid>
		<description><![CDATA[<p><a href="http://www.codinghorror.com/blog/archives/001227.html">A recent post by Jeff Atwood</a> reminds us why you should avoid, at all cost, hiring poor developers. A poor developer will pull the whole team down, often producing negative productivity due to their impact on the rest of the team (and on the codebase)...</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codinghorror.com/blog/archives/001227.html">A recent post by Jeff Atwood</a> reminds us why you should avoid, at all cost, hiring poor developers. A poor developer will pull the whole team down, often producing negative productivity due to their impact on the rest of the team (and on the codebase). So when hiring the rule should be &#8220;if in doubt, say no&#8221;. When I forget this, <a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html">I turn back to Joel Spolsky for a reminder</a>. Then Steve Yegge, whose blog I love reading, for <a href="http://steve-yegge.blogspot.com/2008/06/done-and-gets-things-smart.html">his inevitable twist on the subject</a>.</p>

<p>This is particularly pertinent at the moment since one of my clients is looking to hire a Flex developer and I&#8217;m helping out with the interview process. (If you&#8217;re an experienced Flex developer in London and want to be considered, <a href="/contact">drop me a line</a>. I can&#8217;t promise to reply to everyone, but I&#8217;ll pass your details on to my client.)</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/hiring-developers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Garbage Collection</title>
		<link>http://www.richardlord.net/blog/garbage-collection</link>
		<comments>http://www.richardlord.net/blog/garbage-collection#comments</comments>
		<pubDate>Tue, 12 Aug 2008 07:53:08 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Best practice]]></category>
		<category><![CDATA[Flint]]></category>
		<category><![CDATA[Garbage collection]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Particles]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/garbage-collection/</guid>
		<description><![CDATA[<p>I recently received a support query on Flint regarding garbage collection. In discussions on the forum I was reminded that many Actionscript developers don't know how the Flash Player's garbage collection works...</p>]]></description>
			<content:encoded><![CDATA[<p>I recently received a support query on <a href="http://flintparticles.org/">Flint</a> regarding garbage collection. In discussions on the <a href="http://flintparticles.org/forum">forum</a> I was reminded that many Actionscript developers don&#8217;t know how the Flash Player&#8217;s garbage collection works.</p>

<p>For some developers that&#8217;s not a problem since memory use is quite low on lots of web sites, and all the memory is freed when a user leaves the web site anyway. However, with the development of rich applications on the web and in Air, garbage collection is becoming an issue that more developers need to understand.</p>

<p>I was going to write a long post explaining garbage collection, but Grant Skinner got there two years before me. Here&#8217;s his useful series about <a href="http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html">resource management in Flash</a>.</p>

<p>When you&#8217;ve read that, this more recent post by Sean Christmann adds further insight &#8211; <a href="http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/">Kick starting the garbage collector</a>.</p>

<p>Now there&#8217;s no excuse for leaving trash lying around.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/garbage-collection/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Password Security</title>
		<link>http://www.richardlord.net/blog/php-password-security</link>
		<comments>http://www.richardlord.net/blog/php-password-security#comments</comments>
		<pubDate>Wed, 10 Oct 2007 15:45:34 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>
		<category><![CDATA[Free code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/php-password-security/</guid>
		<description><![CDATA[<p>If you build websites that require users to register it's your responsibility to keep their passwords safe. And if you're storing the passwords in plain text then you're not doing your job properly. What happens if your database is stolen? It's not just your site that is compromised. Since most users use the same password on multiple sites, all those sites have also been compromised...</p>]]></description>
			<content:encoded><![CDATA[<p>If you build websites that require users to register it&#8217;s your responsibility to keep their passwords safe. And if you&#8217;re storing the passwords in plain text then you&#8217;re not doing your job properly. It may be that, <a href="http://reddit.com/info/usqe/comments/cuugl">like Reddit</a>, you think that storing passwords in plain text leads to a better user experience. I happen to agree with you. But then, like Reddit, what happens if your database is stolen? It&#8217;s not just your site that is compromised. Since most users use the same password on multiple sites, all those sites have also been compromised.</p>

<p>No data is entirely secure, and if anyone else has access to your webserver (the company managing the server for you?) or your database (the company storing the backups?) then you don&#8217;t have total control over the security anyway. So there&#8217;s always a chance your database could be stolen. So, the simple rule is to hash your passwords.</p>

<h3>Hashing</h3>

<p>A hash is a string derived from the original password via a one-way algorithm. In other words, it&#8217;s easy to create the hash from the original, but harder (when used for security, ideally impossible) to create the original from the hash. You store the hash in the database, and when the user signs-in you hash the password they sign-in with and compare it to the hash in the database. Something like this</p>

<pre class="code">if( $user->passwordhash == sha1( $_POST['password'] ) )</pre>

<p>That way, you never store the user&#8217;s password.</p>

<p>There are a number of hashing algorithms in PHP, of which md5 and sha1 are the most commonly used. Unfortunately, neither is as secure as they were once thought to be. It would be better to use a more secure hash, and if you have the Hash engine in your PHP installation (included by default since PHP 5.1.2) then you have access to many more algorithms. So a better example would be</p>

<pre class="code">if( $user->passwordhash == hash( 'whirlpool', $_POST['password'] ) )</pre>

<h3>Rainbow tables</h3>

<p>But there&#8217;s another problem. Once your database is stolen, the thief has plenty of time to crack the passwords using a simple <a href="http://www.codinghorror.com/blog/archives/000949.html">Rainbow Table attack</a>. This involves creating a large selection of hashes based on likely passwords (e.g. every word in the dictionary) and then comparing the hashes with the hashes in your database. Within an hour or so, half the passwords in your database will probably have been cracked.</p>

<p>To prevent this you should salt each password by adding a random string to it (called a salt or nonce). The time consuming part of a rainbow table attack is building the dictionary of hashes. Adding a random salt to the password means the thief has to build a whole new dictionary of hashes for each salt, making a rainbow table attack too time consuming to be viable. Each password should have a different salt, and the salt doesn&#8217;t even need to be secret.</p>

<h3>The Code bit</h3>

<p>So, for secure passwords you need code that looks something like this</p>

<pre class="code">// get a new salt - 8 hexadecimal characters long
// current PHP installations should not exceed 8 characters
// on dechex( mt_rand() )
// but we future proof it anyway with substr()
function getPasswordSalt()
{
    return substr( str_pad( dechex( mt_rand() ), 8, '0',
                                           STR_PAD_LEFT ), -8 );
}

// calculate the hash from a salt and a password
function getPasswordHash( $salt, $password )
{
    return $salt . ( hash( 'whirlpool', $salt . $password ) );
}

// compare a password to a hash
function comparePassword( $password, $hash )
{
    $salt = substr( $hash, 0, 8 );
    return $hash == getPasswordHash( $salt, $password );
}

// get a new hash for a password
$hash = getPasswordHash( getPasswordSalt(), $password );</pre>

<p>You don&#8217;t have to attach the salt to the hash, you can instead store them separately within the database, but I like keeping them together in a single string. Equally, the salt needn&#8217;t be in hexadecimal, but I like the symmetry with the hexadecimal hash.</p>

<p>Finally, <a href="http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/">as Thomas Ptacek points out</a>, you don&#8217;t want the fastest hash algorithm in the world for this &#8211; a fast algorithm is more useful to an attacker than it is to you.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/php-password-security/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Singleton Factory</title>
		<link>http://www.richardlord.net/blog/singleton-factory</link>
		<comments>http://www.richardlord.net/blog/singleton-factory#comments</comments>
		<pubDate>Fri, 27 Jul 2007 12:55:11 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Best practice]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[Free code]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/singleton-factory/</guid>
		<description><![CDATA[<p>I've mentioned before how I <a href="/blog/better-without-singletons/">dislike the Singleton pattern</a>... So this morning I was experimenting with various other possible ways to create singletons in Actionscript 3 and came up with a function that can be used to create and reuse a single instance of any class. I don't know how useful it will turn out to be but here it is. It's also a useful example of a package level function...</p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve mentioned before how I <a href="/blog/better-without-singletons">dislike the Singleton pattern</a>. One of my issues is encapsulating the single instance nature of the pattern within the class, when most often the requirement for only one instance is not a feature of the class but a feature of the application that is using the class.</p>

<p>So this morning I was experimenting with various other possible ways to create singletons in Actionscript 3 and came up with a function that can be used to create and reuse a single instance of any class. I don&#8217;t know how useful it will turn out to be but here it is. It&#8217;s also a useful example of a package level function.</p>

<pre class="code">package
{
    function Singleton( c:Class ):*
    {
        for( var i:String in instances )
        {
            if( instances[i].constructor === c )
            {
                return instances[i];
            }
        }
        var obj:* = new c();
        instances.push( obj );
        return obj;
    }
}
var instances:Array = new Array();</pre>

<p>You can use this function to create an instance of any class (your own or an intrinsic class) as follows (for example):</p>

<pre class="code">import flash.geom.Point;
var a:Point = Singleton( Point );</pre>

<p>if you request another point elsewhere in your project, for example</p>

<pre class="code">import flash.geom.Point;
var b:Point = Singleton( Point );</pre>

<p>you will get the same point back again.</p>

<p>The one problem is the need to loop through all previously created singletons looking for a match before creating a new one. The more singletons you create, the slower this will be. It&#8217;s probably fine since most applications only use a few singletons but it would be great to get a unique identifier directly from the class and then look up the matching singleton directly. I can get the class name via the toString method, but would also need the full package to ensure uniqueness. Any ideas?</p>

<p>Like I said, I&#8217;m not sure how useful this function will be but it&#8217;s here if anyone wants to use it. If you improve it then please let me know.</p>

<h3>Postscript</h3>

<p>In the comments below, Benny suggested a way to remove the loop, and so gain a more stable lookup time, by using a Dictionary instead of an Array. His suggestion, with minor alterations by me, looks like this.</p>

<pre class="code">package
{
   function Singleton( c:Class ):*
   {
      return c in instances ? instances[c] : instances[c] = new c();
   }
}
import flash.utils.Dictionary;
var instances:Dictionary = new Dictionary( false );</pre>

<p>Thanks, Benny.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/singleton-factory/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Software Best Practices</title>
		<link>http://www.richardlord.net/blog/software-best-practices</link>
		<comments>http://www.richardlord.net/blog/software-best-practices#comments</comments>
		<pubDate>Mon, 04 Jun 2007 10:40:08 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Best practice]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/software-best-practices/</guid>
		<description><![CDATA[<p>It's great to see that Construx Software have started blogging. For those that don't know, Construx was founded by Steve McConnell, author of a number of books including the excellent "Code Complete" and "Professional Software Development".</p>
<p>The new blogs cover a range of information related to software development and project management. If you're a developer, project manager or even CEO and you're interested in improving the way you develop software there's a number of gems on these blogs already. So <a href="http://forums.construx.com/blogs/default.aspx?Groupid=5">go take a look</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s great to see that <a href="http://www.construx.com/">Construx Software</a> have started <a href="http://forums.construx.com/blogs/default.aspx?Groupid=5">blogging</a>. For those that don&#8217;t know, Construx was founded by Steve McConnell, author of a number of books including the excellent &#8220;<a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&#038;tag=biro-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0735619670">Code Complete</a>&#8221; and &#8220;<a href="http://www.amazon.com/gp/product/0321193679?ie=UTF8&#038;tag=biro-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321193679">Professional Software Development</a>&#8220;.</p>

<p>The new blogs cover a range of information related to software development and project management. If you&#8217;re a developer, project manager or even CEO and you&#8217;re interested in improving the way you develop software there&#8217;s a number of gems on these blogs already. So <a href="http://forums.construx.com/blogs/default.aspx?Groupid=5">go take a look</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/software-best-practices/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

