Matin : café, code et changements de contexte
L'horloge affiche 9h15. Vous ouvrez votre ordinateur portable, avalez votre première tasse de café et regardez Slack. 23 messages non lus, trois notifications d'échec de build et une de votre chef d'équipe avec un laconique : « Regarde la revue de code, ton bug est en production ». Bonjour, développeur C++. Votre journée ne commence pas par une réunion, mais par un dump mémoire et la lecture d'une stack trace.
Une journée de travail typique d'un développeur C++ est un équilibre constant entre l'écriture de nouveau code, le débogage de code legacy et la communication. Contrairement à Java ou Python, où « ça marche tout simplement » est un peu plus fréquent, en C++, chaque ligne peut vous exploser à la figure six mois plus tard. C'est pourquoi le matin est le moment de régler les problèmes de la veille.
Première action : vérification du CI/CD
Vous ouvrez Jenkins (ou GitLab CI) — le build a échoué. Le linter est passé, mais le compilateur GCC 13 a affiché une erreur cryptique. Quel est le problème ? Regardons :
// Exemple : quelqu'un a oublié la sémantique de déplacementstd::vector<std::string> getNames() { std::vector<std::string> names = {"Alice", "Bob"}; return names; // NRVO fonctionnera, mais pas toujours}
// Et voici ce qu'il ne faut pas faire :std::vector<std::string> getNamesBad() { std::vector<std::string> names; names.push_back("Charlie"); return std::move(names); // Empêche NRVO !}Vous trouvez et corrigez. Vous pushez le correctif. CI est vert. On peut vivre. Mais ce n'est que le début.
Réunion quotidienne : pourquoi le développeur C++ dit « c'est plus compliqué qu'il n'y paraît » ?
À 10h00 — daily standup. Chacun raconte ce qu'il a fait hier. Vous dites : « J'ai refactoré le module de traitement d'images, réécrit les pointeurs bruts en pointeurs intelligents ». Un junior demande : « Pourquoi ? Ça marchait ». Vous soupirez et expliquez que les pointeurs bruts en C++ moderne, c'est comme marcher dans un champ de mines sans carte. Le chef d'équipe hoche la tête. Le junior note dans son carnet : « Étudier RAII ».
Lors de cette réunion, d'ailleurs, une tâche intéressante pour un développeur C++ émerge : réécrire un ancien module avec void* en un std::variant type-safe. C'est une routine typique — lutter contre l'héritage du style C dans un projet C++.
Travail principal : code, bugs et magie des templates
Après la réunion, vous vous plongez dans la tâche principale. Aujourd'hui, c'est l'implémentation d'un nouvel algorithme pour l'analyse de fichiers de configuration. Exigence : des performances supérieures à JSON et un typage strict. Vous décidez d'utiliser std::optional et std::expected (de C++23, mais disponible via Boost pour l'instant).
Écrire le code : analyse sécurisée
Vous créez une fonction qui retourne std::optional<Config>. Si l'analyse échoue, vous retournez std::nullopt. Pas d'exceptions, pas de nullptr, pas de comportement indéfini.
#include <optional>#include <string>#include <fstream>
struct Config { int port; std::string host; bool debug;};
std::optional<Config> parseConfig(const std::string& path) { std::ifstream file(path); if (!file.is_open()) { return std::nullopt; } Config cfg; file >> cfg.port >> cfg.host >> cfg.debug; if (file.fail()) { return std::nullopt; } return cfg;}
// Utilisation :auto config = parseConfig("app.cfg");if (config) { std::cout << "Port: " << config->port << "";} else { std::cerr << "Échec de l'analyse du fichier de configuration";}Vous vérifiez le code pour les fuites mémoire (valgrind), la vitesse (perf) et l'exactitude (asan). Tout est propre. Vous commitez. Mais il ne faut pas se réjouir trop tôt — dans une heure, un message de l'assurance qualité avec un rapport de bug arrivera.
Déjeuner et discussions sur Rust
À 13h00 — déjeuner. À la cantine, les collègues discutent des actualités : quelqu'un code en Rust, quelqu'un passe au C++20. Vous intervenez : « Et moi, hier, j'ai enfin compris std::jthread et les jetons d'annulation ». Personne ne comprend