Mon CV en TOML

cv.toml

J’ai décidé de rédiger mon nouveau CV en TOML.

Il s’agissait au début d’une blague, mais après réflexion j’ai voulu tester et rédiger sérieusement mon nouveau CV en TOML, en essayant d’utiliser au mieux ce que le langage propose sémantiquement et syntaxiquement. Le langage TOML se prévaut d’être un langage aussi bien facile à écrire qu’à lire pour l’humain, en plus de l’être pour la machine. Naturellement, il faut donc que ce CV soit distribuable et lisible par les humains tel quel, c’est à dire en TOML brut.

Écrire un cv.toml

Comme n’importe quel document, ce CV a un titre. Et comme n’importe quel CV, on va commencer par se présenter avec diverses métadonnées jugées pertinentes selon le profil.

title = "Sgble's Curriculum Vitae "
lang = "en"

[me]
name = "Sgble"
location = "Paris, FR"
about = "I don't know what to say, I'm shy!"
email = "sgble@example.com"
github = "@sgble-example"

Poursuivons avec l’expérience professionnelle. Voici la structure que j’ai choisie, elle reprend les attributs classiques que l’on retrouve dans un CV. Pour les dates de début et de fin, start et end, on utilise le type natif de date de TOML.

# Work Experience

[[jobs]]
title = "Benevolent Chairman for Life"
company = "Sgble Corp"
type = "self-employed"
start = 2012-02-01
location = "Paris, FR"
desc = "I founded Sgble Corp to solve great challenges for the next decades!"
tech = ["Office 360", "Rolodex", "MyOpenConciergerie"]


[[jobs]]
title = "Software Analyst & Architect (not Developer)"
company = "Yet Another Tech Company"
type = "full-time"
start = 2010-07-03
end = 2012-02-01
location = "Paris, FR"
desc = "Helped write code for the flagship product."
tech = ["Python", "Go", "Kubernetes", "Redis", "PostgreSQL"]

[[jobs]]
# ...
# ...

J’ai bien de la chance, peu de mes expériences sont dignes qu’on leur accorde plus de quelques mots dans le champ desc (description), faisant ainsi tenir leur description sur une ligne sous 80–100 caractères. Mais autrement, TOML aurait su gérer la situation avec des chaînes de caractères sur plusieurs lignes, ainsi que les tableaux sur plusieurs lignes, ce qui facilite la lisibilité humaine.

Exemple (fictif) d’une de mes expériences dans une autre vie :

[[jobs]]
title = "Conducteur de trains Maglev très haute vitesse"
company = "Société Nationale des LM de France"
type = "full-time"
start = 2038-02-01
end = 2042-08-01
location = "France & UE"
desc = """
  Conduite des eurotrains modèles MG-1 et MG-2/MG-2X (2500 pax) en France et
  en Europe. Conduite des vieux TGV M sur rails acier (polyvalence).
  
  Suivi et respect de la signalisation en cabine et sur voie (rigueur).
  
  Contribution à la propreté de la cabine avec la mise en place de corbeilles
  à papiers (force de proposition).
  
  Aide et accueil des passagers qui arrivaient en cabine pensant y trouver leur
  place (soft skills humains).
"""
tech = [
  "TVM 700",
  "ETCS Level 6",
  "Ubuntu for Rails",
  "ERTMS-NG",
]

Cela montre le principe général. Pour chaque type d’entrée, on a des champs à renseigner et le CV consiste surtout en une table de listes énumérant d’autres tables d’un même « type ». Voici des exemples de ce que l’on pourrait avoir comme autres types d’objets, ils parleront sûrement d’eux-mêmes.

# Spoken languages

[[spoken-languages]]
lang = "fr_FR"
level = "Native"

[[spoken-languages]]
lang = "en_US"
level = "Somewhat okay"

[[spoken-languages]]
lang = "fr_BE"
level = "Elementary"

# Skills

[[skills.tech]]
skill = "Python"
level = "Advanced"

[[skills.tech]]
skill = "Go"
level = "Intermediate"

[[skills.other]]
skill = "Accounting"
level = "Intermediate"

[[skills.other]]
skill = "Project Management"
level = "Advanced"

C’est assez confortable de pouvoir imbriquer « à plat » certaines catégories, ici skills.tech et skills.other.

Le document final paraît assez « plat », ce qui le rend agréable à lire humainement, mais en contrepartie cela laisse peu ressortir la structure sous-jacente. Le voici dans son intégralité, suivi du JSON équivalent pour mieux se faire une idée de la structure.

title = "Sgble's Curriculum Vitae "
lang = "en"

[me]
name = "Sgble"
location = "Paris, FR"
about = "I don't know what to say, I'm shy!"
email = "sgble@example.com"
github = "@sgble-example"

# Work Experience

[[jobs]]
title = "Benevolent Chairman for Life"
company = "Sgble Corp"
type = "self-employed"
start = 2012-02-01
location = "Paris, FR"
desc = "I founded Sgble Corp to solve great challenges for the next decades!"
tech = ["Office 360", "Rolodex", "MyOpenConciergerie"]


[[jobs]]
title = "Software Analyst & Architect (not Developer)"
company = "Yet Another Tech Company"
type = "full-time"
start = 2010-07-03
end = 2012-02-01
location = "Paris, FR"
desc = "Helped write code for the flagship product."
tech = ["Python", "Go", "Kubernetes", "Redis", "PostgreSQL"]

# Tech skills

[[skills.tech]]
skill = "Python"
level = "Advanced"

[[skills.tech]]
skill = "Go"
level = "Intermediate"

# Other skills

[[skills.other]]
skill = "Accounting"
level = "Intermediate"

[[skills.other]]
skill = "Project Management"
level = "Advanced"

# Spoken languages

[[spoken-languages]]
lang = "fr_FR"
level = "Native"

[[spoken-languages]]
lang = "en_US"
level = "Somewhat okay"

[[spoken-languages]]
lang = "fr_BE"
level = "Elementary"

Équivalent en JSON :

{
  "title": "Sgble's Curriculum Vitae ",
  "lang": "en",
  "me": {
    "name": "Sgble",
    "location": "Paris, FR",
    "about": "I don't know what to say, I'm shy!",
    "email": "sgble@example.com",
    "github": "@sgble-example"
  },
  "jobs": [
    {
      "title": "Benevolent Chairman for Life",
      "company": "Sgble Corp",
      "type": "self-employed",
      "start": "2012-02-01",
      "location": "Paris, FR",
      "desc": "I founded Sgble Corp to solve great challenges for the next decades!",
      "tech": [
        "Office 360",
        "Rolodex",
        "MyOpenConciergerie"
      ]
    },
    {
      "title": "Software Analyst & Architect (not Developer)",
      "company": "Yet Another Tech Company",
      "type": "full-time",
      "start": "2010-07-03",
      "end": "2012-02-01",
      "location": "Paris, FR",
      "desc": "Helped write code for the flagship product.",
      "tech": [
        "Python",
        "Go",
        "Kubernetes",
        "Redis",
        "PostgreSQL"
      ]
    }
  ],
  "skills": {
    "tech": [
      {
        "skill": "Python",
        "level": "Advanced"
      },
      {
        "skill": "Go",
        "level": "Intermediate"
      }
    ],
    "other": [
      {
        "skill": "Accounting",
        "level": "Intermediate"
      },
      {
        "skill": "Project Management",
        "level": "Advanced"
      }
    ]
  },
  "spoken-languages": [
    {
      "lang": "fr_FR",
      "level": "Native"
    },
    {
      "lang": "en_US",
      "level": "Somewhat okay"
    },
    {
      "lang": "fr_BE",
      "level": "Elementary"
    }
  ]
}

Conclusion

Personnellement j’aime bien mon CV en TOML. Mais il faut quand même admettre qu’un bon thème de coloration syntaxique ne sera pas un luxe pour en faciliter la lecture. Reconnaissons aussi que les commentaires — que TOML a le bon goût d’autoriser — contribuent aussi à la lisibilité en séparant les sections.

Le rédiger ne m’a posé aucun problème. Certes, la structure est triviale, mais en YAML — qui aurait pu peut-être être aussi lisible — j’aurais été capable de mettre la mauvaise indentation quelque part, cassant ainsi la cohérence du document. Quant à JSON ou XML, je n’aurais pas fait un document valide du premier coup.

Pour ce qui est de la lisibilité, je vous laisse en qualité de juges. Cependant, je vous invite à utiliser votre éditeur de texte favori pour juger, car le thème TOML de ZdS n’est peut-être pas celui qui le rendra le mieux.

Le saviez-vous ? La nouvelle version de Python 3.11 inclut tomllib dans sa bibliothèque standard, vous permettant ainsi de traiter des CV structurés en TOML automatiquement. Plus d’informations dans l’article d’entwanne.



22 commentaires

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte