busbud/coding-challenge-backend-c — pull request #1 by OlivierRiberi (2014-04-30 15:01:32+00:00)
Title: Coding challenge by Olivier

Bonjour,

Vous pouvez voir l'API à l'adresse suivante : http://busbud-coding-challenge.herokuapp.com
Et tous les points importants du code sont commentés.

Voici comment j'ai procédé:

Tout d'abord, j'ai installé Express pour pouvoir gérer simplement les deux routes de l'API (/suggestions et une route de fallback) ainsi de les trois paramètres GET (q, latitude et longitude).

La première étape consiste à récupérer les informations contenus dans le fichier TSV. Pour cela, j'ai suivi le lien du ReadMe qui m'a indiqué comment faire un stream en utilisant event-stream pour parser les données. Je reçois alors un tableau pour chaque ville, qu'il me suffit de convertir en objet (plus facile à manipuler) avec uniquement les informations importantes.

Une fois le tableau d'objet récupéré, la deuxième étape consiste à faire la sélection des villes concernées par la requête. Pour cela, je regarde si le nom de la ville (ou le nom alternatif de la ville) contient le nom envoyé dans la requête, et si la population est bien supérieure à 5000.

Toutes les informations sont là à l'exception du score. Donc la quatrième étape consiste à calculer le score pour chacune des ville. Pour cela, je suis parti d'un score à 1.00, sur lequel j'ai soustrait proportionnellement des valeurs qui représentent les différences entre la requête et les informations exactes de la ville.
Par exemple, pour le nom de la ville, je soustrais au score, 0.05 * le nombre de caractères qui différencie le nom dans la requête et le nom exacte de la ville (ou son nom alternatif).
Pour la longitude et la latitude, j'ai fait la différence des coordonnées, que j'ai divisé par 50, pour le soustraire au score.
Le 0.05 et 50 sont des valeurs arbitraires qu'il est possible de changer si l'échelle des scores ne convient pas.

Voilà, toutes les informations ont été récupérées/calculées, il suffit ensuite de supprimer certaines informations devenues inutiles telles que les nom alternatifs de la ville, la population... Et ne pas oublier de classer les villes sélectionnées dans l'ordre décroissant du score, avant d'envoyer au client le tableau des villes dans un objet en JSON.

Le seul point que je n'ai pas fait c'est cela :
"Mitigations to handle high levels of traffic should be implemented"
En effet, je ne sais pas vraiment à quoi cela fait référence.
Dans le cas où cette API serait très utilisée, il serait bien plus performant d'éviter de passer par un fichier TSV, mais plutôt par une base de données (Ça éviterait de parcourir toutes les données à chaque fois.). Mais cela soulève d'autres questions :
Comment le fichier TSV a été récupéré ? Est-ce qu'il est souvent mis à jour ? Est-ce qu'il est possible de le récupérer automatiquement et de le faire passer par un script d'import vers la base de données ? etc etc..

Voilà. Bonne journée !
Olivier