đŻ 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 :
| # | Sujet | Temps attendu | Temps réel | Verdict |
|---|---|---|---|---|
| 1 | Bug fix + TDD | 5â10 min | ~20 min | đĄ trop long |
| 2 | Bug de mutation | ~2 min | 5â10 min | đ trop lent |
| 3 | Concurrence | NC | ~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 :
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.mdet 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.
