🎯 Contexte

Aujourd’hui, j’ai passĂ© un entretien technique.

Cela faisait trois ans que je n’en avais pas passĂ©, et encore moins en Go. Autant dire que j’étais un peu rouillĂ© sur l’exercice en lui-mĂȘme : coder devant quelqu’un, en Ă©tant observĂ©, ce n’est jamais tout Ă  fait comme coder seul.

Petit retour d’expĂ©rience, Ă  chaud, sur ce qui s’est bien passĂ©, ce qui s’est moins bien passĂ©, et ce que j’en retiens.

Vue d’ensemble des 3 exercices :

#SujetTemps attenduTemps réelVerdict
1Bug fix + TDD5–10 min~20 min🟡 trop long
2Bug de mutation~2 min5–10 min🟠 trop lent
3ConcurrenceNC~25–30 min🔮 le plus laborieux

đŸ€ Le dĂ©roulement

Premier point positif : l’ambiance.

L’entretien s’est dĂ©roulĂ© dans la bienveillance, et je pense qu’ils ont vite senti que je n’étais pas totalement Ă  l’aise avec l’exercice.

Je suis quelqu’un qui a besoin de prendre son temps pour bien comprendre un problĂšme, et en particulier pour comprendre l’énoncĂ© d’un exercice de programmation, que je ne trouve pas toujours trĂšs explicite.

Ça s’est d’ailleurs vu : mĂȘme aprĂšs avoir rĂ©ussi Ă  installer les projets (avec une petite frayeur sur leur projet Go qui ne voulait pas s’importer correctement dans GoLand), il m’a fallu un moment pour vraiment dĂ©marrer.


🐛 Exercice 1 — un bug fix, et un vrai rappel sur le TDD

Sur ce premier exercice, un des interlocuteurs m’a arrĂȘtĂ© net quand il m’a vu modifier le test.
Et il avait totalement raison. Le but n’était pas de faire Ă©voluer un comportement pour une nouvelle fonctionnalitĂ©, mais de corriger un bug : le test Ă©tait volontairement rĂ©digĂ© pour faire Ă©chouer le programme. C’est donc le code de prod qu’il fallait corriger, pas le test.

En clair : l’étape « red » du TDD Ă©tait dĂ©jĂ  faite. Il ne restait que le reste du cycle :

🔮 Red — le test Ă©choue → 🟱 Green — le faire passer → đŸ”” Refactor

Une Ă©vidence sur le papier, beaucoup moins Ă©vidente sous le stress d’un entretien, il m’a fallu une bonne dizaine de minutes pour vraiment comprendre le sujet.

Une fois le dĂ©clic fait, j’ai itĂ©rĂ© assez vite, mais l’exercice m’a quand mĂȘme pris une vingtaine de minutes au total, bien trop long pour ce qu’il demandait (je pense qu’il aurait dĂ» me prendre 5 Ă  10 minutes).

En appliquant mes rĂ©flexes TDD, que j’ai beaucoup pratiquĂ©s par le passĂ©, j’ai dĂ©couvert au passage un petit bug dans l’ordonnancement de leurs tests. L’occasion d’échanger sur nos maniĂšres de tester : j’ai l’habitude du table testing, ou de tests avec une ou deux assertions pour la partie erreur en Go, alors que mes interlocuteurs avaient plutĂŽt l’habitude de faire Ă©voluer un mĂȘme test avec plusieurs assertions pour couvrir davantage de cas. IntĂ©ressant de voir la diffĂ©rence d’habitudes selon les Ă©quipes.

🔀 Le piùge du tri de slice

Le test suivant portait sur le tri d’un slice. Pas que je ne savais pas faire, avec l’autocomplĂ©tion actuelle, c’est mĂȘme plutĂŽt rapide, mais je me suis fait avoir sur quelque chose que je connais pourtant bien : un slice en Go pointe vers une structure sous-jacente, donc la modifier modifie l’état interne partagĂ©.

Morale : pensez Ă  cloner vos slices quand vous voulez prĂ©server leur Ă©tat d’origine.

🧼 Range indexĂ© vs range over, et une histoire d’allocation

Le dernier test de cet exercice, une recherche basique, s’est rĂ©glĂ© rapidement. Il a surtout donnĂ© lieu Ă  un Ă©change intĂ©ressant : je n’ai pas utilisĂ© de range classique mais un range indexĂ©, ce qui a un peu surpris un des interlocuteurs.

La raison : chez mon client actuel, une rÚgle de lint nous rappelle le fameux piÚge du « copy over range » en Go, et nous pousse à indexer nos slices pour limiter les allocations mémoire inutiles. Mon interlocuteur est resté perplexe sur ce point, une divergence de pratiques entre équipes, sans doute.

Sur ce mĂȘme sujet, j’ai laissĂ© passer une triple allocation en boucle qui aurait pu ĂȘtre faite une seule fois, alors que c’est justement le genre de chose Ă  laquelle je suis normalement sensible (allocation mĂ©moire, temps de rĂ©ponse).
LĂ -dessus, ils avaient parfaitement raison de le relever.


⚡ Exercice 2 — rapide, mais pas assez

Le deuxiĂšme exercice portait sur une situation de mutation, que j’ai identifiĂ©e assez vite. Ça m’a pris 5 Ă  10 minutes, alors que ça aurait dĂ» ĂȘtre quasi instantanĂ© (2 minutes grand maximum). Rien Ă  redire sur le fond, seulement sur le temps que j’ai mis.


🔄 Exercice 3 — concurrence, et un Ă©noncĂ© perfectible

Le troisiĂšme exercice, sans doute le plus long mais pas le pire, portait sur la concurrence en Go : channels et goroutines. Le test Ă©tait lui aussi buggĂ©, tout comme le code de prod, avec pour objectif de vĂ©rifier la maĂźtrise de ces sujets. Je trouve honnĂȘtement l’exercice mal posĂ©.

J’ai vite repĂ©rĂ© un premier problĂšme (un WaitGroup mal gĂ©rĂ©), mais j’ai eu davantage de mal Ă  trouver le bug principal, une dizaine, quinzaine de minutes de rĂ©flexion.

C’est en grande partie dĂ» au fait que je trouvais le code dĂ©jĂ  mal structurĂ© au dĂ©part.
À un moment, j’ai fini par verbaliser mon ressenti à l’interlocuteur en lui expliquant un truc bizarre que je trouvais qu’il faisait dans leur code :

faire transiter un message via une structure de comportement plutĂŽt qu’une structure de donnĂ©es.

👉C’était bel et bien le second problĂšme.

Vu que jusqu’à maintenant le code Ă©tait gĂ©nĂ©ral correct avec de petites modifications Ă  apporter, je ne me suis pas doutĂ© que je pouvais faire des gros changements.

Une fois qu’il m’a donnĂ© carte blanche pour tout dĂ©faire et refaire, j’ai corrigĂ© assez rapidement, jusqu’à buter sur un tout dernier point de blocage. Le problĂšme Ă©tait identifiĂ©, j’ai mis quelques minutes Ă  le rĂ©soudre, lĂ  aussi j’aurais dĂ» ĂȘtre bien plus rapide.


🧠 Bilan

J’ai ratĂ© cet entretien technique en beautĂ©, sur des trucs basiques.

Ce n’est pas grave, ça arrive, et ça m’a surtout permis de me rendre compte de quelque chose :

Ce que j'en retiens

  • 🔋 Mon cerveau tourne au ralenti en ce moment. Je suis dans une pĂ©riode de fatigue mentale importante et ce n'Ă©tait pas nĂ©cessairement le plus opportun de faire un entretien technique dans cette pĂ©riode.
  • đŸ•°ïž Prendre le temps. Il aurait fallu que je prenne toujours 10/15 minutes pour bien lire le README.md et prendre le temps de lire attentivement le code des tests plutĂŽt que de se prĂ©cipiter sur le code prod.
    On pense que c'est du temps de perdu alors que c'est tout l'inverse, c'est du temps de gagner en compréhension.

Me voilĂ  motivĂ© pour ne plus rater les prochains 🚀

DĂ©sormais retrouver le dĂ©tail de chaque exercice que je reprendrais Ă  tĂȘte reposĂ©e dans des articles dĂ©diĂ©s.