Pour Ben Hoyt, écrire un programme ou un algorithme qui compte les fréquences des mots à partir de l'entrée standard, puis les affiche avec leur fréquence, en commençant par les plus fréquents est une bonne question pour un candidat à un poste de programmeur lors d’un entretien d’embauche. Pour lui, contrairement aux questions sur les arbres binaires par exemple, un aspirant au poste de programmeur pourrait être appelé à écrire des scripts de ce type dans la vie réelle et cela permettra d’évaluer sa compréhension des notions d’entrée/sortie de fichiers, des tables de hachage, et l’utilisation de la fonction de tri.
« Une fois que le candidat a une solution de base, vous pouvez l’orienter dans toutes sortes de directions : qu'en est-il des majuscules ? De la ponctuation ? Comment ordonne-t-il deux mots ayant la même fréquence ? Quel est le goulot d'étranglement en termes de performances ? Comment se comporte-t-il en termes de big-O ? Quelle est l'utilisation de la mémoire ? En gros, combien de temps votre programme prendrait-il pour traiter un fichier de 1 Go ? Votre solution fonctionnerait-elle encore pour 1 To ? etc. Vous pouvez aussi vous orienter vers le "génie logiciel" et parler de la gestion des erreurs, de la testabilité, de la transformation en un utilitaire de ligne de commande renforcé », a déclaré Ben Hoyt.
Une solution de base lit le fichier ligne par ligne, le convertit en minuscules, divise chaque ligne en mots et compte les fréquences dans une table de hachage. Une fois cette opération terminée, elle convertit la table de hachage en une liste de paires mot/compte, effectue un tri par compte (le plus grand en premier) et affiche. Pour la petite histoire, raconté par Ben, en 1986, Jon Bentley a demandé à Donald Knuth d'apporter une solution à ce problème, et il a produit un chef-d'œuvre Knuthien exquis de dix pages. Doug McIlroy (l'inventeur des pipelines Unix) lui a répondu par une version en une ligne du shell Unix utilisant tr, sort et uniq.
« Je décris un problème d'interview simple (compter les fréquences de mots uniques), je le résous dans différents langages, et je compare les performances entre elles. Pour chaque langage, j'ai inclus une solution simple et idiomatique ainsi qu'une approche plus optimisée via le profilage », a indiqué Ben Hoyt sur son blog.
Énoncé du problème et contraintes
Écrire en langage Python, Go, C++, C, AWK, Forth et Rust un programme qui compte les fréquences des mots. Chaque programme doit lire l'entrée standard et imprimer les fréquences de mots uniques, séparés par des espaces, dans l'ordre des plus fréquents au moins fréquent. Par exemple, avec cette entrée :
The foo the foo the
defenestration the
Le programme doit afficher ce qui suit :
the 4
foo 2
defenestration 1
Pour avoir des solutions simples et cohérentes, voici, ci-dessous, la liste de contraintes à prendre en compte :
- threading : il doit s'exécuter dans un seul thread sur une seule machine ;
- mots : tout ce qui est séparé par un espace, la ponctuation étant ignorée ;
- Stdlib : utiliser uniquement les fonctions de la bibliothèque standard du langage ;
- hachage : ne pas rouler notre propre table de hachage (à l'exception de la version C optimisée) ;
- ordre : si la fréquence de deux mots est la même, leur ordre dans le résultat n'a pas d'importance ;
- ASCII : il n'y a pas de problème à ne supporter que l'ASCII pour la gestion des espaces et des minuscules ;
- fiable : même pour les variantes optimisées, ne pas utiliser des fonctionnalités de langage non fiables, et ne pas descendre en assembleur ;
- la casse : le programme doit normaliser les mots en minuscules, donc "The the THE" doit apparaître comme "the 3" dans la sortie ;
- texte : suppose que le fichier d'entrée est du texte dans une langue réelle et non un texte plein de mots uniques et aléatoires, avec des lignes de longueur "raisonnable". Plus courtes que la taille du tampon ;
- mémoire : la mise en mémoire tampon ligne par ligne est acceptable, ou par morceaux avec une taille maximale de 64 KB. Ceci dit, il n'y a pas de problème à garder l'ensemble de la carte du nombre de mots en mémoire.
Le fichier d'entrée utilisé par Ben est un extrait de texte de King James Bible, concaténé dix fois. Les guillemets intelligents ont été remplacés par le caractère guillemet ASCII et l’utilitaire cat a été utilisé pour le multiplier par dix afin d'obtenir le fichier d'entrée de référence de 43 Mo.
Résultats des performances et enseignements
Ben a indiqué avoir exécuté chaque test cinq fois et a pris à chaque fois le temps minimum comme résultat. Les résultats présentés sur l’image ci-dessous prennent en compte la contribution apportée par les lecteurs. Les temps d’exécution sont en secondes, donc plus ils sont bas, mieux c'est, et la liste est ordonnée par le temps d'exécution de la version simple, la plus rapide en premier.
Au terme de l’expérience, Ben Hoyt est arrivé à la conclusion selon laquelle, les langages Python et AWK sont juste recommandables pour leur rapidité, Go et Rust sont recommandable pour les développeurs qui désirent avoir des solutions rapides et fiables. Cependant, en mars de l’année dernière, une étude réalisée par des chercheurs portugais a révélé que le langage C se positionne comme le langage de programmation le plus performant en termes de temps d’exécution et de faible consommation d’énergie (du CPU et de la RAM).
Source : BEN HOYT
Et vous ?
Que pensez-vous des conclusions de Ben Hoyt ? Pertinentes ou pas ?
Quel langage de programmation appréciez-vous ? Pourquoi ?
Si vous deviez changer pour un autre langage, lequel utiliseriez-vous ? Pourquoi ?
Que pensez-vous de l'exercice proposé par Ben Hoyt pour un entretien d'embauche ?
Quel est votre avis sur les performances des différents langages de programmation évalués ?
Voir aussi :
Recrutement IT : il crée un faux langage de programmation afin d'éliminer les candidats qui mentent sur leur CV, et cela a bien fonctionné
Le langage C ne sera-t-il jamais battu en termes de rapidité d'exécution et de faible consommation d'énergie ? Voici les résultats d'une étude sur 27 langages de programmation les plus populaires
Quels sont les meilleurs langages de programmation pour développer une application mobile ? Petit tour d'horizon sur les plus populaires
Le langage C ne sera-t-il jamais battu en termes de rapidité d'exécution et de faible consommation d'énergie ? Voici les résultats d'une étude sur 27 langages de programmation les plus populaires