<?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>The Daily Build &#187; process</title>
	<atom:link href="http://blog.bstpierre.org/tag/process/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.bstpierre.org</link>
	<description>Software Development, version 3.0</description>
	<lastBuildDate>Wed, 26 May 2010 16:08:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>One Simple Step for Avoiding Shallow Reviews</title>
		<link>http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews</link>
		<comments>http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews#comments</comments>
		<pubDate>Wed, 25 Nov 2009 13:55:55 +0000</pubDate>
		<dc:creator>Brian St. Pierre</dc:creator>
				<category><![CDATA[reviews]]></category>
		<category><![CDATA[codereview]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[software-engineering]]></category>

		<guid isPermaLink="false">http://blog.bstpierre.org/?p=209</guid>
		<description><![CDATA[It's your job as a reviewer to find as many defects as possible. If you're not finding defects, you're wasting time.


Related posts:<ol><li><a href='http://blog.bstpierre.org/who-else-wants-better-short-term-memory' rel='bookmark' title='Permanent Link: Who Else Wants Better Short Term Memory?'>Who Else Wants Better Short Term Memory?</a> <small> In &#8220;Talent is Overrated&#8221;, Geoff...</small></li><li><a href='http://blog.bstpierre.org/3-easy-ways-to-stick-to-a-coding-standard' rel='bookmark' title='Permanent Link: 3 Easy Ways to Stick to a Coding Standard'>3 Easy Ways to Stick to a Coding Standard</a> <small> When you&#8217;re writing python, you...</small></li><li><a href='http://blog.bstpierre.org/must-have-tools-software-teams' rel='bookmark' title='Permanent Link: 9 &#8220;Must-Have&#8221; Tools for Software Teams'>9 &#8220;Must-Have&#8221; Tools for Software Teams</a> <small> The items below are useful...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve all been guilty of giving a shallow review: &#8220;Looks ok.&#8221;</p>
<p>Given typical defect densities, any non-trivial design or code is going to contain some errors. Even seemingly trivial maintenance fixes are likely to be defective.</p>
<p><strong>It&#8217;s your job as a reviewer to find as many of these defects as possible. </strong>If you&#8217;re not finding defects, you&#8217;re wasting your time on reviews.</p>
<p>That &#8220;one simple step&#8221;? Remind yourself that there are almost certainly defects in the work product you&#8217;re reviewing, and then find them. It&#8217;s all about attitude.</p>


<p>Related posts:<ol><li><a href='http://blog.bstpierre.org/who-else-wants-better-short-term-memory' rel='bookmark' title='Permanent Link: Who Else Wants Better Short Term Memory?'>Who Else Wants Better Short Term Memory?</a> <small> In &#8220;Talent is Overrated&#8221;, Geoff...</small></li><li><a href='http://blog.bstpierre.org/3-easy-ways-to-stick-to-a-coding-standard' rel='bookmark' title='Permanent Link: 3 Easy Ways to Stick to a Coding Standard'>3 Easy Ways to Stick to a Coding Standard</a> <small> When you&#8217;re writing python, you...</small></li><li><a href='http://blog.bstpierre.org/must-have-tools-software-teams' rel='bookmark' title='Permanent Link: 9 &#8220;Must-Have&#8221; Tools for Software Teams'>9 &#8220;Must-Have&#8221; Tools for Software Teams</a> <small> The items below are useful...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who Else Wants Better Short Term Memory?</title>
		<link>http://blog.bstpierre.org/who-else-wants-better-short-term-memory</link>
		<comments>http://blog.bstpierre.org/who-else-wants-better-short-term-memory#comments</comments>
		<pubDate>Thu, 12 Nov 2009 13:13:24 +0000</pubDate>
		<dc:creator>Brian St. Pierre</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[codereview]]></category>
		<category><![CDATA[coding-standard]]></category>
		<category><![CDATA[software-engineering]]></category>

		<guid isPermaLink="false">http://blog.bstpierre.org/?p=197</guid>
		<description><![CDATA[In &#8220;Talent is Overrated&#8221;, Geoff Colvin at one point discusses how superstars in many fields use the memory technique of &#8220;chunking&#8221; to boost their short term memory.
His simple example is the 13-letter word &#8220;lexicographer&#8221;. To you and I (assuming you speak English and have a decent vocabulary), it is easy to remember. We don&#8217;t have [...]


Related posts:<ol><li><a href='http://blog.bstpierre.org/3-easy-ways-to-stick-to-a-coding-standard' rel='bookmark' title='Permanent Link: 3 Easy Ways to Stick to a Coding Standard'>3 Easy Ways to Stick to a Coding Standard</a> <small> When you&#8217;re writing python, you...</small></li><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/open-an-ssh-tunnel-in-four-seconds-or-less' rel='bookmark' title='Permanent Link: Open an SSH Tunnel in Four Seconds or Less'>Open an SSH Tunnel in Four Seconds or Less</a> <small>As I mentioned in a previous...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>In <a title="&quot;Talent is Overrated&quot; by Geoff Colvin -- on Amazon" href="http://www.amazon.com/dp/1591842247/?tag=bstpierreorg-20">&#8220;Talent is Overrated&#8221;</a>, Geoff Colvin at one point discusses how superstars in many fields use the memory technique of &#8220;<a title="More about chunking on wikipedia." href="http://en.wikipedia.org/wiki/Chunking_(psychology)">chunking</a>&#8221; to boost their short term memory.</p>
<p>His simple example is the 13-letter word &#8220;lexicographer&#8221;. To you and I (assuming you speak English and have a decent vocabulary), it is easy to remember. We don&#8217;t have to remember 13 letters, we just remember the whole chunk. But when presented with &#8220;trgdpxhdewfwm&#8221; for 3 seconds, you probably can&#8217;t remember more than half a dozen letters.</p>
<p>Another example is that chess masters can recall board positions after being shown a chess board with pieces on it for just a few seconds. They do this by chunking sets of pieces together &#8212; almost like &#8220;words&#8221; &#8212; whereas novices will try to remember individual pieces (&#8220;letters&#8221;).</p>
<p>It struck me that programmers do the same thing when reading and writing code.</p>
<p>The coding standard helps us, by telling us where the chunks are and how to draw the boundaries between chunks.</p>
<p>If you have a coding standard.</p>
<p>And apply it consistently.</p>
<p><strong>When you choose names at random, you destroy your short term memory.</strong> You become a crappy programmer, and you drag everyone around you down too.</p>
<p>Quick example in C. Assume you&#8217;re writing a small module for checking environmental status.</p>
<pre style="padding-left: 30px;">BOOL isOverTemp();
BOOL isUnderTemp();

int GetCurTemperature();

BOOL env_isOverVoltage();
BOOL env_isUnderVoltage();</pre>
<p>Anyone writing this pile of gibberish should be <span style="text-decoration: line-through;">fired</span> excommunicated.</p>
<p>Why?</p>
<p>For starters, I just wrote it, and I can&#8217;t now remember which was camel case and which was underscored. Also: which one was abbreviated?</p>
<p>Before you object that this is a contrived example, two points: (1) yes, it is contrived, that&#8217;s the point of an example, and (2) I have worked with far worse on an almost daily basis &#8212; the example above is fairly tame.</p>
<p>On the other hand, if you know the coding standard has some simple rules &#8212; <strong>and they are followed uniformly</strong> &#8212; you can easily remember the function names.</p>
<ol>
<li>Initial 2-3 letter module prefix (&#8220;env&#8221; for this example).</li>
<li>All functions are lowercase with underscores.</li>
<li>No abbreviations.</li>
</ol>
<p>Then we have:</p>
<pre style="padding-left: 30px;">BOOL env_is_over_temperature();
BOOL env_is_under_temperature();

int env_get_cur_temperature();

BOOL env_is_over_voltage();
BOOL env_is_under_voltage();</pre>
<p>Now, when you&#8217;re writing, reviewing, or maintaining code, you don&#8217;t need to constantly refer to the header or documentation to get it right. A simple three-line coding standard just boosted your memory capacity by over 643%.</p>
<p>(In the interest of full disclosure: I made that number up.)</p>
<p>I realize that implementing even this simple three line standard is controversial because all the camel case folks are pulling out big sticks and the underscore people are grabbing rocks. To which I say: just flip a coin and enjoy the extra brain power. Adopt a three-line standard, <strong>follow it</strong>, and save the curly-brace debate for the next major coding standard revision.</p>


<p>Related posts:<ol><li><a href='http://blog.bstpierre.org/3-easy-ways-to-stick-to-a-coding-standard' rel='bookmark' title='Permanent Link: 3 Easy Ways to Stick to a Coding Standard'>3 Easy Ways to Stick to a Coding Standard</a> <small> When you&#8217;re writing python, you...</small></li><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/open-an-ssh-tunnel-in-four-seconds-or-less' rel='bookmark' title='Permanent Link: Open an SSH Tunnel in Four Seconds or Less'>Open an SSH Tunnel in Four Seconds or Less</a> <small>As I mentioned in a previous...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bstpierre.org/who-else-wants-better-short-term-memory/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Five Things That Do Not Belong In A Review Checklist</title>
		<link>http://blog.bstpierre.org/five-things-that-do-not-belong-in-a-review-checklist</link>
		<comments>http://blog.bstpierre.org/five-things-that-do-not-belong-in-a-review-checklist#comments</comments>
		<pubDate>Tue, 27 Jan 2009 22:09:32 +0000</pubDate>
		<dc:creator>Brian St. Pierre</dc:creator>
				<category><![CDATA[reviews]]></category>
		<category><![CDATA[codereview]]></category>
		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://blog.bstpierre.org/?p=104</guid>
		<description><![CDATA[This is the second half of an article I posted about using a checklist to prevent security errors. There, I said that you have 15 checklist items max, and you shouldn&#8217;t waste any of those questions on silly things like &#8220;Does the code follow the coding standard?&#8221;.
Jason Cohen pointed to an article of his in [...]


Related posts:<ol><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/who-else-wants-better-short-term-memory' rel='bookmark' title='Permanent Link: Who Else Wants Better Short Term Memory?'>Who Else Wants Better Short Term Memory?</a> <small> In &#8220;Talent is Overrated&#8221;, Geoff...</small></li><li><a href='http://blog.bstpierre.org/pid-file-race' rel='bookmark' title='Permanent Link: An Interesting pid File Race'>An Interesting pid File Race</a> <small> ISC&#8217;s dhcpd uses this code...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>This is the second half of an article I posted about <a href="http://blog.bstpierre.org/how-to-use-a-checklist-to-prevent-security-errors">using a checklist to prevent security errors</a>. There, I said that you have 15 checklist items max, and you shouldn&#8217;t waste any of those questions on silly things like &#8220;Does the code follow the coding standard?&#8221;.</p>
<p><a href="http://blog.asmartbear.com/">Jason Cohen</a> pointed to an <a href="http://embedded.com/columns/guest/208803162">article of his</a> in which he said <strong>&#8220;List no items that can be automated.&#8221;</strong> (His emphasis, but I second the motion.)</p>
<p>In the context of the SANS paper, let&#8217;s look at five items that should be automated so that no human has to find the defects:
<ol>
<li><a href="http://cwe.mitre.org/data/definitions/665.html">CWE-665</a>: Improper Initialization. As the write-up for CWE-665 suggests, you could use a programming language that forces you to explicitly initialize all variables before use. Or, if you&#8217;re stuck with something like C, make sure you turn on the warnings in your compiler, or use a static analysis tool (e.g. lint) to verify that all variables are initialized before being used. Tools like Coverity can be very sophisticated in their static analysis.</li>
<li><a href="http://cwe.mitre.org/data/definitions/119.html">CWE-119</a>: Failure to Constrain Operations within the Bounds of a Memory Buffer. Same goes for this one. First, use a programming language that doesn&#8217;t require attention to every tiny little detail of string handling. Failing that, apply static analysis. It&#8217;s also worth performing runtime analysis (e.g. electric fence, Purify) with appropriate test cases to verify that you&#8217;ve avoided buffer overflows.</li>
<li><a href="http://cwe.mitre.org/data/definitions/404.html">CWE-404</a>: Improper Resource Shutdown or Release. Even garbage collected languages can have problems with resource release. First, some GC systems have problems with circular references. Second, GC systems are typically worried about releasing memory. You also have to worry about database handles, file handles, and sockets. Configure your static analysis tool to track resources like these so that you don&#8217;t have to do it manually.</li>
<li>The write-up for CWE-404 also mentions in passing that you should &#8220;wash your garbage before you dispose of it&#8221;. This is useful for two reasons: first, an attacker won&#8217;t have access to the contents of previously used memory, and second, it often makes debugging memory problems easier if you write a known value into freed memory. (I modified malloc() at my last job to write 0xcacacaca into freed memory so that we would know right away when someone stepped on a turd, um, I mean used freed memory.) Configure your libraries to shred objects before you free them and you won&#8217;t have to worry about it on a line-by-line basis in the code you review.</li>
<li><a href="http://cwe.mitre.org/data/definitions/362.html">CWE-362</a>: Race Condition. I&#8217;m typically worried less about security than the nightmare of isolating and debugging race conditions. I haven&#8217;t seen any tools that detect race conditions well, but Coverity does a decent job of telling you when you&#8217;ve mishandled a race condition in a couple of cases: first, it warns you when you fail to release a lock, and second, it warns you when you access a resource that is statistically accessed from within a lock. So you still have to beware of race conditions (at the design level is the bset place to find these), but there is an option for finding tedious errors in the mechanics of dealing with races.</li>
</ol>
<p>And now I&#8217;m going to throw out everything above.&nbsp; Remember that the tools are built to detect common errors. If it is really important that you find a certain class of bug, put it on your checklist. In fact, if it&#8217;s super critical, make it a checklist of length one. For example, I&#8217;ve gone over codebases with the single-minded focus of finding race conditions. When you perform a review like this, it&#8217;s amazing how many defects you might find in areas that you never suspected.</p>


<p>Related posts:<ol><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/who-else-wants-better-short-term-memory' rel='bookmark' title='Permanent Link: Who Else Wants Better Short Term Memory?'>Who Else Wants Better Short Term Memory?</a> <small> In &#8220;Talent is Overrated&#8221;, Geoff...</small></li><li><a href='http://blog.bstpierre.org/pid-file-race' rel='bookmark' title='Permanent Link: An Interesting pid File Race'>An Interesting pid File Race</a> <small> ISC&#8217;s dhcpd uses this code...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bstpierre.org/five-things-that-do-not-belong-in-a-review-checklist/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Use A Checklist to Prevent Security Errors</title>
		<link>http://blog.bstpierre.org/how-to-use-a-checklist-to-prevent-security-errors</link>
		<comments>http://blog.bstpierre.org/how-to-use-a-checklist-to-prevent-security-errors#comments</comments>
		<pubDate>Fri, 23 Jan 2009 17:23:10 +0000</pubDate>
		<dc:creator>Brian St. Pierre</dc:creator>
				<category><![CDATA[reviews]]></category>
		<category><![CDATA[codereview]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.bstpierre.org/?p=98</guid>
		<description><![CDATA[The 2009 CWE/SANS Top 25 Most Dangerous Programming Errors has been out for a while now. Maybe you&#8217;ve already eliminated all of these errors from your code. In case you haven&#8217;t, this post will help you develop a checklist that you can use to eliminate these errors starting at the architecture level and moving through [...]


Related posts:<ol><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/must-have-tools-software-teams' rel='bookmark' title='Permanent Link: 9 &#8220;Must-Have&#8221; Tools for Software Teams'>9 &#8220;Must-Have&#8221; Tools for Software Teams</a> <small> The items below are useful...</small></li><li><a href='http://blog.bstpierre.org/using-pythons-ctypes-to-make-system-calls' rel='bookmark' title='Permanent Link: Using Python&#8217;s ctypes to Call Into C Libraries'>Using Python&#8217;s ctypes to Call Into C Libraries</a> <small>The ctypes module makes loading and...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>The <a title="2009 CWE/SANS Top 25 Most Dangerous Programming Errors" href="http://www.sans.org/top25errors/">2009 CWE/SANS Top 25 Most Dangerous Programming Errors</a> has been out for a while now. Maybe you&#8217;ve already eliminated all of these errors from your code. In case you haven&#8217;t, this post will help you develop a checklist that you can use to eliminate these errors starting at the architecture level and moving through design, code, and testing. Before we get to the security aspect, first let&#8217;s take a quick detour through the mechanics of a review checklist.</p>
<h3>Why A Review Checklist is Essential</h3>
<p>Most (all?) experts recommend the use of a checklist for performing design and code reviews. It&#8217;s more effective to ask a set of questions about the item being reviewed than to simply stare at a bunch of code looking for problems. The checklist focuses your attention on aspects that are most important.</p>
<p>If you want to perform a broader review, develop two or three checklists with different foci and give the lists to separate reviewers. The defect lists from each reviewer will have less overlap than if you gave everyone the same list.</p>
<h3>What Your Review Checklist Should Look Like</h3>
<p>The following advice is partly based on advice from <a href="http://www.amazon.com/Software-Inspection-Tom-Gilb/dp/0201631814/">&#8220;Software Inspection&#8221; by Gilb and Graham</a>. A good checklist is a list of questions. For practical purposes, I&#8217;m strongly in favor of a checklist that does not exceed one side of a printed page — at normal font size. For me this means a checklist of about 15 items, 20 as an absolute maximum. Remember, we&#8217;re <em>focusing</em>, which means looking harder for just a few types of items. If you&#8217;re using online checklists, I&#8217;d extend this to mean that it should fit on the screen without scrolling. Either way, I don&#8217;t think you should have more than 20 questions or so at the max. Fewer is probably better, more is too overwhelming.</p>
<p>Checklist items are yes/no questions. They should all be phrased such that a &#8220;no&#8221; answer means something is broken.</p>
<p>When reviewing, proceed through the entire item under review (the entire code listing or design) with each question. Don&#8217;t work linearly, this is a horrible way to review code. I prefer to review on paper, simply because I can make little notes and marks all over the paper as I go through it. For the first question, you might work mostly front-to-back. Then the second question might send you backwards through the code. After a couple of passes over the code you have some familiarity with it, so the third question might send you straight to a location that has potential problems.</p>
<h3>How To Choose Questions for the Review Checklist</h3>
<p>Since the whole point of the checklist (and reviews in general) is to find defects, the questions should focus on finding the highest value defects. Why waste valuable checklist real estate on a question like &#8220;Does the code conform to formatting conventions?&#8221; Duh. If your team has a formatting convention, and you look at a piece of code that doesn&#8217;t conform, it&#8217;s going to jump off the page and bite you in the nose. You don&#8217;t need a checklist question for this!</p>
<p>Back to the specific problem at hand: security errors. SANS has done a great job of sifting through tons of security errors and boiling them down to the top 25. We could probably develop a 100 question review checklist from their Top 25 list, but it would be too big to be usable. So let&#8217;s <em>focus</em> on the most important for our application.</p>
<p>For this exercise, our application is a blog like Wordpress but much simpler: no plugins, no comments, single author. This is not a hosted application like Blogger, so we are less concerned about vulnerabilities like cross-site scripting, SQL injection, and OS command injection. We do need to make sure that only the author is allowed to post, so let&#8217;s look at the &#8220;Porous Defenses&#8221; category.</p>
<ul>
<li>CWE-285: Improper Access Control (Authorization)</li>
<li>CWE-327: Use of a Broken or Risky Cryptographic Algorithm</li>
<li>CWE-259: Hard-Coded Password</li>
<li>CWE-732: Insecure Permission Assignment for Critical Resource</li>
<li>CWE-330: Use of Insufficiently Random Values</li>
<li>CWE-250: Execution with Unnecessary Privileges</li>
<li>CWE-602: Client-Side Enforcement of Server-Side Security</li>
</ul>
<p>The entry for CWE-285: Improper Access Control lists the following for prevention and mitigation:</p>
<blockquote><p>For web applications, make sure that the access control mechanism is enforced correctly at the server side on every page. Users should not be able to access any information that they are not authorized for by simply requesting direct access to that page. One way to do this is to ensure that all pages containing sensitive information are not cached, and that all such pages restrict access to requests that are accompanied by an active and authenticated session token associated with a user who has the required permissions to access that page.</p></blockquote>
<p>Here are some straightforward checklist questions we can extract from that description:</p>
<ol>
<li>Does every administrative page enforce access control on the server side?</li>
<li>Are unauthenticated (anonymous) users prevented from accessing administrative pages?</li>
<li>Is caching disabled for administrative pages?</li>
<li>Does every administrative page validate the session token properly?</li>
</ol>
<p>Now you can go walk through your design and/or code to verify that you can say &#8220;yes&#8221; to each of these questions.</p>
<p>If you found this post helpful, <a href="http://blog.bstpierre.org/feed/rss2">subscribe to The Daily Build</a> to get updates as they are posted. Thanks!</p>


<p>Related posts:<ol><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/must-have-tools-software-teams' rel='bookmark' title='Permanent Link: 9 &#8220;Must-Have&#8221; Tools for Software Teams'>9 &#8220;Must-Have&#8221; Tools for Software Teams</a> <small> The items below are useful...</small></li><li><a href='http://blog.bstpierre.org/using-pythons-ctypes-to-make-system-calls' rel='bookmark' title='Permanent Link: Using Python&#8217;s ctypes to Call Into C Libraries'>Using Python&#8217;s ctypes to Call Into C Libraries</a> <small>The ctypes module makes loading and...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bstpierre.org/how-to-use-a-checklist-to-prevent-security-errors/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Project Team Blog: Our Projects Are Always Late</title>
		<link>http://blog.bstpierre.org/project-team-blog-our-projects-are-always-late</link>
		<comments>http://blog.bstpierre.org/project-team-blog-our-projects-are-always-late#comments</comments>
		<pubDate>Thu, 18 Dec 2008 14:09:00 +0000</pubDate>
		<dc:creator>Brian St. Pierre</dc:creator>
				<category><![CDATA[timelog]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://blog.bstpierre.org/?p=10</guid>
		<description><![CDATA[Saw this post over at the Project Team Blog Our Projects Are Always Late. Newshirt asks (I&#8217;m paraphrasing) &#8220;Why would this person not use a time tracking tool?&#8221;
Two answers:

Because it feels like an extra step. If you want to change a behavior like time tracking, you have to make it automatic. Developers and other project [...]


Related posts:<ol><li><a href='http://blog.bstpierre.org/3-easy-ways-to-stick-to-a-coding-standard' rel='bookmark' title='Permanent Link: 3 Easy Ways to Stick to a Coding Standard'>3 Easy Ways to Stick to a Coding Standard</a> <small> When you&#8217;re writing python, you...</small></li><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/configure-ssh-username' rel='bookmark' title='Permanent Link: How to Tell SSH Who You Are'>How to Tell SSH Who You Are</a> <small>Do you log in to several...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>Saw this post over at the Project Team Blog <a href="http://www.projectteamblog.com/?p=153">Our Projects Are Always Late</a>. Newshirt asks (I&#8217;m paraphrasing) &#8220;Why would this person not use a time tracking tool?&#8221;</p>
<p>Two answers:</p>
<ol>
<li>Because it feels like an extra step. If you want to change a behavior like time tracking, you have to make it automatic. Developers and other project members are already too busy, you can&#8217;t just ask them to add another step to their daily workflow unless the benefits are immediate and obvious. The benefits of time tracking are not immediate and obvious &#8212; it takes some time (granted a small amount of time) to reap the benefits of time tracking.</li>
<li>Second, they perceive a risk. Even if the software is free (they are providing a 30 day free download), there&#8217;s the risk that you spend an hour or two (or more) downloading and fiddling with the software only to discover that it won&#8217;t work in your environment for one reason or another.</li>
</ol>
<p>To use concrete examples from my recent experience:</p>
<ol>
<li>I&#8217;m developing in Python. I&#8217;ve used <a href="http://www.logilab.org/project/pylint">Pylint</a> in the past and it has been helpful in pointing out bugs before I start testing. I <span style="font-style: italic;">want</span> to use Pylint on my current project, but I keep skipping it because it <span style="font-style: italic;">feels like an extra step</span> and I&#8217;m trying to get work done, not fiddle with extra tools. The solution is for me to integrate this tool into my workflow so that it is automatic and not an extra step. This is what I&#8217;ve done for the current iteration and I expect that it will stick.</li>
<li>I&#8217;ve recently been using more social media sites like <a href="http://twitter.com/bstpierre">twitter</a> and I read about a toolbar for Firefox from <a href="http://wapp.minggl.com/register/install">Minggl</a>. Sounded interesting and after I saw a few mentions of it I decided to give it a whirl. There should be a warning: &#8220;roadblocks ahead&#8221;.
<ol>
<li>They make you register to download.</li>
<li>The registration form does not allow periods or spaces in your last name, so it took a couple of tries to register. (This smacks of ethnocentrism! I am being oppressed because I have a period <span style="font-style: italic;">and</span> a space in my last name!)</li>
<li>It doesn&#8217;t work on linux&#8230; bummer.</li>
</ol>
<p>Contrast this with the experience of signing up for something like <a href="http://twitter.com/">twitter</a> or <a href="http://www.mahalo.com/answers">Mahalo Answers</a>. You sign up (albeit with the gotcha of only allowing alphabetics in the name) and you start using it immediately.
</li>
</ol>


<p>Related posts:<ol><li><a href='http://blog.bstpierre.org/3-easy-ways-to-stick-to-a-coding-standard' rel='bookmark' title='Permanent Link: 3 Easy Ways to Stick to a Coding Standard'>3 Easy Ways to Stick to a Coding Standard</a> <small> When you&#8217;re writing python, you...</small></li><li><a href='http://blog.bstpierre.org/one-simple-step-for-avoiding-shallow-reviews' rel='bookmark' title='Permanent Link: One Simple Step for Avoiding Shallow Reviews'>One Simple Step for Avoiding Shallow Reviews</a> <small>It's your job as a reviewer...</small></li><li><a href='http://blog.bstpierre.org/configure-ssh-username' rel='bookmark' title='Permanent Link: How to Tell SSH Who You Are'>How to Tell SSH Who You Are</a> <small>Do you log in to several...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bstpierre.org/project-team-blog-our-projects-are-always-late/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
