<?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>loop label &#187; best practices</title>
	<atom:link href="http://blog.looplabel.net/category/best-practices/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.looplabel.net</link>
	<description>programming, technology and human behavior</description>
	<lastBuildDate>Sun, 03 Oct 2010 09:50:43 +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>Writing a Good Technical Résumé/CV</title>
		<link>http://blog.looplabel.net/2009/02/12/writing-a-good-technical-resume-cv/</link>
		<comments>http://blog.looplabel.net/2009/02/12/writing-a-good-technical-resume-cv/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 22:47:06 +0000</pubDate>
		<dc:creator>Anders Sandvig</dc:creator>
				<category><![CDATA[best practices]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[writing]]></category>
		<category><![CDATA[curriculum vitae]]></category>
		<category><![CDATA[cv]]></category>
		<category><![CDATA[jobseeking]]></category>
		<category><![CDATA[resume]]></category>

		<guid isPermaLink="false">http://looplabel.wordpress.com/?p=604</guid>
		<description><![CDATA[From time to time people ask me to help them write a résumé for a job application or review their CV. I have also noticed the topic popping up elsewhere, so I decided to write down some of my general advice and recommendations for everyone to see (and discuss). These guidelines are intended for programmers, [...]]]></description>
			<content:encoded><![CDATA[<iframe src="http://www.facebook.com/plugins/like.php?href=http://blog.looplabel.net/2009/02/12/writing-a-good-technical-resume-cv/&amp;layout=standard&amp;show_faces=1&amp;width=450&amp;action=like&amp;colorscheme=light&amp;font=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:25px"></iframe><p>From time to time people ask me to help them write a résumé for a job application or review their CV. I have also noticed the topic popping up elsewhere, so I decided to write down some of my general advice and recommendations for everyone to see (and discuss). These guidelines are intended for programmers, software developers, system architects, system administrators, technical support staff and other people applying for technical and engineering positions, but many of the ground rules are valid for any profession.<sup><a href="#notes1">1</a></sup></p>
<h4>The Anatomy of a Résumé</h4>
<p><strong>The main purpose of a résumé<sup><a href="#notes2">2</a></sup> is to get you an interview.</strong> It&#8217;s fair to assume that your résumé will only be one in a large pile of applications, and that whoever is reading them is a busy person who&#8217;s time is limited and/or valuable. Therefore, it&#8217;s important to note that <strong>a potential employer wants to learn as much as possible about you, your skills and your experience by reading as little as possible</strong>.</p>
<p>With this in mind you should <strong>keep it short and to the point</strong>. Few people bother to read anything longer than three pages, and some may only read the first page or the first few paragraphs during the initial screening. Therefore, <strong>put the most important information first, and make your first page a memorable one</strong>. As we all know, you don&#8217;t get a second chance to make a first impression.</p>
<p>To help your readers easily locate the information they are looking for, I recommend following <a href="http://en.wikipedia.org/wiki/R%C3%A9sum%C3%A9#Curriculum_vitae">a traditional CV layout</a> with a structure your reader is already familiar with:</p>
<ol>
<li>Personal details and contact information.</li>
<li>Work experience (in reverse chronological order).</li>
<li>Education and training (in reverse chronological order).</li>
<li>Optional sections (order may wary).</li>
</ol>
<p>While the sections in the fourth part may appear in any order, I do not recommend changing the order of the first three parts. These should appear in the order listed to make quick scanning as easy as possible. It also shows that you know how to set up a résumé properly, thereby implicitly indicating that you have a certain level of professionalism.</p>
<h4>1. Personal Details and Contact Information</h4>
<p>Maybe <em>the</em> most important part of a résumé is your personal details and contact information. It doesn&#8217;t matter if you have the best qualifications in the world if a potential employer doesn&#8217;t know who you are or how to get in touch with you.</p>
<p>I recommend always including the following on the first page:</p>
<ul>
<li>
<p><strong>Your full name and date of birth.</strong> If your have a foreign or uncommon name, or your name is commonly used by both men and women, including your gender may also bee a good idea.</p>
</li>
<li>
<p><strong>Your home address.</strong> This is important to show your geographical location. If you are applying for a job in a different region or country than where you are currently living, providing some information about whether you will be locally available for an interview is also recommended. If you are staying on a temporary address while applying for jobs (i.e. while visiting abroad), also include the temporary address to show that you are locally available.</p>
</li>
<li>
<p><strong>Your phone number and e-mail address.</strong> Obviously, you must provide this in order for a potential employer to contact you. If you are living in a different time zone and/or country from where the employer is located, it may also be a good idea to include some information about when you will be available via phone or when you will be replying to e-mails. This also applies if you are only available at certain times because of your current job or other factors. In general, you should only list phone numbers and e-mail addresses that you will be able to respond to immediately or within a short time frame. A potential employer trying to call you only to be met by an answering machine or an endless ringing may not bother to call back, so make yourself as available as possible.</p>
</li>
<li>
<p><strong>Address of your homepage, blog or otherwise relevant web site.</strong> This should only be included if the site(s) contain information about you or your technical skills and experience that is relevant to the position(s) you are applying for. A good example of this would be a link to a software project you are participating in or a technical blog you are contributing to. Such sites can provide useful background information for an employer and is a good way to show your interest for projects outside of work.</p>
</li>
</ul>
<p>Some people also like to include their marital status and number of children (when applicable) with their personal details. Some argue that including such information can be beneficial in helping the reader get an overall impression of you as a person (i.e. are you a family person or not), and it can be useful as a casual conversation topic during an interview, but not including it is not likely to affect your application negatively.</p>
<p>Often people ask if they should include a picture of themselves. Personally I don&#8217;t have any strong opinions on this, so feel free to do it if you want to. In some countries pictures are more common, but they are hardly ever required for technical positions.</p>
<p><strong>Update:</strong> <em>As <a href="http://www.reddit.com/r/programming/comments/7xq2p/writing_a_good_technical_r%C3%A9sum%C3%A9cv_bloglooplabelnet/">several readers have pointed out</a>, including your age, date of birth, gender, ethnicity, marital status, picture and other &#8220;trivia&#8221; is not recommended in many countries (<a href="http://europass.cedefop.europa.eu/">including the EU</a>), due to the employer&#8217;s possibility of rejecting the application in fear of discrimination lawsuits.</em></p>
<h5>Quick Summary</h5>
<p>Since résumés are typically scanned very fast, I recommend to <strong>include a short&mdash;one or to paragraphs&#8211;&#8221;snippet&#8221; about yourself at the top of the first page</strong> (after the basic personal information, contact details, etc.). <strong>If someone only reads the first few sentences of your résumé, this is your only chance to make a good first impression.</strong></p>
<p>A good way to quickly give the reader an overview of your skills and qualification is to also <strong>summarize your areas of expertise and key domains with a few keywords on the first page</strong>. Again, this is your first impression for lazy and busy readers, so put &#8220;trigger&#8221; keywords here that will make people interested in reading more. For example:</p>
<blockquote><p>
  <em>Key areas:</em><br />
  programming, quality assurance, usability, networking (TCP/IP), enterprise systems, distributed applications, Scrum, security, databases (SQL), test-driven development, real-time graphics (2D/3D).
</p></blockquote>
<p>Don&#8217;t fall for the temptation to put a lot of buzzwords in this section. It&#8217;s not likely to impress anyone and you risk appearing to be trying too hard. It&#8217;s much better to use plain, regular words to describe your skills and areas of expertise. However, if you are responding to a job opening where experience with specific technologies or domains are required, you should list them (given that you have the required skills and experience, of course), even if they seem a bit &#8220;buzzy&#8221;. After all, if the employer listed them, they hopefully know what they mean and why they are important. Also, <strong>never include words or technical phrases if you are not absolutely confident you know what they mean</strong>. If something is on your résumé, be prepared to answer questions about it during an interview.</p>
<p>In conclusion, <strong>the first page is the most important page of your résumé</strong>. Ideally, this page should contain enough information to still make you an interesting candidate for the job, even when your cover letter and original application is lost (believe me, it happens) and somebody forgot to staple the pages together after printing, so only the first page makes it to the reviewers desk (yes, this also happens).</p>
<h4>2. Work Experience</h4>
<p>Work experience should be listed in reverse chronological order with the newest positions/projects appearing first. It&#8217;s also quite common to elaborate more on the most recent entries and provide less detail for older ones.</p>
<p>To make the list easy to scan, I recommend laying it out as a two-column table, listing the year in one column and position/project description in the other. For positions or projects lasting shorter than a year, list the year in the left column and provide a note about the duration in the right column. For anything lasting more than a year, provide a number range in the left column. To keep the list as simple as possible, you should avoid specifying dates in the left column. If anything needs further clarification or specification, write it as a part of the description in the right column.</p>
<p>An alternative to the two-column table layout is to write out each entry as a separate paragraph, with the paragraph heading containing year or year range (possibly with duration) and job title or project name.</p>
<p>How much detail should be provided with each entry in the work experience list is a hard to say in absolute terms, as this will depend on how much experience you have and how much there is to tell about each position or project. If you have many entries in your list (i.e. due to participation in many projects or extensive work experience over many years), you may have to shorten your descriptions to avoid making the résumé too long. If you lack experience, it&#8217;s fine to elaborate on whatever experience you do have, but avoid writing too much just to fill up the page. Again, the <strong>less is more</strong> principle applies, so <strong>chose your words carefully</strong> and <strong>keep it short and to the point</strong>.</p>
<p>It&#8217;s also a good idea to <strong>include keywords for your work experience</strong>. If you write a few sentences about each job position or project, also include some keywords about the languages, concepts and technologies used. Again, this is to make the list easier to scan for people who don&#8217;t have time to read it all or who are looking for specific &#8220;triggers&#8221;.</p>
<p>Example:</p>
<blockquote><pre>2006: Mad scientist assistant, Insanely Rich Man Inc., Secret Place.
      Worked as an assistant for a mad scientist on a private research
      project funded by an insanely rich man. Developed humanoid robots
      to feed and play with his pet tigers while he was on vacation.
      Project duration: 6 months

      Keywords: Python, C++, Scrum, robotics, micro-controllers,
      animal psychology.</pre>
</blockquote>
<h4>3. Education</h4>
<p>Your education should be listed in a similar way to the work experience, preferably with the same layout (i.e. a two-column table or separate paragraphs with accompanying headers).</p>
<p>If you have taken certifications or training courses after graduating from a university, college or other higher education, I recommend listing them separately in a section after your &#8220;traditional&#8221; education. There&#8217;s nothing wrong with interleaving the two, but separating them often make it easier to scan the page and quickly locating your formal eduction and your certifications independently of each other (i.e. an employer may not care whether you have a master or bachelor degree, but just wants to see if you have a given certification or have attended a certain training course).</p>
<h4>4. Optional Sections</h4>
<p>The final sections of the résumé do not follow the same strict rules as the ones describe above, and opinions on what to include and not include vary greatly. However, some sections are more common than others. One of the most common to include is a list of spoken and written languages. Some also like to include a listing of volunteer work they have done or organizational positions they hold or have held (i.e. coaching a junior soccer team or working Monday nights in a soup kitchen). This information may not be directly relevant to the position you are applying for, but it can provide an indication of commitment, social skills or leadership talent (even if the experience is informal).</p>
<h5>Hobbies and Interests</h5>
<p>I also recommend to <strong>list your hobbies and interests</strong>. They tell something about you as a person and it gives the interviewer a chance to &#8220;break the ice&#8221; and make you relax with some smalltalk. You might be surprised how often geeks (even geek bosses) share similar interests, also outside the domain of computers and natural sciences.</p>
<p>If you have participated in any hobby or open source software projects or published any articles or other manuscripts, I also recommend making a section describing those. This can be particularly beneficial if you lack formal work experience or formal education, as describing hobby projects or other relevant experience shows that you have an interest in your field and are eager to learn.</p>
<h5>Skill Table</h5>
<p>If you have experience in many programming languages or technologies, it might be useful to list them in a three-column table listing the language or technology, years of experience and your subjective experience level. For example:</p>
<blockquote><pre>  <strong>Language</strong>    <strong>Level</strong>           <strong>Known since</strong>
  C++         Basic           2005
  Perl        Basic           2007
  PHP         Intermediate    2004
  Java        Advanced        2003
</pre>
</blockquote>
<p>This gives the reader a quick overview of your experience levels and allows you to list many entries in a compact and clean way. The table can consist of any skill, technology or domain you want to emphasize and is of course not limited to programming languages.</p>
<h5>References</h5>
<p>Some people recommend listing references on your résumé. Personally, I don&#8217;t see any need for this, as references are usually not relevant until further down the line. It&#8217;s very unlikely that anyone would need to check your references before an initial interview, so I doubt anyone would require them on a résumé. That being said, having references on your résumé will never hurt. I can imagine some employers prefer it that way, as this may save them some time when looking up your references later (i.e. they don&#8217;t have to remember where they wrote down the names and phone numbers during the interview). Anything that will make life easier for the employer is likely to be seen as positive.</p>
<p>Even if you don&#8217;t list the actual references, it can be useful to indicate that references will be provided upon request, either on your résumé or in the cover letter. This way you show that you have someone who is willing to be your reference, which is always a plus. Also, make sure that if you do include include named references with contact details, that you have talked to them beforehand and that they are ready to be contacted by potential employers.</p>
<h4>The Cover Letter</h4>
<p>As the résumé is meant to get you an interview, <strong>the cover letter is meant to get your résumé read</strong>. If you are sending your résumé in response to an advertised job opening, always include a cover letter. Including a cover letter is also recommended when sending a general application or offering your services without anyone actually requesting them. In fact, I can&#8217;t think of a single situation where not including a cover letter would be a good idea. So, to summarize: <strong>always include a cover letter with your résumé</strong>.</p>
<p>The cover letter should contain information about why you are sending your résumé and what job you are applying for. Remember, the people receiving your letter are busy, so keep in mind that <strong>sending a long cover letter is almost a certain guarantee that it will not be read and your résumé ignored</strong>. I can&#8217;t think of a single reason why a cover letter would ever need to be longer than a few paragraphs, so <strong>keep your cover letter as short as possible</strong>.</p>
<p>For example, there is no reason to write about how talented you are or how eager you are to start working at your potential employer&#8217;s company. They already know you are interested in the job by the fact that you applied, and the résumé will show your skills and experience. That being said, the cover letter is a good place to put a few sentences about your current job/study situation and why you are applying. If you are sending a general résumé with your application, the cover letter can also be useful for highlighting skills and experience that is particularly relevant for the position you are applying to. In short, <strong>the cover letter itself should be the job application, while the résumé should be the document convincing your future employer that you are the right person for the job</strong>.</p>
<p>If you are in doubt whether you should include something in the résumé or put it in the cover letter, I would recommend putting it in the résumé. The main reason for this is the simple fact that <strong>whoever is reviewing your résumé may never see your cover letter</strong>. It&#8217;s quite common that the person doing the initial screening&mdash;to pick out which résumés should be considered for further review&mdash;is not the same person who will do the second screening, and there is no guarantee that your cover letter will be passed along to the next step (even if both steps are done by the same person).</p>
<p>A common example of this is when a middle manager performs the initial screening of potential candidates and distributes their résumés to other technical personnel for a more in-depth analysis of skills and experience. There is also a chance that your résumé will be considered for other positions than the one you applied to&mdash;either immediately or at a later time&mdash;in which case the initial cover letter may no longer be considered relevant.</p>
<h4>Common Pitfalls</h4>
<p>There are many common pitfalls to writing and sending out résumés and job applications. I won&#8217;t be able to cover them all in depth here, but here is a short summary of what you should do to avoid some of the major ones:</p>
<ul>
<li>
<p><strong>Check your spelling and grammar.</strong> It&#8217;s amazing how many people seem to neglect this. I have seen applications from higly educated and well experienced people who did not appear to care much about their spelling or grammar. You may be lucky and have your application read by someone who will not notice or who does not care, but that&#8217;s not a chance I recommend you take. Since finding your own errors can be quite hard, it&#8217;s usually a good idea to have someone read through both your résumé and cover letter before sending it.</p>
</li>
<li>
<p><strong>Make it clear what position you are applying for.</strong> This is preferably done by writing something like &#8220;Application for &lt;position&gt;&#8221; or &#8220;Job application: &lt;position&gt;&#8221; in the subject of your e-mail. Again, it&#8217;s amazing how many people actually forget this. It&#8217;s quite common for companies to use the same e-mail address for many job openings, and the person reading the e-mail may very well not be qualified (or have the time) to guess which position you applied for, so make sure there is no doubt.</p>
</li>
<li>
<p><strong>Check for copy/paste errors.</strong> Sending out multiple applications at the same time or using a previous application as a base for a new one is all good, but please, do remember to check that you send it to the correct address and provide the correct company name in the cover letter. Copy/paste errors are usually obvious to the receiver, and it sends a signal of sloppiness, which you are better to avoid.</p>
</li>
<li>
<p><strong>Use a standard file format for your résumé.</strong> What is considered standard may vary, but usually PDF is the best choice. Word or HTML format may also be accepted, but if in doubt, use PDF. Sometimes the employer will specify which format they want the files in, in which case you should of course use whatever format they request. Don&#8217;t try to embed the résumé in your e-mail. It may look good on your screen, but you have no idea what it will look like for others. Also, it makes it harder to distribute the résumés separately.</p>
</li>
<li>
<p><strong>Remember to include your résumé.</strong> It sounds stupid, I know, but it still happens, so make sure to double-check that attachment before hitting &#8220;send&#8221;. It doesn&#8217;t look good when you forget.</p>
</li>
<li>
<p><strong>Do <em>not</em> send your cover letter as an attachment.</strong> When sending an application via e-mail there is no reason whatsoever why you should not make the cover letter a part of the e-mail. Sending an extra attachment just creates more work for the receiver, and thus reduces the chance of your letter ever being read.</p>
</li>
</ul>
<p>Related links:</p>
<ul>
<li><a href="http://stackoverflow.com/questions/149553/best-format-for-a-software-engineers-resume">Best Format for a Software Engineer’s Resume (Stack Overflow)</a></li>
<li><a href="http://www.developerdotstar.com/mag/articles/read_resume.html">The Art of the Developer Resume &#8211; Improving the Programmer Resume (Daniel Read)</a></li>
<li><a href="http://www.joelonsoftware.com/articles/ResumeRead.html">Getting Your Résumé Read (Joel Spolsky)</a></li>
</ul>
<p>Notes:</p>
<ol>
<li><a name="notes1"></a>The recommendations are based on my own experience and preferences after reading hundreds of résumés over the years, and also writing a few of my own. Of course, I can&#8217;t guarantee that whoever is reading your résumé feels the same way as me, but judging from the feedback I have received on my own résumés and advice given to others, I feel safe saying that at least someone out there agrees with me.</li>
<li><a name="notes2"></a>Note that I do not distinguish between a résumé and a curriculum vitae (CV). Some industries and academic institutions may have specific requirements for the layout and presentation of your résumé/CV, but if you are qualified to apply to either, you are probably already aware of this. Unless you are applying to a <em>very</em> conservative company or an academic position, the difference is not likely to matter, and the format described here is probably what you want.</li>
</ol>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.looplabel.net%2F2009%2F02%2F12%2Fwriting-a-good-technical-resume-cv%2F&amp;title=Writing%20a%20Good%20Technical%20R%C3%A9sum%C3%A9%2FCV" id="wpa2a_2"><img src="http://blog.looplabel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.looplabel.net/2009/02/12/writing-a-good-technical-resume-cv/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Best Practices for Version Control</title>
		<link>http://blog.looplabel.net/2008/07/28/best-practices-for-version-control/</link>
		<comments>http://blog.looplabel.net/2008/07/28/best-practices-for-version-control/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 00:21:15 +0000</pubDate>
		<dc:creator>Anders Sandvig</dc:creator>
				<category><![CDATA[best practices]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[revision control]]></category>
		<category><![CDATA[scm]]></category>
		<category><![CDATA[source code managment]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[vcs]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://looplabel.wordpress.com/?p=63</guid>
		<description><![CDATA[Source code version control systems have been around for decades, but sometimes I suspect people are using them just because everybody else is, or because their manager told them to do so, or because it&#8217;s company policy. Although most people will agree that using version control is a prerequisite for any serious software project, many [...]]]></description>
			<content:encoded><![CDATA[<iframe src="http://www.facebook.com/plugins/like.php?href=http://blog.looplabel.net/2008/07/28/best-practices-for-version-control/&amp;layout=standard&amp;show_faces=1&amp;width=450&amp;action=like&amp;colorscheme=light&amp;font=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:25px"></iframe><p>Source code <a href="http://en.wikipedia.org/wiki/Revision_control">version control systems</a> have been around <a href="http://en.wikipedia.org/wiki/Source_Code_Control_System">for decades</a>, but sometimes I suspect people are using them just because everybody else is, or because their manager told them to do so, or because it&#8217;s company policy. Although most people will agree that using version control is <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">a prerequisite for any serious software project</a>, many programmers only utilize a small percentage of the possibilities and advantages such systems can provide.</p>
<p>Here are some of my thoughts on what I consider best practices for using version control systems. In short, they can be described with seven basic sentences:</p>
<ol>
<li>Put everything under version control.</li>
<li>Create sandbox home folders.</li>
<li>Use a common project structure and naming convention.</li>
<li>Commit often and in logical chunks.</li>
<li>Write meaningful commit messages.</li>
<li>Do all file operations in the version control system.</li>
<li>Set up change notifications.</li>
</ol>
<p>These recommendations are based on my own experience and preferences with using <a href="http://www.nongnu.org/cvs/">CVS</a> and <a href="http://subversion.tigris.org/">Subversion</a> over the years, but the principles should easily transfer to other systems as well.</p>
<h4><a name="everything"></a>1. Put Everything Under Version Control</h4>
<p>Any files associated with any project you are working on that may be of interest to anyone else&mdash;or even only to yourself&mdash;should be put under version control. Note that this is not limited to source code and files related to the implementation of a project, but also includes documents such as meeting minutes, specifications, architecture and design documents, artwork, configuration files and install scripts. When doing research for a project and gathering information from external resources, I also like to add those to the <a href="http://en.wikipedia.org/wiki/Source_code_repository">repository</a>. Some examples are product brochures, protocol specifications, book references and links to company web sites. E-mail correspondence, scans of whiteboard notes or a concept drawing on a napkin are also useful to store for later reference.</p>
<p>Although some people think it&#8217;s silly to archive files that never change in a version control system, I find great value in having every document related to a project stored in the same place. It makes finding things so much easier&mdash;which can save you a lot of time when you don&#8217;t have to dig through hundreds of e-mails to locate that specification you got six months ago but didn&#8217;t have time to start implementing until now. Also, in the area of software development, there is no such thing as a document that never changes (or at least, there shouldn&#8217;t be, because you always remember to update your documentation, right?). If you are working on a project where many documents are produced by non-technical or non-programming people (i.e. people who don&#8217;t use version control), consider setting up automatic synchronization between project file shares and the version control repository.</p>
<p>When documentation is kept in a <a href="http://en.wikipedia.org/wiki/Wiki">wiki</a>, things might be a bit different. If the wiki itself keeps track of changes&mdash;which any decent wiki will do&mdash;there may be no need to store this data in a separate system. If your wiki is backed by a database, you may consider <a href="http://www.codinghorror.com/blog/archives/000743.html">putting the database itself under version control</a>, but some people will view this as redundant (after all, you have automated backups of all your databases, right?). I don&#8217;t have any preferences on how this should be solved, as long as all documents related to a project is stored on a central server with associated revision history.</p>
<p>For document formats that require processing before being readable, such as <a href="http://www.docbook.org/">DocBook</a>, <a href="http://www.lyx.org/">LyX</a> and <a href="http://www.latex-project.org/">LaTeX</a> files, I prefer also <a href="http://en.wikipedia.org/wiki/Commit_(data_management)">committing</a> them in a more readable form, like PDF or HTML. Some may argue this violates the <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> principle, but it also makes the documents easier to read for people who don&#8217;t have the required processing tools installed (or who are just lazy). This can be very useful when distributing documents by linking to them directly in the repository (i.e. via HTTP), but do take care to update both versions when making changes to such files&mdash;or even better, automate it.</p>
<h4><a name="sandbox"></a>2. Create Sandbox Home Folders</h4>
<p>To encourage developers to use the version control system also for their own documents, (experimental) projects and tools, I recommend creating home folders in the repository, giving each user a <a href="http://en.wikipedia.org/wiki/Sandbox_(software_development)">sandbox</a> to play with. In my experience, many useful tools have started out as simple scripts in a developer&#8217;s home folder and evolved into powerful utilities over time, so why not keep the revision history from day one? This also allows less experienced developers to experiment with <a href="http://en.wikipedia.org/wiki/Branching_(software)">branching</a>, <a href="http://en.wikipedia.org/wiki/Revision_tag">tagging</a> and <a href="http://en.wikipedia.org/wiki/Merge_(revision_control)">merging</a>, hopefully encouraging them to use those features in &#8220;real&#8221; projects as well.</p>
<h4><a name="structure"></a>3. Use a Common Project Structure and Naming Convention</h4>
<p>I recommend a consistent naming convention for all files and folders in a project. Preferably, an effort should be made to maintain the convention between projects throughout the repository. This makes it easier to locate files by partially guessing their name or location. For example, finding the source code for a project with many sub-folders will be much easier if the folder containing source code is named <tt>src</tt> rather than something totally arbitrary.</p>
<p>Using a common project structure can also be valuable for automated tools. For example, if all projects have a <tt>readme.txt</tt> or <tt>readme.html</tt> in their root folder, one can easily implement a script to generate a web page with a brief description of each project in the repository. If you are using an automated build system, such as <a href="http://maven.apache.org/">Apache Maven</a>, some of this structure may already defined for you. Ideally, the project structure and naming policies should be described in your <a href="http://en.wikipedia.org/wiki/Coding_conventions">coding conventions</a> or similar guidelines.</p>
<h4><a name="commits"></a>4. Commit Often and in Logical Chunks</h4>
<blockquote><p><em>It&#8217;s better to have a broken build in your working repository than a working build on your broken hard drive.</em></p></blockquote>
<p>I prefer to follow the basic work cycle described in <a href="http://svnbook.red-bean.com/">the Subversion book</a>. This means that you should always update your working copy before doing any changes to files. In general it&#8217;s preferred to commit changes in logical chunks. Changes that belong together should be committed together, changes that don&#8217;t shouldn&#8217;t. This can make the resulting revision history significantly more useful on systems with <a href="http://en.wikipedia.org/wiki/Atomic_commit">atomic commits</a> when changes span multiple files.</p>
<p>If you are doing many changes to a project at the same time, split them up into logical parts and commit them in multiple sessions. This makes it much easier to track the history of individual changes, which will save you a lot of time when trying to find and fix bugs later on. For example, if you are implementing feature A, B and C and fixing bug 1, 2 and 3, that should result in a total of at least six commits, one for each feature and one for each bug. If you are working on a big feature or doing extensive <a href="http://en.wikipedia.org/wiki/Code_refactoring">refactoring</a>, consider splitting your work up into even smaller parts, and make a commit after each part is completed. Also, when implementing independent changes to multiple logical modules, commit changes to each module separately, even if they are part of a bigger change.</p>
<p>Ideally, you should never leave your office with uncommitted changes on your hard drive. If you are working on projects where changes will affect other people, consider using a branch to implement your changes and merge them back into the <a href="http://en.wikipedia.org/wiki/Trunk_(software)">trunk</a> when you are done. When committing changes to libraries or projects that other projects&mdash;and thus, other people&mdash;depend on, make sure you don&#8217;t break their builds by committing code that won&#8217;t compile. However, <a href="http://www.codinghorror.com/blog/archives/001134.html">having code that doesn&#8217;t compile is not an excuse to avoid committing</a>. Use branches instead.</p>
<h4><a name="messages"></a>5. Write Meaningful Commit Messages</h4>
<blockquote><p><em>If you have nothing to say about what you are committing, you have nothing to commit.</em></p></blockquote>
<p>Always write a comment when committing something to the repository. Your comment should be brief and to the point, describing what was changed and possibly why. If you made several changes, write one line or sentence about each part. If you find yourself writing a very long list of changes, consider splitting your commit into smaller parts, as described earlier. Prefixing your comments with identifiers like <em>Fix</em> or <em>Add</em> is a good way of indicating what type of change you did. It also makes it easier to filter the content later, either visually, by a human reader, or automatically, by a program.</p>
<p>If you fixed a specific bug or implemented a specific <a href="http://en.wikipedia.org/wiki/Change_request">change request</a>, I also recommend to reference the bug or issue number in the commit message. Some tools may process this information and generate a link to the corresponding page in a <a href="http://en.wikipedia.org/wiki/Bug_tracking_system">bug tracking system</a> or automatically update the issue based on the commit.</p>
<p>Here are some examples of good commit messages:</p>
<blockquote><pre>Changed paragraph separation from indentation to vertical space.
...
Fix: Extra image removed.
Fix: CSS patched to give better results when embedded in javadoc.
Add: A javadoc {@link} tag in the lyx, just to show it's possible.
...
- Moved third party projects to ext folder.
- Added lib folder for binary library files.
...
Fix: Fixed bug #1938.
Add: Implemented change request #39381.</pre>
</blockquote>
<p>Many developers are sloppy about commenting their changes, and some may feel that commit messages are not needed. Either they consider the changes trivial, or they argue that you can just inspect the revision history to see what was changed. However, the revision history only shows what was actually changed, not what the programmer intended to do, or why the change was made. This can be even more problematic when people don&#8217;t do fine-grained commits, but rather submit a week&#8217;s worth of changes to multiple modules in one large pile. With a fine-grained revision history, comments can be useful to distinguish trivial from non-trivial changes in the repository. In my opinion, if the changes you made are not important enough to comment on, they probably are not worth committing either.</p>
<h4><a name="file_operations"></a>6. Do All File Operations in the Version Control System</h4>
<p>Whenever you need to copy, delete, move or rename files or folders in the repository, do so using the corresponding file operations in the version control system.<sup><a href="#note1">1</a></sup> If this is done only on the local file system, the history of those changes will be lost forever. I consider structural changes just as important as changes to the files themselves, so there is no reason why not to let the version control system keep track of them. Also, when people know all their changes can be undone, the threshold for doing radical restructuring and major refactoring will be lowered, which can have a significant impact on preventing the build-up of <a href="http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx">technical debt</a>.</p>
<h4><a name="notifications"></a>7. Set Up Change Notifications</h4>
<p>To monitor changes in the repository as they happen, I recommend setting up change notifications to send out an e-mail or update an RSS feed whenever a commit is made. Some systems support notifications directly via event hooks&mdash;sometimes with default implementations provided&mdash;while others may require external cron jobs, daemons or custom scripts to provide this feature.</p>
<p>My recommendation is that all developers subscribe to change notifications, since they can have many advantages. Obviously, they are useful if you want to see what changes are being done to projects you are working on or have an interest in (i.e. a library your project is using), but they might also encourage&mdash;or scare&mdash;people into writing more useful commit messages, since they know someone might actually be reading them.</p>
<p>Typically the notifications will also contain extracts of the files that were changed, making them useful for light-weight <a href="http://en.wikipedia.org/wiki/Code_review">code reviews</a>. Programmers who monitor source code changes can keep an eye out for <a href="http://en.wikipedia.org/wiki/Code_smell">code smells</a> or violations of the coding conventions, and if you are lucky, you might even learn something by reading other people&#8217;s code.</p>
<p>Here&#8217;s an example of what a commit notification e-mail can look like:</p>
<blockquote><pre>From: svn-commit@company.com
Sent: Wednesday, March 05, 2008 11:23 AM
To: svn-commit@company.com
Subject: [SVN:CompanyRepository] r6523 - trunk/documents/templates

Author: anders
Date: 2008-03-05 11:23:08 +0100 (Wed, 05 Mar 2008&#41; New Revision: 6523

Modified:
    trunk/documents/templates/document.lyx
Log:
Changed paragraph separation from indentation to vertical space.

Modified: trunk/documents/templates/document.lyx
===================================================================
--- trunk/documents/templates/document.lyx 2008-03-05 09:22:49 UTC (rev 6522)
+++ trunk/documents/templates/document.lyx 2008-03-05 10:23:08 UTC (rev 6523)
@@ -32,7 +32,7 @@
\footskip 1cm
\secnumdepth 3
\tocdepth 3
-\paragraph_separation indent
+\paragraph_separation skip
\defskip medskip
\quotes_language english
\papercolumns 1</pre>
</blockquote>
<p>If you are working on <a href="http://www.joelonsoftware.com/items/2006/11/29.html">a large project</a> or there are many active projects in your repository, you may find it useful to create separate notifications for each module or project. If notifications are sent via e-mail, you can also configure the subject field to indicate which module or repository the notification belongs to, making them possible to process with standard e-mail filtering rules.</p>
<h4>Conclusion</h4>
<p>If you are already doing all of the above, great for you! If not, adding even a few of these to your work habits can make a difference. Of course, not everyone is in a position to change the structure of their project or the repository configuration, but any programmer can make their life easier with logically grouped commits and meaningful commit messages. Consider giving it a try, you might like it.</p>
<p>Please share your thoughts.</p>
<p>Notes:</p>
<ol>
<li><a name="note1"></a>CVS has very limited support for file oprations, which is a good reason to switch to Subversion.</li>
</ol>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.looplabel.net%2F2008%2F07%2F28%2Fbest-practices-for-version-control%2F&amp;title=Best%20Practices%20for%20Version%20Control" id="wpa2a_4"><img src="http://blog.looplabel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.looplabel.net/2008/07/28/best-practices-for-version-control/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

