Archives for category: desenvolvimento de software

Moro e trabalho em Madrid há quase 1 ano e meio e muitas vezes quando converso com amigos e ex-colegas, me perguntam sobre como é trabalhar por aqui, já que as empresas europeias normalmente oferecem produtos e serviços mais focadas no mercado interno e não são tão conhecidas fora do velho continente.

Aviso de antemão que as opiniões que eu vou mostrar nesse post podem ser incompletas e incorretas, já que são baseadas no ponto de vista míope de alguém que não está aqui há tanto tempo e não conhece tanta gente de outras empresas quanto gostaria.

Vários países da Europa ainda vêm sofrendo com a crise que abalou todo o mundo há alguns anos, esses países são chamados perjorativamente de PIGS (Portugal, Ireland, Italy, Greece e Spain) e essa crise provoca muito desemprego, problemas sociais e políticos mas no meu ponto de vista já não afeta mais o mercado de TI, que está com a demanda sempre crescente, sobrando vagas e faltando profissionais qualificados.

O número de startups que surgem na Europa é bem mais discreto do que nos EUA e acredito que parte disso se deve à força dos direitos trabalhistas que protege muito o trabalhador e dificulta a vida e a dinamicidade necessária para uma startup, que a princípio não pode garantir todos os direitos aos seus empregados. Só como exemplo, a empresa onde trabalho precisou gastar bastante tempo e dinheiro com advogados para conseguir o direito de oferecer stock options para os empregados já que a legislação trabalhista local não está preparada para esse tipo de “bônus” que nas startups normalmente é a principal parte da remuneração dos envolvidos.

Outra coisa que torna a criação de startups mais complicada na Europa é o maior número de restrições que a União Europeia impõe em termos de privacidade e manipulação de dados pessoais na internet. Um exemplo simples disso é que o Facebook mesmo com um grande número de usuários no continente não tem um data center local, pois caso tivesse teria que obedecer a essa legislação, o que não é o caso quando, por exemplo, determina que a idade mínima dos seus usuários é de 13 anos (lei americana) e na Europa a lei diz que a idade mínima deve ser de 14 anos.

Mas nem tudo é mais difícil! Muitas empresas, fundações e projetos importantes para o desenvolvimento da internet e tecnologia em geral são europeus, como Opera (Noruega), Nokia e Linux (Finlândia), Instituto Fraunhofer (criador da MP3) (Alemanha), Skype (criada por suecos mas sediada em Luxemburgo)  sem contar com figuras como Dijkstra (Holanda) e Turing (Inglaterra), etc… e de fato existem startups europeias de sucesso atualmente, sendo a Rovio (Finlândia), criadora do jogo Angry Birds, a que está mais na crista da onda agora e também a sueca Spotify, dona de um serviço de música sob-demanda de muito sucesso na Europa e que chegou há cerca de dois meses aos EUA. Além disso, também existem umas sedes fantásticas do Google (destaco Zurique e Londres) e uma da Mozilla (Paris), fora várias sedes de outras empresas americanas que estão se instalando em Dublin.

Especificamente na Espanha, a Tuenti é a maior empresa da “geração 2.0″, com cerca de 230 empregados, mas existem também outras empresas de sucesso e startups que prometem bastante, e entre elas eu destacaria:

  • Socialpoint - Uma startup de Barcelona que em julho recebeu um investimento de 2.5 milhões de euros e que faz jogos para Facebook, entre eles o mais famoso é o Social Empires.
  • Youzee – Ainda não está com seu serviço aberto ao público, mas basicamente é um servicio de V.O.D. a la Netflix, melhorado, que está sendo desenvolvido principalmente por ex-empregados do Tuenti.
  • Vizzuality – Eu sou fã do trabalho desses caras, é uma empresa pequena de Madrid que trabalha desenvolvendo interfaces bonitas para visualização de dados científicos e recentemente fizeram um projeto com o Google para um infográfico sobre a evolução da Web
  • 11870.com – Um Yelp! a la espanhola
  • idealista – Site de anúncios imobiliários espanhol que tem sede também na Itália e Portugal
  • E obviamente não poderia deixar de falar da Tuenti, que em números gerais de usuários já foi superada pelo Facebook, mas continua sendo a #1 entre os adolescentes e está mais focada nesse nicho de mercado mais jovem, além de que com a aquisição da Telefónica também tem focado muito no mercado mobile oferecendo uma operadora de celular, chamada Tu, para seus usuários com várias vantagens. (que é o projeto em que eu trabalho já a quase um ano)

Salários
Comparar salários entre países é bastante complicado. Custo de vida, imposto de renda e serviços oferecidos “gratuitamente” pelo governo variam muito e normalmente a relação salário/custo de vida nas principais capitais e grandes cidades do mundo são equivalentes, então comparar os números friamente nem sempre te dá uma sensação real de como se vive em determinado local, mas vou citar uma faixa salarial que tenho visto ser tendência por aqui.

Os salários base de Software Engineer em empresas decentes na maioria dos países europeus variam de ~30 mil € anuais para programadores Jr./Associate a cerca de 50 mil € para Sênior (é uma estimativa feita com um pequeno espaço amostral onde, na realidade, certamente há muitos pontos fora da curva). Em alguns países existe uma espécie de décimo-terceiro que seria mais 8% desse valor por fora e em outros casos algumas empresas oferecem pagamentos variáveis de acordo com a performance do empregado que pode render até uns 20% a mais se o cara for um top-performer. Além disso, também existem as stock options que já mencionei e algumas empresas oferecem uma “home leave policy” se te contratam enquanto você mora em outro país e te dão pelo menos uma passagem por ano para ir ao seu país.

Com a crise que está assolando o continente está cada vez mais difícil conseguir visto de trabalho, mas se você pensa em tentar, eu creio que a experiência vale muito a pena!

“/^Sou programador (java|c|php|python|ruby|perl|cobol)$/”

Essa frase é coisa do passado, a moda agora é saber programar pelado independente de linguagem.

Esse “novo conceito” se deve a diversos motivos e o principal deles, na minha opinião, é o fato dos sistemas serem cada dia mais distribuídos e componentizados, permitindo assim que cada um desses componentes use a linguagem que melhor soluciona o problema. Ou seja, não é raro hoje em dia ver numa mesma aplicação: o back-end feito em uma linguagem como Scala, front-end em uma linguagem de script como PHP, Python ou Ruby e um cliente mobile em Objective-C ou Java, tudo conversando entre si usando JSON, Thrift, XML ou whatever.

Além disso, com os conceitos do Agile cada vez mais difundidos, fazendo com que se trabalhe em equipes pequenas e com o código pertencendo a todos, é importante estar preparado para codificar em algo que não seja sua “língua nativa”.

E o que isso significa na prática? Tenho que saber programar em todas as linguagens que possivelmente irei tocar em algum momento da minha vida? Não! Mas é importante ter em mente os principais conceitos, paradigmas e conhecer um pouco algumas das linguagens mais “raízes” que influenciaram as outras.

Um bom programador não é o cara que conhece todos os glitches e detalhes de uma linguagem, mas acima de tudo é como o Mr. Wolf de Pulp Fiction, um cara que resolve problemas:

E quando se fala de programação, para resolver problemas é preciso ter em mente mais coisas do que apenas a linguagem em si; é importante entender bem o seu problema, elaborar uma boa estratégia para atacá-lo e entender como o computador vai agir com essa sua estratégia (i.e.: estruturas de dados necessárias, complexidade do algoritmo, é possível paralelizar? etc) e é aí que o programador poliglota faz a diferença.

O “programador de uma linguagem só”  tem o mindset de alguém que só sabe usar um martelo e vê todos os problemas como pregos, ou seja, vai sempre tentar dar um jeitinho de resolver com a linguagem que já sabe, mesmo que isso implique em uma solução ineficiente, trabalhosa e deselegante. Como por exemplo: Usar PHP em aplicações desktop com PHP-GTK :D

Já um “programador poliglota” que tem a noção de outras linguagens/paradigmas e percebe, por exemplo, que em determinado caso uma linguagem funcional serviria de uma maneira mais eficiente e evitaria todo o overkill de uma linguagem OO, vai poder aprender até sob-demanda alguma linguagem específica que implemente o paradigma e resolver melhor o problema. E a cada nova linguagem que se aprende, se aprende também uma nova forma de pensar.

Fazendo um paralelo tosco, um programador com boa base teórica de programação e paradigmas é como alguém que sabe Latim e vai ter muito mais facilidade de aprender Português, Espanhol, Italiano, Francês, Romeno, etc…

Esse argumento é bem suportado no livro “The Pragmatic Programmer” que prega que um programador deve aprender pelo menos uma linguagem diferente por ano e também no livro “Seven Languages in Seven Weeks“, que apresenta superficialmente sete linguagens usando paradigmas distintos.

Vou terminando esse post com as dicas valiosas do Larry Wall (criador do Perl) sobre quais linguagens todo programador deveria conhecer:

Opa!

Postando rapidamente, só para publicar o link para meus slides apresentados no V Ensol, em João Pessoa agora no mês de Julho, onde falei sobre Software Livre em Aplicações Web de larga escala.

Eles estão disponíveis aqui: http://feliperibeiro.com/slides/ensol2011

E agora em agosto devo dar uma ajeitada no blog e voltar a ativa! Tá prometido.

Cof, Cof… Quanta poeira por aqui, hein?

Estou voltando a postar aqui no blog para dar seguimento ao meme criado pelo @duodraco e que fui “convocado” pelo @brgomes, para descrever meu ambiente de trabalho em 7 itens, então aí vai:

  1. Mac OS X: Desde que comecei a trabalhar com desenvolvimento, nunca gostei do Windows. Usei o Linux por anos até que em 2007 me converti ao mundo Mac e desde então tenho nele tudo que preciso. Um Unix que não me faz trabalhar *para* ele, como eu fazia nos meus tempos de Slackware e Gentoo.
  2. IDEs Eclipse/Netbeans/Vim: Em um mesmo dia de trabalho chego a utilizar esses três ambientes de desenvolvimento em momentos distintos. O Eclipse é o que tenho mais familiaridade e é o que uso normalmente com PHP, o Netbeans, pra mim, é imbatível para JavaScript e um Vim bem configurado, usando CTAGS e tudo mais, para mim é melhor que o TextMate, então uso ele para projetos pessoais que normalmente não são muito grandes e também para editar coisas diretamente no cluster usado como ambiente de desenvolvimento no trabalho.
  3. VCS – SVN/Git/Hg: No trabalho estamos passando por uma migração de SVN para Mercurial (hg) e nos meus pet-projects que sempre faço para colocar em prática algo novo que estou aprendendo (algoritmos/técnicas/tecnologias) tenho usado o Git.
  4. Terminal (shell): Gosto do “poder” que o Terminal dá e ainda faço muitas coisas por ele, como usar o Vim, executar scripts de build/deploy, usar svn/mercurial/git, etc. Tenho ele sempre aberto.
  5. Browsers: Chrome é o meu browser principal, antes era só para uso pessoal mas agora também uso bastante na hora de desenvolver. O Developer tools dele ainda não é tão completo como o Firebug mas já resolve maioria das coisas. Ele também tem a extensão SpeedTracer que me é muito útil. Mas continuo usando o Firefox de vez em quando pelas coisas que sou mais familiarizado no Firebug.
  6. Spotify: Spotify é uma mistura de GrooveShark com Last.fm, é uma rede social onde você escolhe o que quer ouvir e tem os seus amigos com quem você pode criar e compartilhar playlists. É bem bacana, tem uma qualidade de som boa (principalmente se você paga a conta Premium) e lhe dá uma sensação de estar escutando música “legalmente” :) . Passo todo o dia conectado e ouvindo música por ele.
  7. Headphones: Já que se falou em música, não posso deixar de comentar que sou meio maníaco por headphones, estou sempre buscando o som perfeito e atualmente não largo dos meus Bowers & Wilkins P5 que são os headphones com melhor qualidade de som que já vi, superando inclusive os BOSE. O único problema dele é que esquenta bastante as orelhas! :D

E pra terminar, passo adiante esse meme com:

@marcosjr
@yogarine
@italosatiro
@herval

Uma explicação simples dos conceitos utilizados pelo HTML, XHTML e os motivos para o abandono ao padrão XHTML2 e o total foco no HTML5:

Fonte: http://www.smashingmagazine.com/2009/07/29/misunderstanding-markup-xhtml-2-comic-strip/

Mais uma excelente tirinha do Geek and Poke:

6a00d8341d3df553ef011168ca571b970cjpg

Muitas outras estão disponíveis em: http://geekandpoke.typepad.com

A startup que trabalho (shoprizer.com) tem uma equipe formada por Jedis (onde eu sou o Mestre Yoda :-D ), que trabalham com PHP Hardcore e está precisando agora de um NINJA, um programador de interfaces, para trabalho remoto. Os requisitos são:

  • XHTML, CSS, Web standards
  • Javascript/AJAX
  • PHP básico/intermediário – só o necessário para a integração da lógica existente com a interface a ser feita.
  • Smarty
  • Disponibilidade de 20 horas semanais – flexíveis.
  • Inglês básico para leitura e escrita
  • Conhecimento de princípios de Usabilidade
  • Precisa ter o espírito de startup!

Se você está interessado, mande seu CV com links do seu portfolio para van2br@yahoo.com, atenção à Vanessa.

No último fim de semana (18 e 19 de outubro) houve em São Paulo o CONAPHP (www.conaphp.com.br), um evento feito pela comunidade PHP e que rolou dentro do CONISLI na FIAP.

O evento em geral foi bom, com bom nível de palestras mas o público foi um pouco abaixo do que eu esperava.

Para mim, o ponto alto foi quando estava assistindo a palestra do Elton Minetto (slides aqui) e “reconheci” um slide sobre o compilador JIT e o cache do opcode do PHP, um slide que fazia parte da apresentação que fiz em Recife no Encontro Pernambucano de SL, e para confirmar vi lá meu link nas referências, e isso me deixou bastante honrado por ter um material meu usado como referência por um ícone como o Elton.

A minha palestra foi a última e falei sobre PHP RESTful Web Services, por ser a última, o título não ser apelativo para o pessoal mais iniciante e eu ser um ilustre desconhecido da comunidade PHP de São Paulo, tive apenas metade da sala cheia, mas o feedback das pessoas que assitiram a palestra foi bastante positivo e fiquei muito satisfeito.

Os slides da palestra seguem abaixo, e o código apresentado está disponível aqui.

PHP RESTful Web Services

View SlideShare presentation or Upload your own. (tags: php rest)

Quem tiver interesse sobre o assunto, deixo algumas referências:

Recentemente precisei implementar um sistema de correção ortográfica à la Google.

Pesquisei bastante sobre como fazer isso, e encontrei duas maneiras que explicarei agora, mas antes disso explicarei algo que é comum às duas: A criação do dicionário

Para criar o dicionário, você precisa ter uma base de palavras, que idealmente é um arquivo txt.

Você lê o arquivo e cria um array onde as palavras são as chaves e as frequências com que aparecem nos textos serão os valores.

<?php
$text = file_get_contents('arquivo.txt');
preg_match_all("/[a-z]+/",strtolower($text),$matches);
$palavras = $matches[0];
$dicionario = array();
foreach($palavras as $palavra)
	$dicionario[$palavra] += 1;
sort($dicionario); /* Essa ordenação será útil para otimização de performance
                               no primeiro algoritmo */
file_put_contents('dicionario_serializado.dat',serialize($dicionario));
?>

1 – Algoritmo de Levenshtein

PHP implementa nativamente o algoritmo de Levenshtein (http://php.net/levenshtein), que calcula a distância de edição entre duas palavras, funcionando da seguinte forma:

  • suponha que eu tenha duas palavras: água e mágua – A distância de edição delas é de uma inserção de carácter
  • suponha que eu tenha as palavras: casa e caixa – A distância delas é de uma substituição (s por i) e uma inserção (x)
  • suponha que eu tenha as palavras: arrocho e arroto – A distância delas é de uma substituição e uma remoção.

A função levenshtein também permite que você dê pesos diferenciados para inserção/remoção/substituição, sendo que o valor default é 1 para todas operações. Usando essa função, fica simples implementar um corretor, supondo que você tem um dicionário que já citei, você só precisa fazer:

<?php
function voce_quis_dizer($palavra_procurada) {
	$dicionario = unserialize(file_get_contents(‘dicionario_serializado.dat’));
	$minima_distancia = -1;
	$palavra_procurada = strtolower($palavra_procurada);
	foreach($dicionario as $palavra_do_dicionario) {
		if($palavra_procurada == $palavra_do_dicionario) return $palavra;
		$distancia = levenshtein($palavra_procurada,$palavra_do_dicionario);
		if($distancia < $minima_distancia || $minima_distancia == -1) {
			$minima_distancia = $distancia;
			$sugestao = $palavra_do_dicionario;
		}
	}
return $sugestao;
}
?>

Análise de desempenho:

Considerando que temos k palavras no dicionário, a palavra que desejamos procurar tem m letras e cada palavra do dicionário tem em média n letras, o algoritmo de Levenshtein tem ordem de complexidade O(m*n) onde para k comparações (no caso da palavra não existir no dicionário, já que se ela existir não teremos nenhuma comparação) teremos O(k*m*n) (k*m*n operações onde k é muito maior que m e n).

2 - Algoritmo de Peter Norvig

Toda explicação probabilística desse algorítmo está presente no site do Norvig, um cara renomado na área de inteligência artificial: http://norvig.com/spell-correct.html. Mas basicamente esse algoritmo apesar de mais complicado é bem mais inteligente que o primeiro. O que ele faz é o seguinte: gera perturbações na sua palavra procurada e vê quais dessas perturbações é a mais relevante no dicionário. Evitando comparações desnecessárias, já que no primeiro algoritmo cada palavra que você colocar será comparada com todas as outras (por exemplo: se você digitar BOLA, e ela não existir no dicionário ela será comparada com palavras absurdas como: LIVRO, que obviamente não é o que você quis dizer).

Apesar do conceito do Norvig ser simples, o código é um pouquinho complicado. Então eu criei uma classe que implementa ele e disponibilizei sob Licença BSD no PHPClasses.org (http://www.phpclasses.org/browse/file/24605.html) e tenho recebido elogios e feedback muito positivo de quem está usando.

Análise de desempenho:

Considerando 26 letras do alfabeto (depois da reforma da língua portuguesa, agora também temos 26 letras! :D ) e considerando que sua palavra tem m letras, teremos mais ou menos 26*m iterações para gerar as possíveis perturbações na palavra (inserções, remoções e substituições possíveis), e para garantir um segundo nível de perturbações teremos aproximadamente 26*m para cada perturbação gerada, que dá um total de aproximadamente (26*m)*(26*m) = 676 m². Agora só precisamos consultar cada uma das perturbações para vermos qual a mais relevante no dicionário. Cada consulta no dicionário é O(1) então desprezaremos na análise de performance.

E podemos considerar esse algoritmo como sendo mais eficiente do que o primeiro pois o tempo de execução cresce de acordo com o quadrado do tamanho da palavra (que normalmente é bem menor do que o tamanho do dicionário). Enquanto o primeiro sofre interferência do tamanho do dicionário e do tamanho médio das palavras contidas lá, então esse é bem mais inteligente e eficiente.

Espero ter ajudado!