Algoritmo de Ordenação em 20 minutos

Fala pessoal !!!

Só pra não achar qeu eu estou sendo injusto, fiz um teste desses que aplicam para pré-entrevista, e em 90 minutos eu teria que responder a diversas perguntas INCLUINDO uma pergunta que me solicitaca criar um algoritmo de ordenação de String na unha, em Java, numa folha de papel.

Eu deixei em branco, faltavam apenas 20 minutos quando terminei o resto da prova que tinha muitas perguntas dissertativas. Vocês acham normal pedir esse tipo de coisa em tão pouco tempo, ou acham que é algum tipo de pergunta pra fazer o candidato perder tempo ?!?!?

[quote=Giulliano]Fala pessoal !!!

Só pra não achar qeu eu estou sendo injusto, fiz um teste desses que aplicam para pré-entrevista, e em 90 minutos eu teria que responder a diversas perguntas INCLUINDO uma pergunta que me solicitaca criar um algoritmo de ordenação de String na unha, em Java, numa folha de papel.

Eu deixei em branco, faltavam apenas 20 minutos quando terminei o resto da prova que tinha muitas perguntas dissertativas. Vocês acham normal pedir esse tipo de coisa em tão pouco tempo, ou acham que é algum tipo de pergunta pra fazer o candidato perder tempo ?!?!?[/quote]

Bom, eu acho que é normal, mas não diria que é justo. Muita gente sabe algoritmos de ordenação de decoreba, então na realidade não estaria provando tanta coisa na minha opinião.

Mas é sempre bom ter um Insertion Sort ou Selection Sort na manga, já que são tão simples de implementar. Mas realmente se você nunca olhou pra um deles (porque sinceramente na pratica raramente alguém usa), é difícil tirar um do nada em 20 minutos.

Há uns duzentos anos atrás, me aplicaram um teste de C (com consulta ao livro do Kernighan & Ritchie) e que também solicitava escrever um algoritmo de ordenação. Usei um bubblesort mesmo, e não tive problemas para passar. (Se eu soubesse esse livro de cor, lá havia o quicksort, mas então talvez me reduzissem alguns pontos, porque naquela época - onde não havia Internet - as pessoas não viam com bons olhos a capacidade de uma pessoa resolver algo só com uma boa consulta ao Google. )

Na verdade eu argumentei, na resolução da pergunta, que o algoritmo, para o conjunto de dados da questão, era mais que suficiente, e que não deveria ser usado para um conjunto maior de dados. Talvez isso tivesse também acrescentado alguns pontos :slight_smile:

Eu dei uma olhada na época da facul, me lembro do QuickSort e do Bubble Sort, mas obviamente (na minha concepção) que ninguém reescreve isso na mão. Bom…se essa pergunta for decisiva eu me excluo da vaga.

Muitas vezes essas provinhas foram criadas há uns 10 anos atrás e o pessoal do RH nunca se interessou por alterá-las - mas o importante é você ver com o pessoal que você realmente vai trabalhar junto o que você realmente vai fazer. Não julgue o departamento de TI de uma empresa pelo seu departamento de RH :frowning:

Boaaa…

Realmente na época do C, havia uma grande diferença entre o SABER e (o que é considerado saber de hoje em dia) pesquisar algo pronto no google.

Tem alguns detalhes interessantes nessas questões. Não que sejam importantes em todos os casos, mas é bom saber que a pessoa sendo contratada sabe disso.

Por exemplo, em um cenário onde o uso de memória é crítico, usar o Merge Sort (o algoritmo utilizado no Collections.sort do Java), pode não ser uma boa ideia em coleções muito grandes, pois apesar de ser o que executa mais rápido, ele cria um array do mesmo tamanho do que está sendo ordenado.

Nesse caso é legal o entrevistado saber que um ShellSort pode ser usado como alternativa. A performance dele não é a mesma, mas ele não usa nenhuma memória adicional.

Isso é algo que eu acho interessante saber, mas novamente, raramente se encontra um lugar onde algo assim é essencial.

+1

olha, é aquela história, se eu for fazer um teste onde me passam para escrever código na mão, eu levanto viro as costas e vou embora. :slight_smile:

[quote=Giulliano]Fala pessoal !!!

Só pra não achar qeu eu estou sendo injusto, fiz um teste desses que aplicam para pré-entrevista, e em 90 minutos eu teria que responder a diversas perguntas INCLUINDO uma pergunta que me solicitaca criar um algoritmo de ordenação de String na unha, em Java, numa folha de papel.

Eu deixei em branco, faltavam apenas 20 minutos quando terminei o resto da prova que tinha muitas perguntas dissertativas. Vocês acham normal pedir esse tipo de coisa em tão pouco tempo, ou acham que é algum tipo de pergunta pra fazer o candidato perder tempo ?!?!?[/quote]

Deixar de ter respondido esta questão pode significar que vc sabe administrar bem o seu tempo, se nas questões anteriores as perguntas foram mais profundas tais como:

Quais os frameworks mais utilizados para java na web?
O que é um ORM, cite um e fale de sua experiencia nele?
O que é um IoC, cite um e fale de sua experiencia nele?
O que são metadados e para que servem?
Cite 3 patterns de desenvolvimento.
O que é um Inner Join?
Cite 2 frameworks para a geração de relatórios.
O que é uma IDE de desenvolvimento, cite 3 e relate sua experiência em uma delas.
Qual sua experiência com Maven ou ANT?
Com quais versionarores já trabalou?
Qual a principal diferênca entre um projeto Orientado a objeto de Projeto Estruturado, com qual prefere trabalhar e por quê?

Agora, se eles derem tanta relevância a esse codigo, na minha opinião, isso evidencia que a pessoa que está por tras da elaboração prova está procurando alguem que saiba menos do que ele. Um estagiário.

A codificação deveria ser o mais trivial possível para uma prova destas.

[quote=carlos.hager]olha, é aquela história, se eu for fazer um teste onde me passam para escrever código na mão, eu levanto viro as costas e vou embora. :slight_smile:

[/quote]

+1

Nossa, mas nem um Bubble Sort saiu? Esse algoritmo leva 5 minutos para alguém montar.

[quote=Luiz Augusto Prado]Deixar de ter respondido esta questão pode significar que vc sabe administrar bem o seu tempo, se nas questões anteriores as perguntas foram mais profundas tais como:

Quais os frameworks mais utilizados para java na web?
O que é um ORM, cite um e fale de sua experiencia nele?
O que é um IoC, cite um e fale de sua experiencia nele?
O que são metadados e para que servem?
Cite 3 patterns de desenvolvimento.
O que é um Inner Join?
Cite 2 frameworks para a geração de relatórios.
O que é uma IDE de desenvolvimento, cite 3 e relate sua experiência em uma delas.
Qual sua experiência com Maven ou ANT?
Com quais versionarores já trabalou?
Qual a principal diferênca entre um projeto Orientado a objeto de Projeto Estruturado, com qual prefere trabalhar e por quê?

Agora, se eles derem tanta relevância a esse codigo, na minha opinião, isso evidencia que a pessoa que está por tras da elaboração prova está procurando alguem que saiba menos do que ele. Um estagiário.

A codificação deveria ser o mais trivial possível para uma prova destas. [/quote]
Acho que isso foi generalizado demais. Dependendo da vaga sendo disputada, o algoritmo pode valer mais pontos do que qualquer um dos itens acima.

Falando nisso, ponto interessante. Giulliano, você pode falar por cima qual era a vaga? Assim é até mais fácil saber se o exercício é relevante ou não.

[quote=carlos.hager]olha, é aquela história, se eu for fazer um teste onde me passam para escrever código na mão, eu levanto viro as costas e vou embora. :slight_smile:
[/quote]

E assim vc abra mão de várias e boas oportunidades de emprego. Dois dos bons empregos que tive fizeram provinhas.

Bubble Sort é um algoritmo de ordenação ruim.
Se o carinha fosse fazer uma prova de ordenação, o melhor a escolher seria o quicksort (ao menos cita-lo se não desse tempo).

Bubble Sort é um algoritmo de ordenação ruim.
Se o carinha fosse fazer uma prova de ordenação, o melhor a escolher seria o quicksort (ao menos cita-lo se não desse tempo).

[/quote]Mas o Quicksort tem complexidade O(n²) não tem? O Mergesort tem complexidade O(n log n)

Bubble Sort é um algoritmo de ordenação ruim.
Se o carinha fosse fazer uma prova de ordenação, o melhor a escolher seria o quicksort (ao menos cita-lo se não desse tempo).

[/quote]

É claro que é ruim. Mas é o mais óbvio para se escrever (e implementar corretamente) em 5 minutos, só com lápis e papel.

Imagine você escrever só com acesso a lápis e papel uma implementação correta do QuickSort.

Sempre tem um detalhinho chato, até porque Java não é muito adequada para escrever a implementação do algoritmo tal como se define na teoria (que é uma definição recursiva e que é mais apropriada para uso com listas como as do Lisp).

E se for para escrever o “melhor possível”, obviamente não há “melhor possível” porque tudo depende dos dados de entrada e da quantidade de dados. Um livro do Knuth fala apenas sobre busca e ordenação; ele não escreveria um livro grosso daqueles se houvesse um algoritmo que fosse “o melhor possível em todos os casos”.

Bubble Sort é um algoritmo de ordenação ruim.
Se o carinha fosse fazer uma prova de ordenação, o melhor a escolher seria o quicksort (ao menos cita-lo se não desse tempo).

[/quote]

Mas se a questão não pediu para escrever um algoritmo de ordenação efetivo, somente um algoritmo de ordenação. Acho que somente o lucky sort não seria válido nesse caso.

[quote=ViniGodoy][quote=carlos.hager]olha, é aquela história, se eu for fazer um teste onde me passam para escrever código na mão, eu levanto viro as costas e vou embora. :slight_smile:
[/quote]

E assim vc abra mão de várias e boas oportunidades de emprego. Dois dos bons empregos que tive fizeram provinhas.[/quote]

Eu já consegui um bom emprego assim. Se as pessoas fazem provas escritas demoradas e cansativas para concurso público, por quê não podem fazer uma prova escrita de 90 minutos para uma boa vaga de emprego em uma empresa privada?

[quote=Rodrigo Sasaki]
Acho que isso foi generalizado demais. Dependendo da vaga sendo disputada, o algoritmo pode valer mais pontos do que qualquer um dos itens acima.

Falando nisso, ponto interessante. Giulliano, você pode falar por cima qual era a vaga? Assim é até mais fácil saber se o exercício é relevante ou não.[/quote]

Sim, dependendo da vaga…

O que quero dizer é que dependendo do nível do candidato, apesar dele ser avançado e dele saber os nomes dos métodos ele pode não lembrar como eles são feitos. Por exemplo, eu tenho uma classe matemática onde tenho funções tais como Bascara_Metodo_Quadrados_Minimos. Eu sei o que é e para que serve, mas não lembro de como é feita a codificação.
Um candidato do 2º ano se sairia melhor por causa da recem aula de calculo enquanto que outro do 4º ano não.

A vaga é para Programador Java Sr, a empresa é um portal (possui diversas soluções como e-commerce, meio de pagamento, portais web, fóruns e muitas outras frentes)

As outras perguntas eram de lógica envolvendo OO, palavras reservadas do Java (sincronize, static, assert), tratamento de concorrência. Enfim nada demais. Eu na verdade estou de olho em outra vaga deles (Arquiteto) mas acabei fazendo as duas provas.