Microformatting the Resume

When a computer script crawls across the web looking for information (like Google's search robot) they need to do a lot of thinking to figure out what information is located on a web page. After all, web pages are written by humans for humans, with the data and information contained in our complex, contextual language. Web developers can help a script understand their site with robots.txt, xml feeds, and designated syntax (like using h1 tags for headers), and more recently, microformats.

The best way a script can understand text is by tagging it. This is how some xml formats work - you wrap the title with a <title> tag, set relative priority with a <priority> tag, etc. However, xhtml and older html formats only let you wrap normal web pages with standard tags, like p (paragraph), h1 - h6 (headers), etc. Microformats uses attributes of tags (like class names) to help computers understand what the content of a page is instead of the actual tags.

I recently dove into microformats with my resume, located on my portfolio site. You can tag different sections of a resume with specific tags to show scripts that they've found a resume and help them parse out specific information about the resume. There really isn't anything too fancy about the resume specification (you can read the draft here) - all you need to do is add specific classes to a few of the tags.

You start off by wrapping the entire resume with a class of 'resume' - probably easiest to this as a div. The objective/summary text should be wrapped in a 'summary' class. It's a good idea to add more information for human readers as well, as they won't see these class names. At this point you might have something like this...

  1. <h2>My Resume</h2>

  2. <div class="resume">

  3. <h3>Objective</h3>

  4. <p class="summary">/* add in a summary here */</p>

  5. </div>

Like I mentioned before, it's a good idea to add extra headers/descriptions for human readers. The microformat specification doesn't care about the h2 and h3 tags, but it will help a person read through your resume.

Work experience gets a little complicated. Since the information here is date-dependent the resume specification depends on another microformat, vCalendar. There is three main fields I focused on - title, date duration, and description. The title includes the position title, company, location, and your contact information. Date duration and description are relatively simple in comparison - start and end date and a short description. Here's a summary from from my work experience (each separate job would have its own 'experience vevent vcard' div)...

  1. <div class="vcalendar">

  2. <div class="experience vevent vcard">

  3. <div class="htitle">

  4. <a href="#jacob-contact" class="include" title="Jacob Emerick"></a>

  5. <span class="title">/* the job position here */</span>

  6. <span class="org">/* the company name here */</span>

  7. <span class="location">/* where the company was located */</span>

  8. </div>

  9. <div class="date_duration">

  10. <abbr class="dtstart" title="/* YYYY-MM-DD of the start date */">/* human-friendly version of the start date */</abbr> -

  11. <abbr class="dtend" title="/* YYYY-MM-DD of the end date */">/* human-friendly version of the end date */</abbr>

  12. </div>

  13. <div class="description">/* job description here */</div>

  14. </div>

  15. </div>

There are a few odd things contained in this. Technically you should include your full contact information with each work experience, or a vCard (another microformat specification). To avoid repeating the same information for each position I linked to a single vCard div (with an id of jacob-contact) located further down the DOM for each job position. The other odd thing is the abbr tag, which helps computer scripts understand dates. I can customized the human-friendly date to be January 1, New Year's Day, or 'the first of the year', all of which may be hard for a script to understand. The abbr tag wraps this value and passes in a consistent format, 2010-01-01, which is very easy to parse out.

Now that I mentioned the vCard format it makes sense to explain it. More complicated and used than the resume format, the vCard specification (you can read the draft here) has a lot of customization options available. I kept my vCard simple, with only my name and some basic contact information.

  1. <div class="contact vcard">

  2. <div class="fn n" id="jacob-contact">

  3. <span class="given-name">Jacob</span>

  4. <span class="family-name">Emerick</span>

  5. </div>

  6. <div class="adr">

  7. <div>

  8. <span class="street-address">W5913 Geranium Drive</span>

  9. </div>

  10. <div>

  11. <span class="locality">Appleton</span>, <span class="region">WI</span> <span class="postal-code">54915</span>

  12. </div>

  13. </div>

  14. <div>Email: <a class="email" href="mailto:jpemeric@gmail.com">jpemeric@gmail.com</a></div>

  15. <div>Site: <a class="url" href="https://home.jacobemerick.com/">https://home.jacobemerick.com/</a></div>

  16. </div>

The last three pieces of my resume are achievements, skills, and education experience. Achievements and skills are simple lists with some rel attributes, and the education listing uses the vCalendar descriptions. Here is a complete barebones resume...

  1. <div class="resume">

  2. <div>

  3. <h3>Objective</h3>

  4. <div class="summary">

  5. <p>/* add in a summary here */</p>

  6. </div>

  7. </div>

  8. <div>

  9. <h3>Work Experience</h3>

  10. <div class="vcalendar">

  11. <div class="experience vevent vcard">

  12. <div class="htitle">

  13. <a href="#jacob-contact" class="include" title="Jacob Emerick"></a>

  14. <span class="title">/* the job position here */</span>

  15. <span class="org">/* the company name here */</span>

  16. <span class="location">/* where the company was located */</span>

  17. </div>

  18. <div class="date_duration">

  19. <abbr class="dtstart" title="/* YYYY-MM-DD of the start date */">/* human-friendly version of the start date */</abbr> -

  20. <abbr class="dtend" title="/* YYYY-MM-DD of the end date */">/* human-friendly version of the end date */</abbr>

  21. </div>

  22. <div class="description">/* job description here */</div>

  23. </div>

  24. <? endforeach ?>

  25. </div>

  26. </div>

  27. <div>

  28. <h3>Skills</h3>

  29. <div class="tags">

  30. <ul>

  31. <li class="skill" rel="tag">/* some skill here */</li>

  32. <li class="skill" rel="tag">/* another skill here */</li>

  33. </ul>

  34. </div>

  35. </div>

  36. <div>

  37. <h3>Achievements</h3>

  38. <div class="achievements">

  39. <ul>

  40. <li class="achievement">/* some achievement here */</li>

  41. <li class="achievement">/* another achievement here */</li>

  42. </ul>

  43. </div>

  44. </div>

  45. <div>

  46. <h3>Education</h3>

  47. <div class="vcalendar">

  48. <div class="education vevent vcard">

  49. <div class="htitle">

  50. <span class="summary">/* summary of education here (degree, etc)</span>

  51. <span class="org">/* university/college */</span>

  52. </div>

  53. <div class="date_duration">

  54. <abbr class="dtstart" title="/* YYYY-MM-DD of the start date */">/* human-friendly version of the start date */</abbr> -

  55. <abbr class="dtend" title="/* YYYY-MM-DD of the end date */">/* human-friendly version of the end date */</abbr>

  56. </div>

  57. </div>

  58. </div>

  59. </div>

  60. <div>

  61. <h3>Contact</h3>

  62. <div class="contact vcard">

  63. <div class="fn n" id="jacob-contact">

  64. <span class="given-name">Jacob</span>

  65. <span class="family-name">Emerick</span>

  66. </div>

  67. <div class="adr">

  68. <div>

  69. <span class="street-address">W5913 Geranium Drive</span>

  70. </div>

  71. <div>

  72. <span class="locality">Appleton</span>, <span class="region">WI</span> <span class="postal-code">54915</span>

  73. </div>

  74. </div>

  75. <div>Email: <a class="email" href="mailto:jpemeric@gmail.com">jpemeric@gmail.com</a></div>

  76. <div>Site: <a class="url" href="https://home.jacobemerick.com/">https://home.jacobemerick.com/</a></div>

  77. </div>

  78. </div>

  79. </div>

And that's a microformat version of my resume! A computer script will be able to easly read, understand, and parse this information as it crawls through my pages. There are already some major sites who have started to adopt this standard, including LinkedIn and Xing, and now you can use it on your site as well.