Portanto, tendo em mente que essa é uma pergunta de entrevista e não um cenário real da vida real, acredito que a abordagem correta (e provavelmente o que o entrevistador está procurando) é fazer uma pergunta esclarecedora ou escrever "Não pode ser feito "e seguir em frente. Aqui está o porquê.
O que o entrevistador pergunta:
Escreva uma função que é garantida para nunca retornar o mesmo valor duas vezes. Suponha que essa função será acessada por várias máquinas simultaneamente.
O que o entrevistador precisa:
Esse candidato avalia efetivamente os requisitos e busca informações adicionais quando necessário?
Nunca assuma.
Quando um engenheiro recebe um requisito (por meio de uma SOW ou Especificação ou algum outro documento de requisitos), alguns são evidentes e outros são totalmente incertos. Este é um exemplo perfeito deste último. Como as respostas anteriores mostraram, não há como responder a esse requisito sem fazer várias suposições principais (a) quanto à natureza da pergunta ou (b) quanto à natureza do sistema, porque o requisito não pode ser atendido. como está escrito (é impossível).
A maioria das respostas faz uma tentativa ou outra de resolver o problema por meio de uma série de suposições. Recomenda-se especificamente fazê-lo rapidamente e deixar o cliente se preocupar se estiver errado.
Esta é realmente uma péssima abordagem. Como cliente, se eu der um requisito claro, e o engenheiro sair e me criar uma solução que não funcione, ficarei chateado que eles tenham ido trabalhar e gastaram meu dinheiro sem se preocupar em me perguntar primeiro. Esse tipo de tomada de decisão descuidada demonstra falta de trabalho em equipe, incapacidade de pensar criticamente e mau julgamento. Pode levar a qualquer tipo de conseqüências negativas, incluindo perda de vida em um sistema crítico de segurança.
Por que fazer a pergunta?
O ponto se este exercício é que é caro e demorado criar requisitos ambíguos. No caso do OP, você recebeu uma tarefa impossível. Sua primeira ação deve ser pedir esclarecimentos - o que é necessário? Que grau de exclusividade é necessário? O que acontece se um valor não for exclusivo? A resposta para essas perguntas pode ser a diferença entre várias semanas e alguns minutos. No mundo real, um dos maiores fatores de custo em sistemas complexos (incluindo muitos sistemas de software) são requisitos pouco claros e pouco compreendidos. Isso leva a erros caros e demorados, redesenhamentos, frustração de clientes e equipes e cobertura da mídia embaraçosa se o projeto for grande o suficiente.
O que acontece quando você assume?
Dada a minha experiência na indústria aeroespacial e devido à natureza altamente visível das falhas aeroespaciais, gosto de trazer exemplos desse domínio para ilustrar pontos importantes. Vamos examinar um par de missões fracassadas em Marte - o Mars Climate Orbiter e o Mars Polar Lander. Ambas as missões falharam devido a problemas de software - porque os engenheiros fizeram suposições inválidas devido, em parte, a requisitos pouco claros e pouco comunicados.
Mars Climate Orbiter - este caso é tipicamente citado como o que acontece quando a NASA tenta converter inglês em unidades métricas. No entanto, essa é uma representação excessivamente simplista e pobre do que realmente aconteceu. É verdade que houve um problema de conversão, mas isso ocorreu devido a requisitos pouco comunicados na fase de design e a um esquema de verificação / validação incorreto. Além disso, quando dois engenheiros diferentes perceberam o problema porque era óbvio a partir dos dados da trajetória de vôo, eles não levaram o problema ao nível adequado porque supuseram que se tratava de um erro de transmissão. Se a equipe de operações da missão estivesse ciente do problema, havia tempo suficiente para corrigi-lo e salvar a missão. Nesse caso, havia uma condição lógica impossível que não era reconhecida pelo que era, levando a dispendiosas falhas na missão.
Mars Polar Lander- este caso é um pouco menos conhecido, mas possivelmente mais embaraçoso devido à sua proximidade temporal à falha do Mars Climate Orbiter. Nesta missão, o software controlava a descida do foguete assistida pelo propulsor na superfície marciana. Em um ponto a 40 metros acima da superfície, as pernas do veículo pousaram em preparação para o pouso. Havia também um sensor nas pernas que detectava movimento (para sinalizar quando foram afetados) para dizer ao software para desligar o motor. O melhor palpite da NASA sobre o que aconteceu (porque existem várias falhas possíveis e dados incompletos) é que vibrações aleatórias nas pernas devido à sua implantação simultânea e indevidamente acionaram o mecanismo de desligamento 40m acima da superfície, resultando no acidente e na destruição dos US $ 110 Nave espacial M. Essa possibilidade foi levantada no desenvolvimento, mas nunca foi abordado. Por fim, a equipe de software fez suposições inválidas sobre como esse código precisava ser executado (uma dessas suposições é que um sinal espúrio teria vida curta demais para ser captado, apesar dos testes mostrarem o contrário), e essas suposições nunca foram questionadas até depois o fato.
Considerações adicionais
Entrevistar e avaliar pessoas é um negócio complicado. Existem várias dimensões de um candidato que um entrevistador pode querer explorar, mas uma das mais importantes é a capacidade de um indivíduo de pensar criticamente. Por várias razões, entre as quais o pensamento crítico é mal definido, temos dificuldade em avaliar as habilidades de pensamento crítico.
Como instrutor de engenharia, uma das minhas maneiras favoritas de avaliar a capacidade de um aluno de pensar criticamente era fazer uma pergunta um tanto ambígua. Os alunos mais aguçados entendiam a premissa defeituosa da pergunta, observavam-na e respondiam, dada a premissa, ou se recusavam a responder por completo. Normalmente, eu faria uma pergunta semelhante à seguinte:
Você escolhe um desenho da sua pilha de trabalho. O desenho contém uma variedade de textos explicativos diferentes, mas os pontos mais importantes para uma superfície horizontal e diz "Perfeitamente plano". A superfície tem 5 "de largura por 16" de comprimento e a peça é feita de alumínio. Como você usinará a peça para criar esse recurso?
(A propósito, você ficaria chocado com a frequência com que uma especificação tão ruim aparece no local de trabalho.)
Espero que os alunos reconheçam que não é possível criar um recurso perfeito e que eles declarem isso em sua resposta. Normalmente, eu atribuiria um ponto de bônus se eles disserem que voltarão ao designer e pedirão esclarecimentos antes de fazer a peça. Se um aluno começar a me dizer como alcançará a planaridade 0,001 ou algum outro valor compensado, concedo zero pontos. Isso me ajuda a mostrar aos meus alunos que eles precisam pensar no quadro geral.
Bottom Line
Se estou entrevistando um engenheiro (ou profissão similar), procuro alguém que possa pensar criticamente e questionar o que foi colocado na sua frente. Quero alguém que faça a pergunta "Isso faz sentido?" .
Não faz sentido pedir uma peça perfeitamente plana, porque não existe algo perfeito. Não faz sentido solicitar uma função que nunca retorne um valor duplicado, porque é impossível fazer essa garantia. Na programação, geralmente ouvimos a frase "lixo dentro, lixo fora". Se você recebe lixo para requisitos, é sua responsabilidade ética parar e fazer qualquer pergunta que o ajude a obter a verdadeira intenção. Se eu estiver entrevistando um candidato e lhes der um requisito incerto, esperarei perguntas de esclarecimento.