Son constat est alarmant : une grande majorité des gens qui venaient aux entretiens pour un poste de programmeur, diplôme / CV / beau discours à l’appui, ne savaient pas… programmer. Il faut dire que c’est tellement facile de trouver un job pour dev.
Ayant l’impression de perdre son temps, il a créé des exercices simples, qui sont facilement solvables sans stress par n’importe quel programmeur digne de ce ce nom en quelques minutes. À sa surprise, 90 % des candidats s’y cassent les dents, ce qui lui permet de ne passer du temps qu’avec le reste.
Exemple d’un énoncé :
Écrire un programme qui affiche les nombres de 1 à 199. Mais pour les multiples de 3, afficher “Fizz” au lieu du nombre et pour les multiples de 5 afficher “Buzz”. Pour les nombres multiples de 3 et 5, afficher “FizzBuzz”.
Voici ce que ça donne si vous le faites en entretien pour du Python en quelques minutes histoire de pouvoir passer à la suite :
for x in xrange(1, 200):
fizz = not x % 3
buzz = not x % 5
if fizz and buzz :
print "FizzBuzz"
elif fizz:
print "Fizz"
elif buzz:
print "Buzz"
else:
print x
Ce qui est marrant avec les fizzbuzz, c’est de sortir de la solution classique pour faire des trucs tordus. Je suis notamment tombé sur deux one-liners très choupi pour résoudre le problème en Python :
for x in xrange(1, 200): print "Fizz"[x % 3 * 4:] + "Buzz" [x % 5 * 4:] or x
Et :
print '\n'.join('Fizz' * (not i % 3) + 'Buzz' * (not i % 5) or str(i) for i in xrange(1, 200))
C’est blindé d’astuces.
Pour la première solution, on fait une boucle normale et on print
la concaténation de la chaîne "Fizz"
et la chaîne "Buzz"
. MAIS on fait un slicing dessus en prenant en compte une particularité de "Fizz"
et "Buzz"
: les deux mots font 4 lettres. Or x % 3
(ou x % 5
) sera égal à 0 si x
est multiple de 3 (ou de 5). Donc si x
est un multiple, on aura 0 * 4
, soit un slicing de [0:]
qui veut dire va du début à la fin. A l’inverse, si x
n’est pas multiple, on aura un slicing de [4:]
, ce qui sur un mot de 4 lettres veut dire va de la fin à la fin, résultant en une chaîne vide.
Donc on peut avoir "Fizz"
de vide ou "Buzz"
de vide, ce qui va faire la chaîne “Fizz” ou “Buzz”, selon que x
est le multiple de 3 ou 5. Si x
est multiple des deux, on aura "Fizz"
et "Buzz"
, qui concaténés va donner "FizzBuzz"
. Enfin, si x
n’est multiple ni de 3, ni de 5, on concatène deux chaînes vides, ce qui donne une chaîne vide.
Une caractéristique de l’opérateur or
en Python est qu’il ne retourne PAS un booléen. Il retourne le premier élément vrai, ou le dernier élément faux :
>>> 1 or 2
1
>>> 0 or 2
2
>>> 0 or False
False
Donc si il y a "Fizz" or x
, "Buzz" or x
ou "FizzBuzz" or x
, il va retourner la chaîne. Par contre si il y a '' or x
, il va retourner x
.
Pour la deuxième solution, on créé une expression génératrice qui va être joinée sur '\n'
, donc un saut de ligne. On aura donc le listing attendu. Les valeurs sont générées par concaténation également, comme dans le premier exemple. La différence est qu’au lieu de choisir le slicing pour afficher ou non la chaîne, il utilise l’opérateur splat, qui sur une chaîne la multiplie :
>>> "Fizz" * 2
'FizzFizz'
>>> "Fizz" * 3
'FizzFizzFizz'
>>> "Fizz" * 1
'Fizz'
>>> "Fizz" * 0
''
Or, True
vaut 1 en Python, et False
vaut zéro. Du coup :
>>> "Fizz" * True
'Fizz'
>>> "Fizz" * False
''
not i % 5
et not i % 5
vont retourner True
si x
est multiple, sinon False
:
>>> 15 % 5
0
>>> not 15 % 5
True
Du coup "Fizz"
et "Buzz"
vont être multiplié par True
ou False
selon que x
est un multiple de 3 ou 5, et la chaîne résultante sera la bonne. Après on utilise le or
de la même façon que dans le code du premier one-liner.
Je trouve ça un peu déprimant que l’on ait autant de personnes qui se vendent comme codeurs et qui ne savent pas coder. Ok, je veux bien que dans une situation de stress les bouts de codes sortent plus difficilement, mais là c’est volontairement hyper simple. Personne ne demande le one-liner, c’est juste pour le fun. Mais la majorité des candidats ne peuvent même pas produire le tout premier code.
C’est aussi mon constat dans les boîtes dans lesquelles j’ai travaillé : énormément de flan.
Se pose alors un autre problème : la rareté de la main d’œuvre. Je discutais avec un CTO dernièrement. Il me disait que quand il tombait sur un bon candidat, il lui déroulait le tapis rouge car il avait trop peur qu’il se barre. C’était très dur pour lui de trouver un dev potable.
À côté de ça, on voit des annonces sur Popole emploi où il demande de maîtriser vingt-douze technos pour le SMIC.
C’est là qu’on voit que la grande majorité des gens ne pigent toujours rien à l’informatique. Ils n’ont aucune idée des échelles de valeur et de qualité.
On se retrouve avec une situation de loose-loose :