quarta-feira, 16 de setembro de 2009

Afff

Eu tenho trabalhado BASTANTE ultimamente. Alguns dias eu fiquei até às 7 da noite, um dia ate às 9 da noite, mas na maioria até que eu tenho saído às seis. Eu GOSTO do que eu faço, então não é TÃO estressante quanto poderia ser, mas eu espero que a temporada de entregas/ trabalho extra/ corrida maluca acabe logo.

O pior de tudo é que a maioria destas horas incessantes de trabalho são causadas por outras pessoas. Alguns destes escorregões são perdoáveis, mas ficar ouvindo "você tem que me explicar (como eu faço meu trabalho)" dia após dia é uma M*. Aparentemente o causador das minhas aflições não vai durar muito tempo na empresa (está TODO mundo cansado dele), mas é uma chateação sem fim quando alguém cujo trabalho é crítico fica a agir como se todo mundo estivesse impedindo o trabalho dele de prosseguir, quando na verdade é o contrário.

Aliás, tive minha primeira avaliação depois de 6 meses empregado. Foi bão.

Hoje entrevistamos um carinha para trabalhar com a gente. Vai pergunta, vem pergunta, e uma impressão de que o cara mais sabia falar de como fazer do que, bem, fazer. Aí eu olho o teste do cara (que eles copiaram da minha empresa antiga, mas deixa), e vejo algo que pode ser uma boa pergunta. Algo que um cara senior deveria saber. Eu olho um código parecido com o abaixo e pergunto (eu sei que 99% dos leitores não vão entender o que é, mas eu preciso explicar):

public static void someMethodNameHere(List originaList, List checkingList) {
for (Object element : originalList) {
if(!checkingList.contains(element))
originalList.remove(element);
}
}


Tem dois problemas aí em cima. O método não vai funcionar e ele é não é eficiente. Aí eu perguntei para o cara - "ZERO DOIS, porque o método acima não é eficiente?", e ele não respondeu. Aí eu perguntei "ZERO DOIS, você tem um arquivo de 10000 linhas, cada linha tem um número, e você tem, sei lá, 5 números diferentes em todo o arquivo (ou seja, tem muito número repetido). Que classe te dará automaticamente a lista de números únicos sem você precisar escrever código para fazer isso manualmente?"

Dois segundos depois - literalmente - ele me responde "hmmm, não sei, eu não conheço tão bem assim as classes em Java". A entrevista acabou ali, o outro programador continou por educação, mas como dissemos depois para a mulher do RH, ele, programador Senior, tinha que saber a resposta. Ele tinha um problema típico - sabia falar de como fazer, mas não sabia como fazer.

Não vou colocar a resposta aqui, se tiver algum programador que queira arriscar, por favor, faça a sua aposta!

...

Tem uma mulher que me ligou para perguntar umas perguntas de opiniões sobre o governo...

Ave...

Fui!!!

7 comentários:

Taty disse...

hua hua hua.... eu já fiz entrevista aqui no brasil tb.... tem cada uma mesmo....

quando fui contratar minha assistente eu falei "eu preciso de alguem pra me ajudar, se for atrapalhar ou a cada meio segundo me perguntar como é que faz eu prefiro fazer sozinha, é mais rápido" hua hua hua... sou uma bruxa...

Luiz Alberto disse...

Posso chutar? Fiquei curioso das respostas, então vamos aos meus chutes... :)
1. Primeiro, qual das listas é menor e iterar pela menor lista ao invés de iterar já com a originalList - vai que ela tem 1 milhão de elementos e a outra só 5. Outro ponto, é que as listas podem ter elementos repetidos. Então o primeiro método burro seria transformar a originalList em um dicionário, mas só esta linha poderia tomar mais tempo do que a busca original... o segundo chute seria criar um dicionário vazio e a cada novo elemento a ser procurado, incluir no dicionário e se não houver aumento no dicionário, não se deve tentar remover de novo... Teria que avaliar a performance disto para ver se vale a pena.
2. Para essa segunda resposta, como eu conheço C# e pouco de Java, meu chute é a classe Dictionary e no construtor dela, ela aceita uma classe collection. Enfim, em C# funcionaria... ;)
Quais são as respostas mesmo??? :)
Um Forte Abraço!

Ravi disse...

Luiz Alberto:

A sua segunda resposta está na direção certa - em Java, existem três "famílias" de classes par guardar elementos:

Sets;
Maps;
Lists.

Um Set normalmente mantém um item de cada elemento e Sets também são eficientes para métodos como contains entre outros. Esta seria a classe a ser usada.

A resposta para a questão número 1 ainda não é a melhor, mas você viu o problema. Ele nem. O correto seria algo como a implementação da Commons Collections - http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/CollectionUtils.java?view=markup - você ordena a lista e aí compara.

Abraços, Ravi.

Eliane disse...

Pirei agora hahaha
Vc está ficando figurinha difícil né Ravi?! hahahaha
Babá de marmanjo ninguém merece.
Bjcas, Eliane

Luiz Alberto disse...

Olá Ravi,

Ordenar... tinha pensado nisto, mas excluído da ideia devido ao tempo de ordenar duas listas, o que poderia tornar o método mais ineficiente, além de que iria alterar a ordem das listas, o que pode não ser desejável. Caso a ordem não seja importante, aí realmente existem métodos para ordenar lineares, como o quick sort, e o processo de busca poderia ser mais otimizado com duas listas ordenadas, podendo até mesmo iterar nas duas ao mesmo tempo, com condição de parada o fim de uma delas. Acho que realmente seria mais eficiente como falastes. Legal!

Em relação a Set, eu realmente não lembrei dela (faz uns três anos que não implemento nada, aff). Eu utilizei muito ela na graduação só que com SmallTalk para fazer justamente o que o teu problema queria.

Ah, que bom, recordar é viver. Legal mesmo, sinto falta do outro blog, hehe.

Abração, Luiz

Pai dos trigemeos disse...

Cara...
Nada melhor do que trablahar com o que se gosta.
E macaco velho tem que saber dar no em pingo d'agua!
Agora, eu boiei! Sei nada de programacao, acho que eh mais facil filosofar em alemao, mesmo sem falar a lingua...

Anônimo disse...

"...perguntar umas perguntas..."?