Entonces, teniendo en cuenta que esta es una pregunta de entrevista y no un escenario real de la vida real, creo que el enfoque correcto (y probablemente lo que el entrevistador está buscando) es hacer una pregunta aclaratoria o escribir "No puede ser hecho "y seguir adelante. Este es el por qué.
Lo que pide el entrevistador:
Escriba una función que garantice que nunca devolverá el mismo valor dos veces. Suponga que varias máquinas tienen acceso a esta función simultáneamente.
Lo que necesita el entrevistador:
¿Este candidato evalúa efectivamente los requisitos y busca aportes adicionales cuando es necesario?
Nunca asumas.
Cuando a un ingeniero se le entrega un requisito (a través de una SOW o una Especificación o algún otro documento de requisitos), algunos son evidentes y otros no son del todo claros. Este es un ejemplo perfecto de esto último. Como han mostrado las respuestas anteriores, no hay forma de responder a este requisito sin hacer varias suposiciones importantes, ya sea (a) en cuanto a la naturaleza de la pregunta o (b) en cuanto a la naturaleza del sistema, porque el requisito no puede cumplirse tal como está escrito (es imposible).
La mayoría de las respuestas hacen un intento u otro para resolver el problema a través de una serie de suposiciones. Uno recomienda específicamente hacerlo rápidamente y dejar que el cliente se preocupe si está mal.
Este es realmente un mal enfoque. Como cliente, si doy un requisito poco claro, y el ingeniero se va y me crea una solución que no funciona, me enojaría que se pusieran a trabajar y gastaran mi dinero sin molestarse en preguntarme primero. Ese tipo de toma de decisiones arrogante demuestra una falta de trabajo en equipo, incapacidad para pensar críticamente y falta de juicio. Puede conducir a cualquier tipo de consecuencias negativas, incluida la pérdida de vidas en un sistema crítico de seguridad.
¿Por qué hacer la pregunta?
El punto si este ejercicio es que es costoso y lleva mucho tiempo construir con requisitos ambiguos. En el caso del OP, se le ha asignado una tarea imposible. Su primera acción debería ser pedir una aclaración: ¿qué se requiere? ¿Qué grado de singularidad se necesita? ¿Qué sucede si un valor no es único? La respuesta a estas preguntas podría ser la diferencia entre varias semanas y unos minutos. En el mundo real, uno de los mayores factores de costo en los sistemas complejos (incluidos muchos sistemas de software) son los requisitos poco claros y poco conocidos. Esto conduce a errores costosos y que consumen mucho tiempo, rediseños, frustración de clientes y equipos, y una cobertura mediática vergonzosa si el proyecto es lo suficientemente grande.
¿Qué sucede cuando asumes?
Dado mi experiencia en la industria aeroespacial, y debido a la naturaleza altamente visible de las fallas aeroespaciales, me gusta presentar ejemplos de este dominio para ilustrar puntos importantes. Examinemos un par de misiones fallidas de Marte: Mars Climate Orbiter y Mars Polar Lander. Ambas misiones fallaron debido a problemas de software, porque los ingenieros hicieron suposiciones inválidas debido, en parte, a requisitos poco claros y mal comunicados.
Mars Climate Orbiter : este caso generalmente se cita como lo que sucede cuando la NASA intenta convertir el inglés a unidades métricas. Sin embargo, esa es una representación demasiado simplista y pobre de lo que realmente ocurrió. Es cierto que hubo un problema de conversión, pero se debió a requisitos mal comunicados en la fase de diseño y a un esquema de verificación / validación incorrecto. Además, cuando dos ingenieros diferentes notaron el problema porque era obvio a partir de los datos de la trayectoria de vuelo, no plantearon el problema al nivel adecuado porque asumieron que era un error de transmisión. Si el equipo de operaciones de la misión hubiera tenido conocimiento del problema, habría tiempo suficiente para corregirlo y salvar la misión. En este caso, había una condición lógica imposible que no se reconoció por lo que era, lo que condujo a un costoso fracaso de la misión.
Marte Polar Lander- este caso es un poco menos conocido, pero posiblemente más vergonzoso debido a su proximidad temporal a la falla del Mars Climate Orbiter. En esta misión, el software controlaba el descenso asistido por el propulsor del cohete hacia la superficie marciana. En un punto a 40 metros sobre la superficie, las patas del módulo de aterrizaje se desplegaron en preparación para aterrizar. También había un sensor en las piernas que detectaba movimiento (para indicar cuándo habían impactado) para indicarle al software que apague el motor. La mejor suposición de la NASA sobre lo que sucedió (porque hay múltiples fallas posibles y datos incompletos) es que las vibraciones aleatorias en las piernas debido a su despliegue simultáneo y dispararon incorrectamente el mecanismo de apagado a 40 metros de la superficie, lo que provocó el choque y la destrucción de los $ 110 M nave espacial. Esta posibilidad se planteó en el desarrollo, pero nunca fue abordado. En última instancia, el equipo de software hizo suposiciones inválidas sobre cómo este código debía ejecutarse (una de esas suposiciones es que una señal espuria sería demasiado corta para ser detectada, a pesar de las pruebas que muestran lo contrario), y esas suposiciones nunca fueron cuestionadas hasta después el hecho.
consideraciones adicionales
Entrevistar y evaluar a las personas es un asunto complicado. Hay varias dimensiones de un candidato que un entrevistador puede desear explorar, pero una de las más importantes es la capacidad de un individuo para pensar críticamente. Por una variedad de razones, una de las cuales es que el pensamiento crítico está mal definido, nos resulta muy difícil evaluar las habilidades de pensamiento crítico.
Como instructor de ingeniería, una de mis formas favoritas de evaluar la capacidad de un estudiante para pensar críticamente era hacer una pregunta algo ambigua. Los estudiantes más agudos captarían la premisa defectuosa de la pregunta, la notarían y responderían dada la premisa o rechazarían responder por completo. Por lo general, haría una pregunta similar a la siguiente:
Recoges un dibujo de tu pila de trabajo. El dibujo contiene una variedad de rótulos diferentes, pero los puntos más importantes apuntan a una superficie horizontal y dice "Perfectamente plano". La superficie es de 5 "de ancho por 16" de largo, y la parte está hecha de aluminio. ¿Cómo mecanizará la pieza para crear esta función?
(Por cierto, te sorprendería la frecuencia con la que aparece una especificación tan pobre en el lugar de trabajo).
Espero que los estudiantes reconozcan que no es posible crear una característica perfecta y que lo declararán en su respuesta. Por lo general, otorgaría un punto de bonificación si dicen que volverán al diseñador y pedirán una aclaración antes de hacer la parte. Si un estudiante procede a decirme cómo van a lograr una planaridad de .001 o algún otro valor inventado, otorgo cero puntos. Esto me ayuda a decirles a mis alumnos que necesitan pensar en el panorama general.
Línea de fondo
Si estoy entrevistando a un ingeniero (o una profesión similar), estoy buscando a alguien que pueda pensar críticamente y cuestionar lo que se le ha puesto delante. Quiero a alguien que haga la pregunta "¿Tiene sentido?" .
No tiene sentido pedir una parte perfectamente plana, porque no existe tal cosa como perfecta. No tiene sentido pedir una función que nunca devuelva un valor duplicado, porque es imposible hacer tal garantía. En la programación, a menudo escuchamos la frase "basura adentro, basura afuera". Si le entregan basura por requisitos, es su responsabilidad ética detenerse y hacer cualquier pregunta que lo ayude a obtener la verdadera intención. Si estoy entrevistando a un candidato y le doy un requisito poco claro, esperaré preguntas de aclaración.