Supposons qu'on vous ait demandé dans une interview "Comment mettriez-vous en œuvre la recherche Google?" Comment répondriez-vous à une telle question? Il peut y avoir des ressources qui expliquent comment certaines pièces de Google sont implémentées (BigTable, MapReduce, PageRank, ...), mais cela ne correspond pas exactement à une interview.
Quelle architecture globale utiliseriez-vous et comment l'expliqueriez-vous en 15 à 30 minutes?
Je commencerais par expliquer comment construire un moteur de recherche qui gère environ 100 000 documents, puis étendre cela via un sharding à environ 50 millions de documents, puis peut-être un autre bond architectural/technique.
Ceci est la vue de 20 000 pieds. Ce que j'aimerais, ce sont les détails - comment vous répondriez à cela dans une interview. Quelles structures de données utiliseriez-vous? De quels services/machines se compose votre architecture. Quelle serait une latence de requête typique? Qu'en est-il des problèmes de basculement/split brain? Etc...
Le post sur Quora a donné le article original publié par Sergey Brin et Larry Page. Il semble être une excellente référence pour ce type de question.
Considérez le méta-point: que recherche l'intervieweur?
Une question gigantesque comme celle-ci ne cherche pas à vous faire perdre votre temps dans le moindre détail d'implémentation d'un algorithme de type PageRank ou comment faire une indexation distribuée. Au lieu de cela, concentrez-vous sur l'image complète de ce que cela prendrait. Il semble que vous connaissiez déjà tous les gros morceaux (BigTable, PageRank, Map/Reduce). La question est donc de savoir comment les relier entre eux?
Voici mon coup de couteau.
Phase 1: Indexation de l'infrastructure (passez 5 minutes à expliquer)
La première phase de la mise en œuvre de Google (ou de tout moteur de recherche) consiste à créer un indexeur. Il s'agit du logiciel qui explore le corpus de données et produit les résultats dans une structure de données plus efficace pour effectuer des lectures.
Pour implémenter cela, considérez deux parties: un robot et un indexeur.
Le travail du robot d'indexation Web consiste à créer des liens vers des pages Web d'araignée et à les vider dans un ensemble. L'étape la plus importante ici est d'éviter de se faire prendre dans une boucle infinie ou sur un contenu généré à l'infini. Placez chacun de ces liens dans un fichier texte massif (pour l'instant).
Deuxièmement, l'indexeur s'exécutera dans le cadre d'un travail Map/Reduce. (Mappez une fonction à chaque élément de l'entrée, puis réduisez les résultats en une seule "chose".) L'indexeur prendra un seul lien Web, récupérera le site Web et le convertira en fichier d'index. (Discuté ensuite.) L'étape de réduction consistera simplement à regrouper tous ces fichiers d'index en une seule unité. (Plutôt que des millions de fichiers volumineux.) Étant donné que les étapes d'indexation peuvent être effectuées en parallèle, vous pouvez gérer ce travail Map/Reduce dans un centre de données de taille arbitraire.
Phase 2: Spécificités des algorithmes d'indexation (passez 10 minutes à expliquer)
Une fois que vous avez indiqué comment vous allez traiter les pages Web, la partie suivante explique comment vous pouvez calculer des résultats significatifs. La réponse courte ici est "beaucoup plus de Map/Reduces", mais considérez le genre de choses que vous pouvez faire:
Malheureusement, je ne connais pas assez les types de façons d'analyser et de traiter les données pour être super utiles. Mais l'idée générale est des moyens évolutifs d'analyser vos données .
Phase 3: Présentation des résultats (passez 10 minutes à expliquer)
La phase finale sert réellement les résultats. J'espère que vous avez partagé des informations intéressantes sur la façon d'analyser les données des pages Web, mais la question est de savoir comment les interroger? De façon anecdotique, 10% des requêtes de recherche Google chaque jour n'ont jamais été vues auparavant. Cela signifie que vous ne pouvez pas mettre en cache les résultats précédents.
Vous ne pouvez pas avoir une seule "recherche" à partir de vos index Web, alors que voulez-vous essayer? Comment regarderiez-vous les différents index? (Peut-être en combinant les résultats - peut-être que le mot-clé 'stackoverflow' a été très utilisé dans plusieurs index.)
De plus, comment le rechercheriez-vous de toute façon? Quelles sortes d'approches pouvez-vous utiliser pour lire rapidement des données à partir de quantités massives d'informations? (N'hésitez pas à nommer votre base de données NoSQL préférée ici et/ou à regarder en quoi consiste la BigTable de Google.) Même si vous avez un index génial qui est très précis, vous avez besoin d'un moyen de trouver des données rapidement. (Par exemple, recherchez le numéro de classement de 'stackoverflow.com' dans un fichier de 200 Go.)
Problèmes aléatoires (temps restant)
Une fois que vous avez couvert les "os" de votre moteur de recherche, n'hésitez pas à creuser le trou sur n'importe quel sujet individuel que vous connaissez particulièrement.
Il y a évidemment plus de 15 minutes de matériel à discuter ici, mais j'espère que cela suffira pour vous aider à démarrer.