<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>CreatingCode</title>
    
    <link href="http://creatingcode.com/" />
    <updated>2012-02-15T13:18:04-08:00</updated>
    <id>http://creatingcode.com/</id>
    <author>
        <name>Robert Greiner</name>
        <email>robert@robertgreiner.com</email>
        <uri>http://robertgreiner.com</uri>
    </author>
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CreatingCode" /><feedburner:info uri="creatingcode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>CreatingCode</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
        <title>Introducing GitCV - Show off your programming awesomeness.</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/uhBkC8JPb90/introducing-gitcv" />
        <updated>2012-02-15T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/02/introducing-gitcv</id>
        <content type="html">&lt;p&gt;
	Programmers, did you ever wish you could add an executive summary of your github awesomeness on your resume?  Managers, did you ever wish you had a better way to evaluate the contributions and programming skills of a candidate &lt;strong&gt;before&lt;/strong&gt; they come in for an interview?  Well, now you can.
&lt;/p&gt;

&lt;p&gt;
	&lt;a href="http://gitcv.com"&gt;GitCV&lt;/a&gt; will display an up-to-the-minute summary of a github user's account in a clean and readable format.  Here's a quick example of &lt;a href="http://gitcv.com/robertgreiner"&gt;my profile&lt;/a&gt; to give you a feel of what it looks like.  If you would like to add a link to your GitCV profile on your resume, simply add the following link &lt;code&gt;http://gitcv.com/YourGithubUsername&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
	&lt;a href="/uploads/images/2012/gitcv.png"&gt;&lt;img src="/uploads/images/2012/gitcv.png" alt="Show off your awesomeness with GitCV." title="My GitCV Profile" width="721" height="600" class="center" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
	There are still a few more features and graphs I want to add in the future, but I feel like this is a really good start.  GitCV pulls your current public information every time the page loads, so you don't have to worry about stale data.
&lt;/p&gt;

&lt;p&gt;
	GitCV is free to &lt;a href="http://gitcv.com"&gt;use&lt;/a&gt; and &lt;a href="http://github.com/robertgreiner/gitcv"&gt;extend&lt;/a&gt;.  Are there any features you would like added?  Leave a comment!
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/uhBkC8JPb90" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/02/introducing-gitcv</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] The First Few Heuristics</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/1jqSBn1b4jg/the-first-few-heuristics" />
        <updated>2012-01-24T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/the-first-few-heuristics</id>
        <content type="html">&lt;p&gt;It looks like we finally nailed down the first five heuristics to implement in &lt;a href="http://github.com/robertgreiner/tipster"&gt;Tipster&lt;/a&gt;.  I will follow up this post with a more in-depth introduction into each heuristic and how we think it will add value to our radiator.&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Test Baseline&lt;/strong&gt; - Does the commit contain at least one line of test code?  This is the dumbest, most simple, heuristic to implement, but you'd be surprised how many commits get flagged here.  If developers are not writing any test code, we can't even think about discussing other aspects of quality.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Churn&lt;/strong&gt; - How often is the file modified?  Are large chunks of a file getting changed in a single commit?  Are large chunks of the file getting deleted in a single commit?  These are all red flags that can lead to risky code.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Cyclomatic Complexity&lt;/strong&gt; - The number of linearly independent paths through code.  In layman's terms, the more if statements you add to a method, the higher the cyclomatic complexity.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Contributor Diversity&lt;/strong&gt; - &lt;a href="http://research.microsoft.com/pubs/70535/tr-2008-11.pdf"&gt;It has been shown&lt;/a&gt; that the number of different teams (not people in a team, or geographic distance between people in a team) working on a file directly correlates to defect density.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Code Coverage&lt;/strong&gt; - We will use a mixture of &lt;a href="http://en.wikipedia.org/wiki/Code_coverage"&gt;line and branch coverage&lt;/a&gt; to gain insight to how well covered the source file is from a unit-test perspective.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I think this is a really good start and it will give us some good insight into each commit.  As time goes on, these heuristics will be fine-tuned to give the best results possible and additional heuristics can be added after we are comfortable with the list above.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/1jqSBn1b4jg" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/the-first-few-heuristics</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] Introducing Tipster</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/eMouI3o-UYw/introducing-tipster" />
        <updated>2012-01-24T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/introducing-tipster</id>
        <content type="html">&lt;p&gt;&lt;a href="http://github.com/robertgreiner/tipster"&gt;Tipster&lt;/a&gt; is a ruby gem that will generate an HTML report of your most recent git commit and let you know if it is risky on one of the risk-heuristics we are implementing with Ratcheting.  As we continue to refine existing heuristics and implement new ones, Tipster will give you a clearer picture of how risky your code is &lt;strong&gt;before you commit it&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Here's a quick look at the risk report that Tipster generates, it's still in the early stages, and should be more eye appealing and contain more robust information in the following weeks.&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/images/2012/tipster.png" alt="Tipster: Assess the risk of a local git commit in real time." title="Tipster: Assess the risk of a local git commit in real time." width="500" height="319" class="center" /&gt;&lt;/p&gt;

&lt;p&gt;Tipster is available under the MIT license on &lt;a href="http://github.com/robertgreiner/tipster"&gt;Github&lt;/a&gt;.  Feel free to contribute or use it in your own project.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/eMouI3o-UYw" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/introducing-tipster</feedburner:origLink></entry>
    
    <entry>
        <title>End Piracy, Not Liberty</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/-NRmnhFw2EQ/end-piracy-not-liberty" />
        <updated>2012-01-18T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/end-piracy-not-liberty</id>
        <content type="html">&lt;p&gt;&lt;img src="/uploads/images/2012/stop_sopa.png" alt="Stop SOPA" title="Stop SOPA" width="450" height="450" class="center" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/landing/takeaction/"&gt;I can't say it any better than google can.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://americancensorship.org/"&gt;Get involved.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/-NRmnhFw2EQ" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/end-piracy-not-liberty</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] Tweaking Heuristics for Better Results</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/-VMvLUXB4UI/tweaking-heuristics-for-better-results" />
        <updated>2012-01-06T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/tweaking-heuristics-for-better-results</id>
        <content type="html">&lt;p&gt;Lately we've been noticing fewer and fewer commits getting flagged as risky with each passing week.  After doing some analysis we realized, for the most part, we have increased quality awareness across the organization and as a result more people are checking in test code with each commit. As a rule of thumb, we hope to see around 40% of commits flagged as risky.  This number seems appropriate for now since the goal is to code review all risky commits and the value of code reviews has diminishing returns.&lt;/p&gt;

&lt;p&gt;In our case the issue of having too few commits flagged as risky is a good thing but we still have to do something about it to ensure we are getting the most out of our efforts.  Once you get to this point, there are three options that can be taken to move forward:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Introduce a new heuristic&lt;/strong&gt; - If your current set of risk heuristics are giving you the kind of information you want, maybe it's time to add a new one.  For instance, measuring cyclomatic complexity can be a nice compliment to an existing code coverage metric.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Dial-up one or more existing heuristics&lt;/strong&gt; - Once the development organization improves to a new level, dial it up a notch and see if you can't get them to improve even more.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Make your existing heuristics smarter&lt;/strong&gt; - One thing we've been toying around with is trying to identify files that get checked in without tests.  For instance, if a developer commits three source files, but only updates two different test files, then they likely neglected to add tests for one of the files.  This commit should still be flagged as risky, even if overall code coverage increased.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ratcheting is very much an experimental process that requires constant tweaking to ensure we are tactically striking risky code in areas that provide the most value while minimizing the amount of distractions to other developers.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/-VMvLUXB4UI" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/tweaking-heuristics-for-better-results</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] Lessons Learned: How Do I Run This Locally?</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/OdROZR1zQCE/how-do-i-run-this-locally" />
        <updated>2012-01-05T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/how-do-i-run-this-locally</id>
        <content type="html">&lt;p&gt;Typically, when we tell developers at work about Ratcheting the reaction is generally positive.  However, the one question that everyone seems to have is "How can I run this locally?"  This is a really important question, one that we have somewhat neglected over the past few weeks while we have been focusing on delivering functionality for our risk metrics.&lt;/p&gt;

&lt;p&gt;Developer communication and rapid feedback are paramount in any project and it is vital to give developers the tools they need to succeed.  After all, the success of your project depends on it.&lt;/p&gt;

&lt;p&gt;When you are doing a project that will generate some level of visibility into a developer's work, it is important to give them something that lets them know what they are getting in to before each commit.  In the future we will try to do a better job of delivering the feedback tools our developers need to stay informed.&lt;/p&gt;

&lt;p&gt;Ideally, we will roll out the changes to the local check-in script before we make the changes in the radiator.  This way we can treat our developers as partners and beta-testers for new functionality instead of a user-base that is largely kept in the dark until changes are made.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/OdROZR1zQCE" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/how-do-i-run-this-locally</feedburner:origLink></entry>
    
    <entry>
        <title>How much do you bill per hour as a freelancer?</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/L_POSm-PHo0/how-much-do-you-bill-per-hour-as-a-freelancer" />
        <updated>2012-01-04T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/how-much-do-you-bill-per-hour-as-a-freelancer</id>
        <content type="html">&lt;p&gt;I've always wondered what other software development freelancers set as their hourly rate as so I could use it a comparable for my own rates.  Surprisingly, this information is not as straightforward to find as you might think.  Thanks to a &lt;a href="http://news.ycombinator.com/item?id=3420203"&gt;recent poll on HackerNews&lt;/a&gt; I now have a little clearer picture of how much my fellow developers are charging for freelance work.&lt;/p&gt;

&lt;p&gt;&lt;a href="/uploads/images/2012/freelancer_rates.png"&gt;&lt;img src="/uploads/images/2012/freelancer_rates.png" alt="What other freelancers are charging." title="Freelancer Hourly Rates" width="607" height="365" class="center" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personally, this data surprised me a little.  I always thought that the hourly rates for most freelancers would be significantly lower, but this data may be &lt;a href="http://en.wikipedia.org/wiki/Skewness"&gt;negatively skewed&lt;/a&gt; due to the fact that most of the folks on Hacker News are some of the best and brightest in our field.&lt;/p&gt;

&lt;p&gt;On a parting note, I think it's best to set a slightly higher rate and not have to rely on billing your customers for every little thing you do.  This way, you can focus on delivering quality work, and not on how much time you should bill for thinking about your client's problem on the drive to lunch.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/L_POSm-PHo0" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/how-much-do-you-bill-per-hour-as-a-freelancer</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] A Typical Development Workflow</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/uuGMPwxRTMM/a-typical-development-workflow" />
        <updated>2012-01-04T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/a-typical-development-workflow</id>
        <content type="html">&lt;p&gt;Part of the problem we encounter when trying to implement a new policy, procedure, or even software architecture is that the people making the rules are seldom the ones that have to live with the consequences.  That is not the case with the Ratcheting project.  We are all, first and foremost, programmers here and will very much feel the pain of &lt;a href="http://en.wikipedia.org/wiki/Eating_your_own_dog_food"&gt;eating our own dogfood&lt;/a&gt;. That being said, it is in our best interest to ensure Ratcheting really does provide quality and does not end up burdening our fellow developers.&lt;/p&gt;

&lt;p&gt;As we continue to define and refine exactly what Ratcheting is, an idea of how it might be used starts to emerge. Here is what a developer's workflow might look like during her day-to-day activities.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A developer is ready to commit code changes to the repository&lt;/li&gt;
  &lt;li&gt;The project is built and unit tests are run*&lt;/li&gt;
  &lt;li&gt;Calculate check-in risk locally*&lt;/li&gt;
  &lt;li&gt;Static quality analysis is executed*&lt;/li&gt;
  &lt;li&gt;Review risk and quality report&lt;/li&gt;
  &lt;li&gt;Improve code based on report guidelines&lt;/li&gt;
  &lt;li&gt;Re-run check-in script&lt;/li&gt;
  &lt;li&gt;Commit!&lt;/li&gt;
  &lt;li&gt;A risky commit will be flagged  by the build radiator&lt;/li&gt;
  &lt;li&gt;A code review will then be generated automatically&lt;/li&gt;
  &lt;li&gt;The code review is assigned randomly to a person who has modified the file recently&lt;/li&gt;
  &lt;li&gt;Make improvements based on code review feedback&lt;/li&gt;
&lt;/ul&gt; 
&lt;div style="margin-top: -20px; font-size: 10px;"&gt;* = automated by check-in script.&lt;/div&gt;&lt;br /&gt;

&lt;p&gt;Most of the things on this list we are already doing anyway, the addition of Ratcheting provides rapid feedback of code quality and risk around the time of commit, not during a post-mortem of the project done long after the project has been completed.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/uuGMPwxRTMM" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/a-typical-development-workflow</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] Intro to Ratcheting Presentation Slides</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/h_sGjgFjatg/intro-to-ratcheting-presentation-slides" />
        <updated>2012-01-03T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/intro-to-ratcheting-presentation-slides</id>
        <content type="html">&lt;p&gt;Here are a few Powerpoint slides we put together that attempts to introduce the concept of Ratcheting and incremental code improvement. We'd love some feedback if you have any to give. Enjoy.&lt;/p&gt;

&lt;div style="width:425px" id="__ss_11219273"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/robertgreiner/code-quality-and-tipster" title="Code Quality and Tipster" target="_blank"&gt;Code Quality and Tipster&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/11219273" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/robertgreiner" target="_blank"&gt;Robert Greiner&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/h_sGjgFjatg" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/intro-to-ratcheting-presentation-slides</feedburner:origLink></entry>
    
    <entry>
        <title>[Ratcheting] Assessing Which Risk Heuristics to Implement in the Radiator</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/5t7o_gZjTfA/assessing-which-risk-heuristics-to-implement-in-the-radiator" />
        <updated>2012-01-02T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/assessing-which-risk-heuristics-to-implement-in-the-radiator</id>
        <content type="html">&lt;p&gt;In short, a risk heuristic should not be added to the radiator unless it meets the following criteria:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should identify an aspect of risk&lt;/strong&gt; - The heuristics applied in Ratcheting should give us the ability to tactically identify which commits are risky and offer an opportunity to mitigate that risk.  We need to identify heuristics that are really good at identifying risk and start with those.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;It should be obvious how to mitigate the risk identified by the heuristic&lt;/strong&gt; - Once we have identified a risky commit, we need to be able to do something about it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic's sensitivity should be configurable&lt;/strong&gt; - As time goes on, we might need to tweak the threshold of a heuristic to better identify what is risky.  For our first heuristic, test lines of code added, we might want to tweak the ratio of test lines of code to production lines of code over the life of the project to reduce the chances of flagging files that are not risky.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should make sense in a historical context&lt;/strong&gt; - We need to know how each heuristic will behave against prior recent commits.  Are we getting enough information from the heuristic?  Is it providing the right level of information?  If the heuristic is flagging too many or too few commits, it might not be worth adding.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should provide pre-commit feedback&lt;/strong&gt; - Developers need to know what they are getting in to before they issue their commit.  This feedback should be part of a check-in script and run in the same relative amount of time as your unit test suite.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should be able to be introduced at a minimal stage&lt;/strong&gt; - Some of these heuristics can get very complex quickly.  The key here is to start small by finding the easiest possible point of entry and improve the smartness of the risk analysis over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This provides a good lens with which to look at individual risk heuristics.  It is important to establish this rule-of-thumb early and stick to it in order to fight feature creep.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/5t7o_gZjTfA" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/assessing-which-risk-heuristics-to-implement-in-the-radiator</feedburner:origLink></entry>
    
    <entry>
        <title>Continuous Code Improvement Using Ratcheting</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/WmholTOQUuU/continuous-code-improvement-using-ratcheting" />
        <updated>2012-01-01T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2012/01/continuous-code-improvement-using-ratcheting</id>
        <content type="html">&lt;p&gt;I read a great article over the weekend dealing with the concept of &lt;strike&gt;ratcheting&lt;/strike&gt; (sorry, this website has been shut down) a legacy codebase in order to achieve the ultimate goal of quality code using incremental improvements over time.&lt;/p&gt;

&lt;p&gt;I must admit that reading this article was a bit of a revelation for me.  On the surface, the concept of ratcheting in and of itself is nothing new.  After all, We were taught from a very young age that the best way to handle a complex problem is to break it down into composite pieces and attack the problem on a smaller scale (i.e. &lt;em&gt;How do you eat a whale?  One bite at a time&lt;/em&gt;.)  However, the idea of implementing ratcheting in a code base was something that I had never thought of before and it seems to be a great way to help cultivate a culture of quality within a software project, especially a large software project.&lt;/p&gt;

&lt;p&gt;At its core, ratcheting is nothing more than a check-in script that developers will run locally before being allowed to push to the central repository.  This script will create a &lt;em&gt;gated check-in&lt;/em&gt; that will ensure each push meets a minimum set of code cleanliness requirements.  In order to do this, we can leverage different types of static code analysis tools to create a good baseline to measure against.&lt;/p&gt;

&lt;p&gt;It is important to point out that ratcheting is not intended to replace unit testing.  Ratcheting serves a different purpose altogether and can be used in conjunction with tried-and-true development practices that have allowed our software projects to succeed for so long.&lt;/p&gt;

&lt;h3&gt;Why do we need ratcheting?&lt;/h3&gt;

&lt;p&gt;The main problem with any code base is &lt;a href=http://en.wikipedia.org/wiki/Entropy&gt;entropy&lt;/a&gt;.  Simply put, entropy means that your code will inevitably trend towards chaos (or complexity) over time by default.  This effect is magnified exponentially as you add more developers to the project.  As a result, what ends up happening is, our once-tidy code base gets transformed into a cave of despair that is full of defects and takes incrementally longer to add new features release after release.&lt;/p&gt;

&lt;p&gt;We've all seen it.  Maybe Joe the Programmer has a tight deadline and ends up tacking a few extra lines on a method in a class that he's familiar with that "gets the job done ".  Now, Joe's excuse for committing this crime will be; "hey bro, it's only five lines, who cares?"  The problem with Joe's attitude is that over the course of three years and a few hundred commits on the file, our once innocent class will have morphed into a monster filled with defects and high complexity.&lt;/p&gt;

&lt;p&gt;This common scenario is where ratcheting can really show its value.  Joe wouldn't be able to check in his five-line-hack as-is because he likely would have violated one of the quality metrics the build script will be checking for (in this case, it would likely be something along the lines of cyclomatic complexity or a method that is too long).&lt;/p&gt;

&lt;p&gt;Finally, ratcheting &lt;em&gt;protects us from ourselves&lt;/em&gt;. Even in an ideal development situation with teams full of really smart programmers who truly care about quality code, ratcheting can help protect us from the simple little mistakes we all are guilty of committing from time to time.&lt;/p&gt;

&lt;h3&gt;What metrics should we be ratcheting against?&lt;/h3&gt;

&lt;p&gt;To be completely honest, I'm not 100% sure. What is important for my project now might not be what is important for your project which also won't be what is important to my project in a year or two. &lt;/p&gt;

&lt;p&gt;For my project I am going to start with code coverage and likely move on to cyclomatic complexity, dead code, and duplicate code.&lt;/p&gt;

&lt;h3&gt;Ratcheting scales up well&lt;/h3&gt;

&lt;p&gt;Ratcheting also seems to be a natural remedy to the exponentially increasing overhead costs incurred by adding more developers to a project.  The more developers you have incrementally improving a code base, the faster the code base becomes the awesomeness it was intended to be.&lt;/p&gt;

&lt;p&gt;Since ratcheting is fair and unbiased, it will work especially well with teams that span across multiple continents with different levels of training, motivation, and professionalism.&lt;/p&gt;

&lt;h3&gt;The two simple rules of ratcheting&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Your commit must not make the existing code base worse on aggregate&lt;/strong&gt; - Sorry Joe, but your five-line-hack from earlier won't cut it anymore and you'll have to find a cleaner solution before you are allowed to check in.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Your commit must improve the code base in one or more areas&lt;/strong&gt; - Oh, and by the way, I hope you added some test coverage to the code you just fixed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first rule is absolutely vital to ensure the code base does not get any worse.  The second rule is the only way to ensure that the code actually improves over time.&lt;/p&gt;

&lt;h3&gt;Putting ratcheting into action&lt;/h3&gt;

&lt;p&gt;Over the next few months, I'm going to start implementing ratcheting in my &lt;a href=http://www.theserverside.net/blogs/thread.tss?thread_id=46734&gt;pod&lt;/a&gt; at work and will document  my findings on this blog.&lt;/p&gt;
&lt;p&gt;One important question I aim to answer is &lt;em&gt;What shape will ratcheting take?&lt;/em&gt;  Ratcheting can only enforce improvement along the lines of static metrics and is unable to determine whether or not a change or refactoring is good.  This being said, will ratcheting merely result in a tidy codebase with the same underlying issues?  Or, will ratcheting help empower developers to fearlessly make the kind of improvements that will benefit the system a long time in the future?  Hopefully, we'll be able to answer this question and many more as we delve deeper into the practice of ratcheting.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/WmholTOQUuU" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2012/01/continuous-code-improvement-using-ratcheting</feedburner:origLink></entry>
    
    <entry>
        <title>A new blog for the new year</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/dXi3KbHcID8/a-new-blog-for-the-new-year" />
        <updated>2011-12-29T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2011/12/a-new-blog-for-the-new-year</id>
        <content type="html">&lt;p&gt;I thought I'd start the new year off right (and early! For those of you on Google Reader however, this post will show up late, sorry about that) by moving from &lt;a href="http://wordpress.org"&gt;Wordpress&lt;/a&gt; to a &lt;a href="http://github.com/robertgreiner"&gt;Github&lt;/a&gt; hosted blog.  I also moved my domain name from GoDaddy to &lt;a href="https://dnsimple.com/r/1b4ec658ed60c3"&gt;dnsimple&lt;/a&gt; (which, I really like by the way.)&lt;/p&gt;

&lt;p&gt;I had a chance to test-drive a Github hosted blog when I created &lt;a href="http://ratcheting.org"&gt;Ratcheting&lt;/a&gt; and I really like it.  I've always kind of wished CreatingCode was a Github blog, and I figured since I'm already going through the hassle of migrating all of my domains from GoDaddy, I might as well move my blog in time for the new year.&lt;/p&gt;

&lt;p&gt;So, please excuse the residual mess that comes from switching blog platforms, I promise to get all of the kinks worked out as quickly as possible.&lt;/p&gt;

&lt;p&gt;And finally, for my favorite readers, those of you on Google Reader.  Please excuse the duplicate posts as Google Reader syncs up with the new atom feed on this site.&lt;/p&gt;

&lt;p&gt;I hope you all have a fantastic new year and I'll see you in January!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/dXi3KbHcID8" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/12/a-new-blog-for-the-new-year</feedburner:origLink></entry>
    
    <entry>
        <title>Unit Testing JavaScript using BDD and Jasmine</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/B8oiuM3-8fg/unittesting-javascript-using-bdd-and-jasmine" />
        <updated>2011-12-01T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2011/12/unittesting-javascript-using-bdd-and-jasmine</id>
        <content type="html">&lt;p&gt;
JavaScript has been treated like a second class citizen for too long.  It needs the same level of care and attention as our production code.  This presentation gives a very basic introduction to unit testing JavaScript and tries to convince the audience that unit testing JavaScript is a good idea.
&lt;/p&gt;

&lt;p&gt;
&lt;div style="width:425px" id="__ss_10385223"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/robertgreiner/testing-javascript-10385223" title="Testing javascript" target="_blank"&gt;Testing javascript&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/10385223" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/robertgreiner" target="_blank"&gt;robertgreiner&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/B8oiuM3-8fg" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/12/unittesting-javascript-using-bdd-and-jasmine</feedburner:origLink></entry>
    
    <entry>
        <title>Creating Item Recommendations by Finding Users with Similar Taste</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/e9OTQNZnVWI/creating-item-recommendations-by-finding-users-with-similar-taste" />
        <updated>2011-11-15T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2011/11/creating-item-recommendations-by-finding-users-with-similar-taste</id>
        <content type="html">&lt;p&gt;
Let's say you have bought some books on programming (nerd), read them, and then rated them.  Now, let's say a few other people have done the same thing.  As an online bookstore owner it would be in my best interest to find the users who have reviewed books similar to you (i.e. they have the same taste as you) and recommend items that you haven't read yet.
&lt;/p&gt;

&lt;p&gt;
A really simple way to find how similar your reviews are to another person is to essentially graph your reviews against Reviewer X's reviews and calculate the &lt;a href="http://en.wikipedia.org/wiki/Euclidean_distance"&gt;Euclidean Distance&lt;/a&gt; between your numerical review scores and the other reviewer's.  With Euclidean Distance, the closer the distance between the two points is, the more similar your taste is to the other user.
&lt;/p&gt;

&lt;p&gt;
&lt;a href="/uploads/images/2011/euclidean-distance.png"&gt;&lt;img src="/uploads/images/2011/euclidean-distance.png" alt="" style="border: 1px solid #333333; background-color: #FFFFFF; padding: 10px 30px 10px 10px;" title="euclidean-distance" width="450" height="388" class="center" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
The key here is to take a list of reviews and calculate a numerical score, which can be called a Similarity Score that you can use to measure how the reviews of other users stacks up to your reviews.
&lt;/p&gt;

&lt;p&gt;
This code will calculate the Similarity Score between two users.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1536650.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public class EuclideanDistance : SimilarityScore
{
  private readonly Reviewer CompareTo;
  private readonly Reviewer CompareWith;

  public EuclideanDistance(Reviewer compareTo, Reviewer compareWith)
  {
    CompareTo = compareTo;
    CompareWith = compareWith;
  }

  public double Score()
  {
    var similarTitles = FindSharedItems();
    if (similarTitles.Count == 0)
    {
      return 0.0;
    }

    double sumOfSquares = similarTitles.Sum(title =&gt; 
      Math.Pow(CompareTo.Reviews[title] - CompareWith.Reviews[title], 2));

    return Math.Round(1 / (1 + sumOfSquares), 3);
  }

  public List&amp;lt;string&amp;gt; FindSharedItems()
  {
    return (from r in CompareTo.Reviews where 
      CompareWith.Reviews.ContainsKey(r.Key) select r.Key).ToList();
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Once you have calculated the Similarity Score of the rest of the users in the system, you can use those scores to weight and average the reviews of items that you haven't read in order to attempt to make the best possible recommendation.  This will work with any type of item or review as long as two reviewers have something in common, a score will be calculated.
&lt;/p&gt;

&lt;p&gt;
This is a really simple example of machine learning.  Using a simple algorithm (or more complex one if you actually have a site that makes money) we can intelligently guess at what our customers are looking for based on data from other customers.  Building intelligence into applications can significantly improve the user's experience by turning advertisement or recommendation space into something that can benefit the user.  Which, will in turn improve your bank account.
&lt;/p&gt;

&lt;p&gt;
This is just the tip of the iceberg, you can find the rest of the project on &lt;a href="https://github.com/robertgreiner/Recommender"&gt;Github&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/e9OTQNZnVWI" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/11/creating-item-recommendations-by-finding-users-with-similar-taste</feedburner:origLink></entry>
    
    <entry>
        <title>Notes From the Field: Breaking Down User Stories</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/RnxAzLqYnn8/notes-from-the-field-breaking-down-user-stories" />
        <updated>2011-11-10T00:00:00-08:00</updated>
        <id>http://creatingcode.com/2011/11/notes-from-the-field-breaking-down-user-stories</id>
        <content type="html">&lt;p&gt;
We had a little talk today at work discussing stories and how to effectively break them down.
&lt;/p&gt;

&lt;p&gt;
Here's some of the basic points of the talk I captured with my &lt;a href="http://www.livescribe.com/en-us/"&gt;Livescribe Echo&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
There were four key points I got from the discussion:
&lt;/p&gt;

&lt;p&gt;
&lt;ol&gt;
  &lt;li&gt;Stories should be broken down until they fit in a single unit of work.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.agileforall.com/2009/05/14/new-to-agile-invest-in-good-user-stories/"&gt;INVEST&lt;/a&gt; in good stories&lt;/li&gt;
  &lt;li&gt;Stories only need to be detailed enough for you to start work.  They are designed to facilitate a discussion and do not require a huge amount of detail up front.&lt;/li&gt;
  &lt;li&gt;And finally, we discussed some &lt;a href="http://www.richardlawrence.info/2009/10/28/patterns-for-splitting-user-stories/"&gt;Patterns of splitting stores.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;a href="/uploads/images/2011/story_breakdown_notes.png"&gt;&lt;img src="/uploads/images/2011/story_breakdown_notes-783x1024.png" alt="" title="story_breakdown_notes" width="783" height="1024" class="" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/RnxAzLqYnn8" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/11/notes-from-the-field-breaking-down-user-stories</feedburner:origLink></entry>
    
    <entry>
        <title>Random Friday Thoughts: Leaving a Legacy Online is Free</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/N7taDc8L-Hk/random-friday-thoughts-leaving-a-legacy-online-is-free" />
        <updated>2011-11-04T00:00:00-07:00</updated>
        <id>http://creatingcode.com/2011/11/random-friday-thoughts-leaving-a-legacy-online-is-free</id>
        <content type="html">&lt;p&gt;
&lt;a href="/uploads/images/2011/bulb.jpg"&gt;&lt;img src="/uploads/images/2011/bulb-240x300.jpg" alt="" title="bulb" width="240" height="300" class="left" /&gt;&lt;/a&gt;I was thinking about the internet this morning.
I want you to go ahead and try to imagine all of the famous authors, painters, inventors, composers, and theorists that lived before, say, the 1980's.  There's a ton of great ones.  Leonardo da Vinci, Thomas Edison, J.S. Bach, Vincent van Gogh and the list goes on an on from famous to not-so-famous and popular to relatively unknown.
&lt;/p&gt;

&lt;p&gt;
Now, think, at some point in their lives, they had to come to the realization that all of the wonderful things they were creating were likely going to be lost shortly after their death.  After all, a good amount of famous artists weren't even appreciated until well after they were gone all the while plagued with the fear thet they won't be remembered after they die, uncertain about the legacy they will be leaving behind.
&lt;/p&gt;

&lt;p&gt;
Fast forward a few short decades to present day.  For $0 a month, I can have my own blog and github account.  Everything I create is instantly shared with the entire world.  My web content is archived by Google (which I'm pretty sure would survive a nuclear apocalypse) and my code is stored, replicated, and backed-up all across Github's data-centers.  Everything I create and put on-line will hang around this earth far longer than I will and it was all free.
&lt;/p&gt;

&lt;p&gt;
The fact that the things we create and put online never die is both invigorating and scary at the same time but we never have to worry about losing the work we create, even after we're gone.  So go ahead artist, composers, and inventors.  Keep creating awesome things and sharing them with the world.  After all, creating a legacy is free.
&lt;/p&gt;

&lt;p&gt;
&lt;div style="font-size: 8px;"&gt;Image source: &lt;a href="http://images.usatoday.com/news/_photos/2007/02/09/bulb.jpg"&gt;USA Today&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/N7taDc8L-Hk" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/11/random-friday-thoughts-leaving-a-legacy-online-is-free</feedburner:origLink></entry>
    
    <entry>
        <title>Using LINQ to sum up a list of numbers</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/YU48ld1invo/using-linq-to-sum-up-a-list-of-numbers" />
        <updated>2011-11-01T00:00:00-07:00</updated>
        <id>http://creatingcode.com/2011/11/using-linq-to-sum-up-a-list-of-numbers</id>
        <content type="html">&lt;p&gt;
I don't really like &lt;code&gt;foreach&lt;/code&gt; loops.  They are difficult to read and easy to abuse.
&lt;/p&gt;

&lt;p&gt;
Let's say, for example that we want to sum up the following list of numbers:
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561938.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
private int[] numberList = {1, 2, 4, 8, 16, 32}; //sum = 63
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Conventional programming wisdom says that we should do the following to find the sum of the above list:
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561940.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
int sum = 0;
foreach (int num in numberList)
{
  sum += num;
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
While this code does exactly what we need, it is not very expressive in its form.  &lt;code&gt;foreach&lt;/code&gt; loops end up looking the same whether you are trying to find the sum of a set of numbers or searching through a list of users to find a random contest winner.
&lt;/p&gt;

&lt;p&gt;
Luckily for us, .NET provides a easier and more readable way to accomplish the same functionality as the &lt;code&gt;foreach&lt;/code&gt; loop above.
&lt;/p&gt;

&lt;p&gt;
We will sum the same list of numbers using both a &lt;code&gt;foreach&lt;/code&gt; loop and a LINQ expression.  First, let's start off with some tests so we know what we can set up our expectations early.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561942.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
[TestFixture]
public class SumNumbersTests
{
  [Test]
  public void ShouldAddAllValuesUsingForeach()
  {
    var sum = new SumNumbers();
    Assert.AreEqual(63, sum.SumUsingForeach());
  }

  [Test]
  public void ShouldAddAllValuesUsingLinqExpression()
  {
    var sum = new SumNumbers();
    Assert.AreEqual(63, sum.SumUsingLinq());
  }

  [Test]
  public void LinqExpressionAndForeachSumShouldBeEqual()
  {
    var sum = new SumNumbers();
    Assert.AreEqual(sum.SumUsingForeach(), sum.SumUsingLinq());
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now that we have our tests set up, we can move on to the actual code.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561949.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public class SumNumbers
{
  private int[] numberList = {1, 2, 4, 8, 16, 32}; 

  public int SumUsingLinq()
  {
    return numberList.Sum(num =&gt; num);
  }

  public int SumUsingForeach()
  {
    var sum = 0;
    foreach (int num in numberList)
    {
      sum += num;
    }
    return sum;
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
See how much easier the LINQ expression is to read?  In fact, you don't even need to put anything in the parenthesis.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561955.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public int SumUsingLinq()
{
  return numberList.Sum();
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;h3&gt;Taking it to the next level&lt;/h3&gt;
&lt;/p&gt;

&lt;p&gt;
The above example was a bit simple, so let's solve a problem that is a little more complex to help drive the point home.  Let's say that we want to sum the squares of each item in &lt;code&gt;numberList&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Just as before, we can manually find our expected answer given the same list of integers and set up our expectation before writing our production code.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561959.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
[Test]
public void ShouldSumTheSquaresOfAllValuesUsingLinqExpression()
{
  var sum = new SumNumbers();
  Assert.AreEqual(1365.0, sum.SumSquaresUsingLinq());
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now, we can use the same methods as above which becomes more readable and succinct.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1561961.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public double SumSquaresUsingLinq()
{
  return numberList.Sum(num =&gt; Math.Pow(num, 2));
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
You can find the project files for this example on &lt;a href="https://github.com/codesamples/LINQSum"&gt;Github&lt;/a&gt; under the &lt;a href="http://ospl.ws"&gt;Open Source Public License&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/YU48ld1invo" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/11/using-linq-to-sum-up-a-list-of-numbers</feedburner:origLink></entry>
    
    <entry>
        <title>Happy Halloween at Southwest Airlines</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/_SnecuFkzEE/happy-halloween-at-southwest-airlines" />
        <updated>2011-10-31T00:00:00-07:00</updated>
        <id>http://creatingcode.com/2011/10/happy-halloween-at-southwest-airlines</id>
        <content type="html">&lt;p&gt;
Here's a little glimpse into the festivities going on today at Southwest.  It's really nice working for a place that promotes such a laid back and fun loving atmosphere.
&lt;/p&gt;

&lt;p&gt;
&lt;a href="/uploads/images/2011/swa_halloween.jpg"&gt;&lt;img src="/uploads/images/2011/swa_halloween-785x442.jpg" alt="" title="swa_halloween" width="785" height="442" class="" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/_SnecuFkzEE" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/10/happy-halloween-at-southwest-airlines</feedburner:origLink></entry>
    
    <entry>
        <title>New Ratcheting.org Post Up</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/uICfftFtLp4/new-ratcheting-org-post-up" />
        <updated>2011-10-18T00:00:00-07:00</updated>
        <id>http://creatingcode.com/2011/10/new-ratcheting-org-post-up</id>
        <content type="html">&lt;p&gt;
My new post is up on &lt;a href="http://ratcheting.org"&gt;ratcheting.org&lt;/a&gt; about three steps you can take when you aren't flagging enough commits as risky. &lt;a href="http://ratcheting.org/2011/10/18/tweaking-heuristics-for-better-results.html"&gt;Check it out&lt;/a&gt; if you are interested.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/uICfftFtLp4" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/10/new-ratcheting-org-post-up</feedburner:origLink></entry>
    
    <entry>
        <title>How to get a temp directory in any OS with Ruby</title>
        <link href="http://feedproxy.google.com/~r/CreatingCode/~3/lccxkJWERcM/how-to-get-a-temp-directory-in-any-os-with-ruby" />
        <updated>2011-10-18T00:00:00-07:00</updated>
        <id>http://creatingcode.com/2011/10/how-to-get-a-temp-directory-in-any-os-with-ruby</id>
        <content type="html">&lt;p&gt;
I needed this over the weekend and the existing online help is less than helpful.  As it turns out, just like with everything I try to do in Ruby, the solution is simple.
&lt;/p&gt;

&lt;p&gt;
&lt;script src="https://gist.github.com/1536630.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
require 'tmpdir'
temp = Dir.tmpdir() 
puts temp #C:/Users/Robert/AppData/Local/Temp
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This is all built into Ruby, you don't need to install any gems or anything.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CreatingCode/~4/lccxkJWERcM" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://creatingcode.com/2011/10/how-to-get-a-temp-directory-in-any-os-with-ruby</feedburner:origLink></entry>
    
</feed>

