Mining the Social Web, by Matthew A. Russell
This book covers a lot of ground. It's, at times, a bit vertiginous in the amount of subjects and technologies it touches per chapter, and is not always easy to follow. It can also introduce so many interesting things that, by the time you finished becoming familiar with all of them, after wandering for hours on the web, jumping from interesting technology to interesting technology, you may have forgotten what took you to these places and wonder where you were in the book. Time spent reading it is, however, time very well spent. When you finish it, you will have at least a cursory familiarity with tools like OAuth, CouchDB, Redis, MapReduce, NumPy (and the Python programming language, albeit it will help you a lot if you know your way around Python before you start the book), Graphviz, SIMILE widgets, NLTK, various service APIs and data formats, and will be well equipped to explore those rich datasets on your own. The chapters are well compartmentalized and it's easy to pick chapters to read according to your needs. I know that, when I face the problems they tackle, I will do exactly that.
If you do any kind of analysis and visualization of social-generated data that's on the web, this book is a good pick. Even if your datasets are not from the web, you may find the parts on analysis and visualization very interesting.
You can find this book at the O'Reilly website or on Amazon.
Disclosure: I reviewed this book for the O'Reilly Blogger Review Program. If you have a blog and love to read, you should take a look into it. It's fun.
A "provinha" do Google Developer Day
Algumas pessoas acharam estranho o processo de inscrição para o Google Developer Day. Nas edições anteriores, você preenchia um formulário, contava o que você fazia e onde trabalhava e ficava nisso. Os primeiros a se inscreverem iriam ao evento e pronto. Os menos atentos ganhavam a lista de espera. Agora, além do formulário, você tem que mandar um currículo e resolver alguns problemas que exigem familiaridade com alguma ferramenta de programação.
Não sei se foi essa a intenção da Google, mas, com esse processo de inscrição, eles têm seus dados de contato, seu currículo e sua avaliação em uma prova.
Mas não se anime. Essa prova não deve ser a que o RH do Google usa. Eu, pessoalmente, acredito que ela apenas existe para separar quem vai entender alguma coisa do GDD de quem não vai entender nada e evitar, com isso, que gente que poderia melhor aproveitar o evento fique de fora.
Agora que as inscrições foram fechadas e o prazo para a entrega das provas terminou, eu me sinto à vontade para publicar esse post.
A prova
A prova tem 5 questões, um pouco diferentes para cada candidato. Eu não sei se foi honesto, mas eu resolvi as minhas com uma janela e um interpretador Python do lado. E eu vou fazer o mesmo aqui.
O que esse programa faz?
x = 7 y = 4 if y > 2, then y = y * 2 else x = x * 2 print (x + y)
Esse é facil. Na janela do ipython:
In [1]: x = 7 In [2]: y = 4 In [3]: if y > 2: ...: y = y * 2 ...: else: ...: x = x * 2 ...: ...: In [4]: x + y Out[4]: 15
Quantas vezes esse programa imprime "hello"?
Uma observação: os loops incluem as extremidades.
for i = 1 to 5 if i != 2, then for j = 1 to 9 print 'hello'
De novo, com o mesmo truque (só que em Python, o range não inclui a extremidade maior):
In [1]: for i in range(1, 6): ...: if i != 2: ...: for j in range(1, 10): ...: print 'hello' ...: ...: hello hello hello hello ...
Erm... Chato assim. Vamos tentar de outro jeito
In [1]: linha = 1 In [2]: for i in range(1, 6): ...: if i != 2: ...: for j in range(1, 10): ...: print linha, 'hello' ...: linha += 1 ...: ...: 1 hello 2 hello 3 hello 4 hello (...) 36 hello
Agora sim. Mesmo sem o computador, de olhar dá pra sacar que o primeiro loop roda 5 vezes e o segundo, 9. Como a condição que pula o segundo loop pula uma iteração (nem todos os testes fazem isso), o programa imprime 4 x 9 hello's.
Quais números, entre 5 e 2675 são pares e divisíveis por 3?
O exercício diz que eu posso escrever um programa para isso. Deve ser pra acomodar o pessoal que não vive sem um compilador.
In [1]: len([ n for n in range(5, 2676) if n % 2 == 0 and n % 3 == 0 ]) Out[1]: 445
Mas isso foi porco. Quem estava acordado no ginásio vai lembrar que se um número é par (divisível por 2 - essa é do primário) e divisível por 3, ele é divisível por 6. Assim, podemos simplificar nossa solução:
In [2]: len([ n for n in range(5, 2676) if n % 6 == 0 ]) Out[2]: 445
Podemos respirar aliviados agora que vimos que o resultado continua o mesmo.
Números bonitos
A pergunta nos apresenta Barbara e seus critérios para que números sejam ou não bonitos. Para ela, números são bonitos se contiverem um dígito 4 e não contiverem um dígito 9. Ao final, nos pergunta quais números entre 14063 and 24779, inclusive, são bonitos.
Para saber quantos são bonitos, podemos começar com uma função:
In [1]: def bonito(x): ...: return '4' in str(x) and '9' not in str(x) ...:
E podemos testá-la, para ver se fizemos tudo direito:
In [2]: bonito(4) Out[2]: True In [3]: bonito(9) Out[3]: False In [4]: bonito(49) Out[4]: False In [5]: bonito(1491) Out[5]: False
Daí, basta aplicá-la usando a mesma técnica que usamos no problema anterior:
In [6]: len([ n for n in range(14063, 24780) if bonito(n) ]) Out[6]: 3047
Se você preferir, pode fazer tudo em uma linha:
In [7]: len([ n for n in range(14063, 24780) if '4' in str(n) and '9' not in str(n) ]) Out[7]: 3047
Ou, ainda:
In [8]: len(filter( lambda x: '4' in str(x) and '9' not in str(x), range(14063, 24780))) Out[8]: 3047
Os telefones
A última pergunta nos apresenta um país em que os números de telefone têm 6 dígitos. Números não podem ter dois dígitos consecutivos idênticos, porque isso é caído. A soma dos dígitos tem que ser par, porque isso é legal e o último dígito não pode ser igual ao primeiro, porque isso dá azar.
Vamos começar com os caídos
In [1]: def caido(x): ...: for i in range(0, len(str(x))): ...: if str(x)[i] == str(x)[i - 1]: ...: return True ...: return False ...:
Agora vamos para os legais
In [2]: def legal(x): ...: return sum([ int(n) for n in str(x) ]) % 2 == 0 ...:
E, se olharmos a função "caido", vamos ver que ela considera caídos os números que dão azar.
In [3]: caido(123451) Out[3]: True
Assim, basta usarmos duas no nosso critério:
In [4]: len([ n for n in range(100000, 1000000) if not caido(n) and legal(n) ]) Out[4]: 238500
Mas o exercício não perguntou quantos caídos entre 100000 e 999999. Eles nos deu uma lista. Com um pouco de mágica de clipboard, colocamos os números em uma string, que quebramos e fazemos uma lista:
In [5]: tudo = '''214966 ...: 215739 ...: 220686 ...: 225051 ...: 225123 ...: 226810 ...: 228256 (...) ...: 720576 ...: ''' In [6]: tudo Out[6]: '214966\n215739\n220686\n225051\n225123\n...720202\n720568\n720576\n'
Opa! Tem um '\n' no final do qual precisamos nos livrar
In [7]: numeros = tudo.split('\n')[:-1] In [8]: len(numeros) Out[8]: 200
Então, usamos a lista e chegamos no resultado:
In [9]: len([ n for n in numeros if not caido(n) and legal(n) ]) Out[9]: 61
61 de 200 parece razoável.
Motivo para pânico?
Não desanime se seus números forem muito diferentes dos meus. Os enunciados variam de teste para teste. Além disso, até agora eu não recebi confirmação da minha inscrição. Isso pode indicar que eu errei tudo.
Boa sorte!
Resultados da Pequena Pesquisa
Alguns dias atrás, depois de um post relativamente grosseiro que eu fiz, eu me propus a conduzir uma pequena pesquisa para responder algumas perguntas:
- Programadores inexperientes realmente tem uma tendência a escolher Java como linguagem de implementação?
- Programadores tendem mesmo a rejeitar o BASIC (Visual Basic, VBScript, VB.Net etc)?
- Quais programadores rejeitam o que? Há algum padrão reconhecível por experiência ou escolha de linguagem?
Hoje, depois de minhas merecidas férias e de mais ou menos 300 respostas, eu acho que posso começar a comentar sobre alguns resultados interessantes.
Sobre a pesquisa
Como o formulário diz, a pesquisa é metodologicamente falha - de um questionário incompleto, potencialmente inconsistente a uma amostra viciada - e uma causa perdida do ponto de vista científico. Não tenho intenção alguma de traçar o perfil definitivo dos programadores lusófonos. Minha intenção era apenas lançar alguma luz sobre as questões que eu enumerei há pouco e confirmar ou refutar meu mal-criado post.
Um dia, talvez, eu faça algo sério. Hoje não.
De longe, o problema mais chato de ajuste dos dados foi a amostra viciada: minhas preferências de listas de discussão impactaram significativamente as respostas. Previsivelmente, muita gente da comunidade de usuários de Python respondeu, desviando todas as leituras. Para chegar a dados mais significativos, em alguns casos eu precisei reduzir o peso das respostas em que Python é a primeira escolha para refletir melhor a realidade. Vários dos números que eu vou apresentar a seguir refletem esses ajustes.
Java e os inexperientes
Java foi a linguagem de escolha de 19% dos novatos (com experiência de até 3 anos), praticamente empatada com C# (17%). Ambas ficaram atrás de PHP que é a escolha de 33% dos inexperientes.
O fato de Java e C# serem relativamente populares entre os novatos pode ser atribuído a vários fatores: das oportunidades de emprego aos excelentes IDEs disponíveis (sim, Visual Studio é um ótimo IDE, mas apenas se você nunca for desenvolver nada para qualquer outra plataforma que não Windows).
A parte importante é que meu mal-criado post está errado: os inexperientes preferem PHP.
Quanta gente odeia o BASIC?
Essa não foi surpresa. Falando friamente, VB (que é o único dialeto sobrevivente de BASIC) é uma porcaria. Foi legal nos baixos anos 90, principalmente porque permitia escrever programas para Windows quando a única alternativa seria o Microsoft C ou a família Turbo Pascal e seus descendentes. Linguagens de terceiros para Windows sempre deixavam "cicatrizes" de interface e isso sempre me incomodou - é parecido com o efeito de se usar AWT em programas Java: eles simplesmente não parecem "certos" em nenhuma plataforma.
De qualquer modo, metade dos respondentes declararam que não usariam BASIC (o que inclui VB.net e VBScript) por nada nesse mundo. Eu acho isso um progresso significativo que enche meu coração de esperança.
O que os programadores mais detestam?
Essa é, no fundo, a pergunta mais interessante. Para respondê-la, precisamos separar nossos programadores em categorias. Para isso vou usar dois critérios: linguagem de escolha e tempo de janela.
Entre os novatos, a linguagem mais detestada continua sendo o BASIC (e seus descendentes). Surpreendentemente, o segundo lugar nessa categoria é o Java. Aparentemente os novatos que não gostam de Java têm opiniões fortes a respeito da linguagem.
Entre os veteranos, com 10 ou mais anos de experiência, o BASIC é o mais detestado. O segundo lugar é do Perl (o que me surpreende um pouco), seguido de Java e C# bem de perto.
Entre os 3 que preferiram BASIC, a linguagem mais detestada por dois deles é o próprio BASIC. Eu imagino que esses dois ou não entenderam o formulário ou não quiseram colaborar. O outro dos três respondentes que preferem BASIC, escolheu quase todas as outras linguagens como as que ele nunca jamais usaria. Como eu o conheço de muito longa data (ele preencheu o nome), eu acredito que ele conheça a lista toda. Ou que tenha me pregado uma peça.
Entre os PHPistas, BASIC é, de novo, a linguagem mais detestada. Interessantemente, o segundo e terceiro lugares pertencem a Erlang e Lisp, respectivamente. Eu achei esse resultado confuso - nunca vi um PHPista que conhecesse qualquer uma dessas duas linguagens o suficiente para detestá-la. Java também é bastante detestado entre os PHPistas, mas não sei se posso levar muito a sério esses resultados considerando a posição do Erlang e do Lisp. Vai entender...
Os Javistas detestam BASIC acima de todas as outras linguagens, mas, em seguida, detestam Smalltalk, Perl e C# igualmente. Interessante, porque pouquíssimas pessoas usam ou usaram Smalltalk (que eu considero uma das linguagens mais interessantes que existem por aí). Eu brinco que o Smalltalk/80 faz o Java/2009 parecer primitivo. E no fundo parece mesmo.
Os amantes do C# também detestam BASIC, o que pode surpreender, uma vez que BASIC é uma linguagem importante no portfolio de linguagens da Microsoft e que Windows é o único ambiente em que C# faz algum sentido. Ainda assim, os C#-istas detestam BASIC com menos energia do que os demais. Em termos de linguagens detestadas, aliás, eles são os que menos detestam.
A turma do Ruby é interessante: detesta BASIC como todo mundo, mas não polariza sua seletividade em nenhuma outra linguagem. Eles detestam muitas linguagens (praticamente todas estão representadas), mas parecem detestá-las igualmente.
Finalmente, o pessoal do Python, que ficou um pouco super-representado nessa pesquisa por conta das listas em que ela foi divulgada, detesta BASIC, como todo mundo, mas detesta Java mais do que qualquer outro grupo - um pouco mais até do que detestam BASIC - coisa única nessa pesquisa. Depois de Java e BASIC, detestam Perl. C# e PHP ficam com distantes quarto e quinto lugares.
O que quer dizer tudo isso?
Muito pouco.
A natureza falha dessa pesquisa não nos deixa tirar conclusões e ter falsas ilusões a respeito de sua validade, mas pode nos apontar em direções interessantes e para outras pesquisas mais elaboradas. Seria interessante saber que outras linguagens os programadores conhecem. Seria bom também relacionar isso com para que plataforma eles desenvolvem. Seria bom também ter mais amostras, mesmo como está - para isso ela vai continuar disponível para preenchimento aqui. Quem quiser respondê-la, sinta-se à vontade.
A pesquisa, assim como está, é um retrato divertido de se olhar e, quanto muito, material para discussões nos botecos próximos aos nossos escritórios. Mas nada muito mais sério do que isso.
E, claro, eu estaria mentindo se dissesse que eu não me diverti muito com ela.
O que, no fim, é o que conta.
Pelo menos pra mim.
Nota: Você encontra esse artigo (com um título melhor, feito por um jornalista de verdade) lá no Webinsider. Lá você também vai encontrar os comentários dos leitores de lá, que são muito mais numerosos que os daqui.
Gente Interessante
Os desajustados e revolucionários felizes e produtivos que dão o colorido ao ecossistema do software livre