Donc, en gardant à l'esprit qu'il s'agit d'une question d'entrevue et non d'un scénario réel, je pense que la bonne approche (et probablement ce que l'intervieweur recherche) est de poser une question de clarification ou d'écrire "Cela ne peut pas être fait "et passer à autre chose. Voici pourquoi.
Ce que l'intervieweur demande:
Écrivez une fonction qui est garantie de ne jamais retourner deux fois la même valeur. Supposons que cette fonction sera accessible simultanément par plusieurs machines.
Ce dont l'enquêteur a besoin:
Ce candidat évalue-t-il efficacement les exigences et cherche-t-il des commentaires supplémentaires au besoin?
N'assume jamais.
Lorsqu'un ingénieur reçoit une exigence (via un EDT ou un cahier des charges ou un autre document d'exigences), certains vont de soi et d'autres sont totalement flous. Ceci est un parfait exemple de ce dernier. Comme l'ont montré les réponses précédentes, il n'y a aucun moyen de répondre à cette exigence sans faire plusieurs hypothèses majeures soit (a) quant à la nature de la question ou (b) quant à la nature du système, parce que l'exigence ne peut être satisfaite tel qu'écrit (c'est impossible).
La plupart des réponses tentent d'une manière ou d'une autre de résoudre le problème via une série d'hypothèses. On recommande spécifiquement de le faire rapidement et de laisser le client s'en soucier si c'est faux.
C'est vraiment une mauvaise approche. En tant que client, si je donne une exigence peu claire et que l'ingénieur part et me construit une solution qui ne fonctionne pas, je vais être contrarié qu'ils soient allés travailler et ont dépensé mon argent sans prendre la peine de me demander d'abord. Ce type de prise de décision cavalière démontre un manque de travail d'équipe, une incapacité à penser de manière critique et un mauvais jugement. Cela peut entraîner toute sorte de conséquences négatives, y compris la perte de vie dans un système critique pour la sécurité.
Pourquoi poser la question?
Le point si cet exercice est qu'il est coûteux et long de construire selon des exigences ambiguës. Dans le cas du PO, on vous a confié une tâche impossible. Votre première action devrait être de demander des clarifications - qu'est-ce qui est requis? Quel degré d'unicité est nécessaire? Que se passe-t-il si une valeur n'est pas unique? La réponse à ces questions pourrait être la différence entre plusieurs semaines et quelques minutes. Dans le monde réel, l'un des principaux facteurs de coût des systèmes complexes (y compris de nombreux systèmes logiciels) réside dans les exigences peu claires et mal comprises. Cela conduit à des bogues coûteux et chronophages, à des restructurations, à la frustration des clients et des équipes et à une couverture médiatique embarrassante si le projet est suffisamment important.
Que se passe-t-il lorsque vous supposez?
Étant donné mes antécédents dans l'industrie aérospatiale et en raison de la nature très visible des défaillances aérospatiales, j'aime citer des exemples de ce domaine pour illustrer des points importants. Examinons une paire de missions échouées sur Mars - Mars Climate Orbiter et Mars Polar Lander. Les deux missions ont échoué en raison de problèmes logiciels - parce que les ingénieurs ont émis des hypothèses invalides en raison, en partie, d'exigences peu claires et mal communiquées.
Mars Climate Orbiter - ce cas est généralement cité comme ce qui se passe lorsque la NASA tente de convertir l'anglais en unités métriques. Cependant, c'est une représentation trop simpliste et médiocre de ce qui s'est réellement passé. Certes, il y avait un problème de conversion, mais il était dû à des exigences mal communiquées dans la phase de conception et à un schéma de vérification / validation incorrect. De plus, lorsque deux ingénieurs différents ont remarqué le problème parce qu'il était évident à partir des données de trajectoire de vol, ils n'ont pas soulevé le problème au niveau approprié car ils ont supposé qu'il s'agissait d'une erreur de transmission. Si l'équipe des opérations de la mission avait été informée du problème, il y aurait eu suffisamment de temps pour le corriger et sauver la mission. Dans ce cas, il y avait une condition logique impossible qui n'était pas reconnue pour ce qu'elle était, conduisant à l'échec de la mission coûteuse.
Mars Polar Lander- ce cas est un peu moins connu, mais peut-être plus embarrassant en raison de sa proximité temporelle avec la panne de Mars Climate Orbiter. Dans cette mission, le logiciel a contrôlé la descente assistée par un propulseur de la fusée dans la surface martienne. À un point situé à 40 mètres au-dessus de la surface, les jambes de l'atterrisseur se sont déployées en préparation de l'atterrissage. Il y avait également un capteur sur les jambes qui détectait le mouvement (pour signaler quand ils avaient eu un impact) pour dire au logiciel d'arrêter le moteur. La meilleure supposition de la NASA sur ce qui s'est passé (car il y a plusieurs défaillances possibles et des données incomplètes) est que des vibrations aléatoires dans les jambes en raison de leur déploiement simultanément et ont incorrectement déclenché le mécanisme d'arrêt à 40 m au-dessus de la surface, entraînant le crash et la destruction du 110 $ Vaisseau spatial M. Cette possibilité a été évoquée lors du développement, mais n'a jamais été abordé. En fin de compte, l'équipe du logiciel a fait des hypothèses invalides sur la façon dont ce code devait fonctionner (une de ces hypothèses est qu'un signal parasite serait trop éphémère pour être capté, malgré des tests montrant le contraire), et ces hypothèses n'ont jamais été remises en question avant le fait.
Considérations supplémentaires
Interviewer et évaluer des personnes est une entreprise délicate. Il y a plusieurs dimensions d'un candidat qu'un enquêteur voudra peut-être explorer, mais l'une des plus importantes est la capacité d'un individu à penser de manière critique. Pour diverses raisons, dont la moindre n'est pas que la pensée critique est mal définie, nous avons beaucoup de mal à évaluer les capacités de pensée critique.
En tant que professeur d'ingénierie, l'une de mes façons préférées d'évaluer la capacité d'un étudiant à penser de manière critique était de poser une question quelque peu ambiguë. Les élèves les plus pointus retiendraient la prémisse défectueuse de la question, la noteraient et répondraient à la prémisse ou refuseraient de répondre complètement. En règle générale, je pose une question similaire à la suivante:
Vous prenez un dessin de votre pile de travaux. Le dessin contient une variété de légendes différentes, mais le plus important pointe vers une surface horizontale et dit "parfaitement plat". La surface mesure 5 "de large par 16" de long et la pièce est en aluminium. Comment usinerez-vous la pièce pour créer cette fonction?
(Soit dit en passant, vous seriez choqué de voir à quelle fréquence une telle spécification médiocre apparaît sur le lieu de travail.)
Je m'attends à ce que les élèves reconnaissent qu'il n'est pas possible de créer une fonctionnalité parfaite et qu'ils l'indiqueront dans leur réponse. J'attribuerais généralement un point bonus s'ils disent qu'ils reviendront au concepteur et demanderont des éclaircissements avant de faire la pièce. Si un élève continue de me dire comment il va atteindre une planarité de 0,001 ou une autre valeur composée, je n'accorde aucun point. Cela m'aide à faire remarquer à mes élèves qu'ils doivent penser à une vue d'ensemble.
Bottom Line
Si j'interroge un ingénieur (ou une profession similaire), je recherche quelqu'un qui peut réfléchir de manière critique et remettre en question ce qui a été placé devant lui. Je veux quelqu'un qui pose la question "Est-ce que cela a du sens?" .
Il n'est pas logique de demander une pièce parfaitement plate, car la perfection n'existe pas. Il n'est pas logique de demander une fonction qui ne renvoie jamais une valeur en double, car il est impossible de faire une telle garantie. Dans la programmation, nous entendons souvent l'expression «ordures entrantes, ordures sortantes». Si l'on vous remet des ordures pour les exigences, il est de votre responsabilité éthique de vous arrêter et de poser toute question qui vous aidera à obtenir la véritable intention. Si j'interroge un candidat et que je lui donne une exigence peu claire, je vais m'attendre à des questions de clarification.