O caso do MapReduce ruim

Limpei o suor da minha testa com a pilha de guardanapos de delicatessen que sobrou de comer na frente do meu terminal. A companhia de energia cortou a eletricidade há duas semanas devido ao não pagamento, deixando-me sem A / C bem no meio de uma onda de calor. As coisas estavam lentas para um detetive de código como eu; Eu até comecei a rastrear os anúncios de jornais locais para *shudder*caixas de wordpress.

Então, uma batida na minha porta. Espiei pelo vidro fosco tentando ver se era um cliente ou um cobrador. Mas ela abriu a porta rápido demais para eu chegar a uma conclusão.

Entrou a dama mais linda que eu já vi. Este não era um cobrador; Eu poderia dizer por seus dedos bem tonificados e mão macia que ela passou a vida toda na linha de frente. Seus olhos brilhantes e curiosos me examinaram por trás dos óculos grossos; os óculos são, sem dúvida, o resultado de muitos fins de semana vasculhando o FreeBSD.

“Como posso ajudá-lo?” Eu perguntei enquanto a avaliava quanto eu poderia cobrar. Enquanto meu cérebro reptiliano pensava em um relacionamento – textos de flerte acidentalmente terminavam :wqdevido à memória muscular vitalizada, debates acalorados sobre as diferenças entre o replicador da Federação e a tecnologia de transporte – meu cérebro de negócios começou a medi-la para quanto eu poderia carregar. Com calor ou não, eu ainda não tinha A / C.

“Estou tendo problemas com Backbone.fetch (). Venho da terra da programação do kernel, então não estou muito familiarizado com essas coisas da web, e é por isso que vim até você.” ela disse.

Eu já havia lidado com Backbone.fetch () antes. Um método frequentemente mal compreendido e abusado, meu arquivo de caso em Backbone.fetch () tinha alguns centímetros de espessura.

“Você pode me contar mais?” Eu perguntei. Tentando assumir uma atitude fria e indiferente, recostei-me na cadeira do escritório.

“Bem, Backbone.fetch () nem sempre aciona o evento ‘reset’. Estou buscando uma coleção”

Droga, este seria um caso simples. Meus sonhos de alto faturamento se dissiparam. Eu sugeri que anexássemos alguma depuração à instância da coleção:

@DameCollection.fetch(
success
: (xhr, textStatus) ->
console
.log(textStatus)
error
: (m, r) ->
console
.log('error')
console
.log(r.responseText)

“Uau, isso é útil! Obrigado, Detetive GeeTotes!” ela disse, exibindo um sorriso vencedor.

Ela clicou em atualizar no navegador, e responseTexthavia um monte de JSON.

“Isso é estranho” eu disse, dando uma olhada rápida no JSON. “Parece-me bem formado. Mas vamos verificar novamente”.

Quando copiei e colei o JSON do depurador do Chrome em http://jsonlint.com/ , não pude deixar de notar que ela não estava executando um gerenciador de janelas tradicional. Ela era um bebê xmonad.

JsonLint retornou um erro … havia um NaNno JSON. Eu apontei para a tela.

“Bem, aí está o seu problema. Json inválido, então successnunca dispara e nem dispara reset“.

NaN? Mas estou verificando isso no meu MapReduce – estou usando o MapReduce para gerar o JSON para o Backbone.”

Pedi para ver o MapReduce. Agora que o MapReduce estava envolvido, esse poderia ser um bug particularmente delicado. MapReduce é sempre difícil de depurar, especialmente quando você está lidando com milhares de registros.

Ela abriu o mapa reduzido e me mostrou um trecho.

var averageScore = Math.ceil(score / totalScore);

“Ahh” eu disse, apontando para a tela. “Aí está o seu problema. $ 20 dólares dizem que em algum lugar durante o MapReduce há uma divisão por 0”.

Ela bateu na testa. “Claro! Como eu verificaria NaN?”

Eu disse a ela sobre a exclusividade do NaNjavascript e como ele não avalia como verdadeiro ou falso nas declarações de controle. Em seguida, mostrei a ela o método embutido de javascript.isNaN()

var averageScore = Math.ceil(score / totalScore);
if(isNaN(averageScore))
averageScore
= 0;

Depois disso, o MapReduce funcionou perfeitamente.

“Detetive GeeTotes, você é incrível!”

“Obrigado.” Eu sorri timidamente, não querendo estragar este momento falando sobre minha conta. Então, pensando em seu gerenciador de janelas:

“Então, hum, você gosta de Haskell?”

O FIM