sexta-feira, 17 de julho de 2015

Bananistão: como criar uma nação de escravos




Quando se fala em escravos logo lembramos de filmes épicos sobre o antigo Egito. Pessoas obrigadas a trabalhar, sem quaisquer direitos. Mas afinal, existiam tarefas a serem cumpridas. E nada melhor do que ter indivíduos obrigados executá-las.

Mas a humanidade evoluiu, sendo o escravagismo abolido na maioria do mundo. Contudo, ainda existem tarefas, então como ter de volta o trabalho escravo para? Como construir uma nação fictícia, que dou o nome de Bananistão aqui, de pessoas obrigadas a trabalhar?

O primeiro passo é fornecer educação de má qualidade. Não apenas para ter massa de manobra, mas principalmente para a população não ter muito conhecimento nem interesse em matemática.

Assim, um assunto simples, como Progressão Geométrica, é decorado mas não compreendido. Baseado nele é feito o esquema de pirâmide. Ou mais próximo do dia-a-dia, os juros. O conceito é tão simples que uma fórmula é facilmente escrita, como na planilha que construí abaixo:





Nela eu considerei uma taxa de 8% ao mês. vc pode alterar o número de parcelas para conferir o valor final de um produto e quanto sairia de juros. E essa taxa está até muito conservadora comparada a aplicada no mercado de cartão de crédito.

Dessa forma, se você conseguir empurrar pessoas para uma dívida dessa elas irão  trabalhar apenas para se sustentarem e manter essa dívida. Contudo, como convencer alguém a entrar nessa loucura?

Então chegamos no segundo passo. Implante na cabeça das pessoas que elas precisam de tudo via publicidade massiva. Mais ainda, torne esses produtos descartáveis: celulares mais avançados, roupas da moda, jóias. Sempre tem algo novo e melhor. Depois criamos sistemas de financiamento a juros 0, sem precisar de aprovação.

Como terceiro passo, convencemos as pessoas que a vida não é caótica. Que imprevistos não acontecem, que empregos são seguros. Acreditando, elas entram no parcelamento, sem perceber que estão vendendo o bem mais precioso que existe: o tempo. Sim, elas estão negociando agora o tempo que precisrão trabalhar para pagar essa dívida no futuro.

Juntando esses ingredientes com a Lei de Murphy, fatalmente boa parte dessa população estará endividada, ou melhor dizendo, escravizada. Mas por que não se rebelam?

Aqui vem o quarto passo. Crie um código de honra sobre pagamento de dívidas. Ensine desde criança que é feio ficar devendo. Cria um slogan, de uma nome bacana, como "nome limpo".

A grande verdade é que o Bananistão quer esconder a verdade, deturpar a realidade. Para que serve um nome? Ele não serve para nada, além de ficar sujo. Ele serve para dar a falsa ilusão de que o cidadão é parte fraca do negócio, quando não é.

Até que uma instituição financeira libere o recurso, ela possui todos os poderes. Após liberar, o devedor é que dita as regras. Sabendo de tudo isso, como se livrar da escravidão?

A primeira e melhor forma é simples: não tenha cartão de crédito, não faça financiamento. Assim vc só compra o que puder, só com o trabalho que já foi feito, e não vendendo tempo de trabalho futuro. Um outro bom efeito colateral é que você passa a ver o real valor das coisas. Agora um celular custa R$ 2.000 e não uma parcelinha de R$ 80.

A segunda maneira, pior, é se vc já entrou nessa. Nesse caso, haja como a parte forte da negociação. Não se limite ao que os ditos "especialistas" financeiros dizem, hackeie o sistema. Experimente não dar atenção as cobranças, a não ligar para seu nome sujo. Junte o dinheiro para pagar a dívida sem acrescentar nenhum juros. Deixe passar 4 anos sem pagar nada e experimente fazer uma proposta de pagamento sem juros, veja o que acontece. Acha que é difícil, então veja esse vídeo onde um devedor atua como parte forte e se divirta:





A verdade é que financiamento é negócio. Não é igual pedir  dinheiro emprestado a parente ou amigo, não tem honra nenhuma envolvida. O que um operador financeiro faz é gerenciar risco, cobrar juros e taxas já colocando na conta aqueles que não pagarão, mitigando essas perdas nas costas de quem vive no cabresto do sistema.

No fim, o princípio das duas soluções é a mesma, e todo mundo conhece desde criança. Só existem duas maneiras de não perder um jogo contra um jogador mais experiente:

  1. Não jogar
  2. Jogar, mas seguindo suas regras, não aos do oponente. Quem nunca roubou dinheiro no jogo banco imobiliário? ;)

Mas e aí, achou o Bananistão parecido com algum país? Será que você conhece algum escravo? Será que você tem solução ainda melhor? Deixe seus comentários ;)

Abs,

quinta-feira, 12 de março de 2015

Como evitar discussões inúteis?

Há 5 anos eu era troll de lista de discussão por e-mail. Percebi então que eu perdia um tempo precioso com isso e que não obtinha nada de positivo. Pelo contrário, acabava fazendo inimizades.

Por conta disso, passei a me policiar. Meu primeiro algorítimo para evitar o problema foi o seguinte: toda vez que eu terminava um e-mail ou mensagem, antes de clickar em “enviar” eu me perguntava: “Alguém, inclusive eu, tem algo a ganhar com o que estou escrevendo?”. Quando a resposta era não, eu simplesmente apagava o e-mail. Eu diria que apenas com isso deixei de ser um troll, passei a enviar 90% menos e-mail e raras vezes entrei em discussão.

Exemplo do algorítimo: certa vez estavam reclamando do Brasil, dizendo que no exterior era muito melhor. Entrei na discussão: Ou você mudava para onde era melhor, ou ficava no Brasil entendendo que as coisas eram diferentes, deixando de reclamar em ambos casos, pois odeio choradeira de quem não toma ação para mudar a situação. Teve gente que concordou e ponderou sobre o assunto. Ou seja, realmente ajudei alguém com a opinião. Mas houve gente que disse que eu estava errado, que era direito reclamar, desabafar e protestar. Comecei a escrever a resposta, ressaltando a inutilidade do “mimimi”. Ao final me fiz as perguntas. Conclui que ninguém ganharia nada. O cidadão que queria desabafar no e-mail apenas ia ficar mais puto consigo e comigo. Quem tinha já concordado e ponderado sobre o que disse não se influenciaria com a opinião em contrário. Resultado: mais um e-mail inútil que não enviei.

Voltando à reflexão, o processo de escrita de e-mail de resposta em si era importante. Era o tempo necessário para eu destilar o “ódio” adquirido durante a leitura da discussão. Porém, isso tomava tempo. Então melhorei o algorítimo. Após ler a discussão e ficar com raiva, eu me perguntava: “Por que estou com raiva disso? No que isso afeta minha vida? A raiva existe apenas por que a opinião é diferente da minha?”. Então quando chegava à conclusão que aquilo na afetaria minha vida ou, principalmente, minha raiva advinha apenas de minha prepotência de achar sempre estar certo e o outro errado, simplesmente a raiva ia embora e sequer um e-mail de resposta eu escrevia. Conclui que se todo mundo pensasse igual, o mundo seria muito chato. Entrei assim no modo Zen, onde deixei de entrar em na maioria de discussões que não levam a nada e passei a realmente a tentar entender pontos de vista diferentes dos meus. A leitura do livro “Como fazer amigos e influenciar pessoas” também me ajudou muito nesse quesito.

Exemplo do novo algorítimo: há certo tempo um cidadão postou uma piada taxada de machista no grupo de Python do Facebook. Houve discussão acalourada, com um lado defendendo o banimento do membro e o outro defendendo liberdade de expressão, julgando a piada domo não sendo machista. Li a discussão. Cada lado já tinha esgotado os argumentos, não havia nada a acrescentar. Ninguém estava preocupado em entender outro lado, apenas querendo provar que sua opinião era a correta. Então se eu emitisse a minha, seria apenas mais um entrando na torcida e, talvez, me indispondo com o pessoal. E tem pessoas que gosto de ambos lados. Então não participei da discussão e preferi focar no que cada um dos envolvidos tem de bom. Em vez de discutir o sexo dos anjos, fui gravar uma vídeo aula para meu canal. Em um minuto esqueci a discussão e fiquei muito mais feliz, pois considerei ser muito mais útil ajudar as pessoas uma aula que ser apenas mais um torcedor. Obs: não estou julgando quem entrou na discussão. Cada um é livre para ser feliz da maneira que julgar mais adequada ;).

Por fim, existia apenas um problema no algorítimo: como definir qual discussão vale à pena entrar? Em qual discussão posso ajudar alguém com minha participação? Encontrei a resposta a reposta no livro “A Arte de Estar Sempre Certo” do Schopenhauer.

Em sua introdução consta, com minha tradução livre: “Em um mundo ideal a discussão e debate deveria almejar a verdade ou ao menos o entendimento mútuo, um acordo. Em tal mundo o desejo de cada pessoa bem intencionada seria identificar os objetivos que valem à pena e os melhores meios de atingi-los, onde as pessoas se esforçariam para resolver os problemas através da cooperação, superando desentendimentos e conflitos.

Mas o mundo é tudo menos ideal, e as pessoas buscam não a verdade, mas ganhar argumentos; elas não buscam o melhor para todos, mas somente o melhor para elas mesmas. Para a grande maioria das pessoas o interesse pessoal é mais forte motivador que altruísmo e, como resultado, elas buscam quaisquer meios para colocar seu nariz à frente na corrida de competição que é a vida”.

No transcorrer do livro, o autor passa então e descrever 38 falácias lógicas que as pessoas usam para ganhar argumentos. Ele alerta que o objetivo não é você usar para influenciar os outros, mas sim para se livrar deles em uma discussão. Mas do que isso, para você poder distinguir os discursos que buscam a verdade daqueles dos quais não vale à pena participar. Leia o livro e assista um debate político. Será extremamente engraçado vê-los utilizando todos os estratagemas, dos mais simples aos mais rebuscados...rs

Dessa maneira, venho aprendendo a identificar discussões infrutíferas e, ao fazer isso, utilizar o ensinamento do Dalai Lama: “É muito difícil argumentar contra o silêncio”.

E você, o que acha do assunto? Será que vou ajudar alguém? Essa é minha intenção. Mas se ele gerar discussão inútil, tenha certeza que não participarei ;)

Grande abraço.

segunda-feira, 2 de fevereiro de 2015

Injeção de Dependência em Java e Python


Aprendi Orientação a Objetos em Java. Inicialmente me foi ensinado a utilizar o construtor para inicializar todas dependências que o objeto necessita para funcionar.
Sendo assim, o código da classe Sorteador é perfeitamente válido:

package di;

public class Sorteador {
    private long limite;

    public Sorteador(long limite) {
        this.limite = limite;
    }
    
    public long sortear(){
        double numero = Math.random()*this.limite;
        return Math.round(numero);
    }

}
Contudo, o problema dessa abordagem consiste na dificuldade de testar o método sortear. Como ele depende de um número aleatório, o máximo que se consegue é verificar se o sorteio se encontra dentro dos limites esperados, conforme código SorteadorTest:

package di;

import static org.junit.Assert.*;

import org.junit.Test;

public class SorteadorTest {

    @Test
    public void testSortear() {
        Sorteador sorteador=new Sorteador(10);
        long sorteio=sorteador.sortear();
        assertTrue(sorteio>=0);
        assertTrue(sorteio<=10);
    }

}
Para contornar o problema, poderíamos componentizar com a finalidade de alterar o comportamento no momento de teste. Com esse objetivo, criei a interface Randomizador:

package di2;

public interface Randomizador {
    double random();

}
Para continuar executando o comportamento original, criei a classe RandomizadorReal:

package di2;

public class RandomizadorReal implements Randomizador {

    @Override
    public double random() {
        return Math.random();
    }

}
Dessa maneira alterei o código do Sorteador . Com essa nova abordagem é possível alterar o componente de randomização utilizando o construtor sobrecarregado. Nessa caso, a dependência do objeto é injetada de fora para dentro. Por isso esse conceito é chamado de “Inversão de Controle” ou também “Injeção de Dependência”:

package di2;

public class Sorteador {
    private long limite;
    private Randomizador randomizador;

    public Sorteador(long limite, Randomizador randomizador) {
        super();
        this.limite = limite;
        this.randomizador = randomizador;
    }

    public Sorteador(long limite) {
        this(limite, new RandomizadorReal());
    }
    
    public long sortear(){
        double numero = randomizador.random()*this.limite;
        return Math.round(numero);
    }

}
Com o código modificado é possível escrever um teste com mais controle. Para isso, basta trocar o componente RandomizadorReal pela classe RandomizadorMock, conforme código a seguir:

package di2;

import static org.junit.Assert.*;
import org.junit.Test;

class RandomizadorMock implements Randomizador{
    public double retorno=0;
    @Override
    public double random() {
        return retorno;
    }
    
}

public class SorteadorTest {

    @Test
    public void testSortear() {
        RandomizadorMock mock=new RandomizadorMock();
        Sorteador sorteador=new Sorteador(10, mock);
        mock.retorno=0;
        long sorteio=sorteador.sortear();
        assertEquals(0, sorteio);
        mock.retorno=0.5;
        sorteio=sorteador.sortear();
        assertEquals(5, sorteio);
        mock.retorno=0.54;
        sorteio=sorteador.sortear();
        assertEquals(5, sorteio);
        mock.retorno=0.56;
        sorteio=sorteador.sortear();
        assertEquals(6, sorteio);
        
    }

}
Esses objetos que se utilizamos para substituir componentes na hora de testes costumam ser chamados de Stub ou Mock. Foi com esses conceitos em mente que migrei para a linguagem Python.

Nela posso escrever classe similar a primeira versão de Sorteador:

from random import random


class Sorteador():
    def __init__(self, limite):
        self.limite = limite

    def sortear(self):
        return round(self.limite * random())
Poderia empregar a mesma técnica para componentizar o método sorteio. Contudo, Python tem uma particularidade interessante: tudo, absolutamente tudo, é um objeto. Inclusive as bibliotecas importadas em um módulo.

Para provar isso, é muito simples. Basta chamar a função dir para inspecionar os elementos do módulo di.py:

>>> import di
>>> [elemento for elemento in dir(di) if not elemento.startswith('__')]
['Sorteador', 'random']
Assim, é possível observar a função random importada como sendo um de seus elementos. Ou seja, bibliotecas importadas em um módulo funcionam como variáveis. Sendo assim, em vez de injetar dependência, a biblioteca alvo pode ser simplesmente alterada na hora do teste:

from unittest import TestCase
import di


class SorteadorTestes(TestCase):
    def teste_sortear(self):
        sorteador = di.Sorteador(10)
        di.random = lambda: 0.5
        sorteio = sorteador.sortear()
        self.assertEqual(5, sorteio)

        di.random = lambda: 0.54
        sorteio = sorteador.sortear()
        self.assertEqual(5, sorteio)

        di.random = lambda: 0.56
        sorteio = sorteador.sortear()
        self.assertEqual(6, sorteio)

De início passei a utilizar essa técnica mas achava que estava fazendo gambiarra. No entanto descobri a biblioteca Mock do Python. Sua função patch serve exatamente para isso, trocar uma biblioteca em tempo de teste por outra. E ela ainda vai além, tomando o cuidado de retornar o componente para seu objeto original após o teste, evitando assim efeitos colaterais indesejados em outros testes.

Enfim, eu gostei muito dessa abordagem distinta do Python. E você o que acha? É gambiarra ou apenas uma forma prática de se fazer Injeção de Dependência?


terça-feira, 30 de dezembro de 2014

Saga do Sequestro em Budapeste - Parte 2



Continuando a saga iniciada nesse post. 

Após o grito “HHHHHHHHEEEEEEEEEELLLLLLLLLLLPPPPPPPPPPPPP!!!!!!!!!!!!!!!” fecho o olho e aguardo o tiro de pistola. Contudo, ele não vem. Continuo seguindo os jovens e em pouco tempo o segurança e sua parceira desistem de me seguir.
Começo então a pedir ajuda dos jovens, explicando que meu amigo tinha sido sequestrado e corria risco de vida. Fala para ligarem para a polícia. Depois de muita insistência, eles decidem me ajudar.
Um deles bate na porta de um prédio. Aparece então o que seria o síndico, com uma cara de sono danada. Ele então chama a polícia.
Cerca de 10 minutos depois chega a viatura. Os jovens ficam de intérpretes, umas vez que os policiais só falavam húngaro. Mesmo sem entender a língua, no final do papo entendi o contexto. Os oficiais pediram aos jovens para irem na viatura e ajudarem na comunicação. Um deles responde que não, que já tinham se envolvido até demais.
Entro então na viatura com dois policiais que não falam inglês e seguimos em direção ao bar. No caminho, lembro da frase do gangster “Minha cidade, minha polícia”. Penso que se ele tivesse dito a verdade, aí sim eu iria vestir terno de madeira...rs.
Mas na minha cabeça eu tinha que voltar o mais rápido possível. Mesmo torto de bêbado, eu imaginei que começariam a espancar o Beraba, então eu tinha que chegar antes que ele ficasse desfigurado...kkkk.
Parênteses: nesse meio tempo o segurança retornou com a mulher. Disseram para o Reginaldo: “Your friend is crazy, he almost beat me up. He took the money and started to run away”. Traduzindo: “Seu amigo é doido, ele quase me bateu. Pegou o dinheiro e começou a fugir correndo”. O gangster olha pro Beraba e diz: “Now you are in a serious trouble”. “Agora você está com um sério problema”. O sotaque bizarro eu tentei reproduzir nessa gravação:




Enfim, encham o saco do Beraba para ele contar a versão dele pois existem partes engraçadíssimas ;)

Mas continuando a história, eu chego no bar e o gangster está na porta. Ele late alguma coisa com os policiais e depois me diz: “Vocês entraram aqui e não quiseram pagar a conta. Seu amigo está no Hostel. Eu vou colocar um advogado internacional atrás de vcs”.
Eu respondo “Ok, se meu amigo estiver no hostel a salvo, pode mandar seu advogado nos procurar em nosso país”.
Embarco de novo na viatura com o policiais que me levam até o albergue. Chegando lá toco o interfone e começo a falar em inglês, ainda sobre efeito do álcool. Era o Beraba que tinha atendido...rs.
Subo para o albergue e encontro o Reginaldo junto com um uruguaio. Os policiais queriam que pagássemos a conta.
O Beraba liga pro dono do hostel que fala que era melhor a gente pagar.
Então o uruguaio da a ideia de ligarmos para a embaixada. Ligo e me indicam o telefone de uma advogado da embaixada. Ele atende com voz de sono, falando português com um sotaque extramente carregado. Ele conversa ao telefone com os policiais e tenta nos tranquilizar. Eu digo que queríamos uma escolta para levar a gente até a estação de trem para irmos embora. Ele diz que não precisa, que a Hungria não era o Brasil, que estávamos seguros, já que em nenhum momento nos agrediram. Isso, segundo ele, aconteceu porque a lei lá realmente é dura e funciona. Então ele diz que poderíamos ficar na cidade e aproveitar, pagarmos somente se quisermos, e já desligou o telefone meio sugado.
Enfim, vamos para nossas camas. Mas quem disse que conseguíamos dormir. Cada barulhinho no albergue e a gente já ficava alerta, esperando a máfia entrar metralhando tudo...rs
No outro dia nossa história ficou famosa. Todo mundo pedia para contarmos, não só no albergue mas durante todo o resto da viagem. Teve gringo nos encontrando no Vaticano, em Roma, e perguntando o que tinha acontecido. Viramos celebridades...kkkk
No fim, pensamos que se os mal feitores quisessem pegar a gente, pegariam de qualquer jeito, mesmo que decidíssemos partir de manhã. Então decidirmos ficar e aproveitar a cidade.
E foi muito legal. Visitamos os banhos termais, piscinas aquecidas de 22 a 30 graus, a céu aberto, em um inverno de 4 graus. Foi sensacional!
Além disso, visitamos os castelos medievais. Lá tirei essa foto do Beraba:



O engraçado dela, tirada um dia depois do sequestro, é que foi utilizado por toda imprensa nas matérias sobre a invasão do Facebook...kkk.

Enfim, assim terminou a grande saga do sequestro em Budapeste. Acabamos sobrevivendo ilesos e sem pagar a conta!

Apesar de tudo, foi uma das cidades mais legais que visitei durante o mochilão. Recomendo bastante. Mas tome cuidado com os bares da cidade ;).

Abs e feliz 2015.

terça-feira, 21 de outubro de 2014

Qual história você quer contar daqui 30 anos?


Startup é um assunto que entrou tanto na moda que até novela tem abordado o assunto. Eventos pipocam em todos os lugares. Percebo na comunidade de TI, e até fora dela, a dicotomia: ser assalariado ou abrir uma startup?

Já experimentei os dois mundos. Fui funcionário público, militar, e poderia ter seguido carreira ganhando um salário razoável, com toda segurança e estabilidade. Mas não estava feliz, pedi demissão.

Sai para iniciativa privada e foi fantástico. Aprendi muitas coisas e tudo estava perfeito. Mas a felicidade passou e então então fui picado pela mosca do empreendedorismo. Cheguei abrir um negócio e depois, por fim, acabei me tornando CTO em startup.

Mais uma vez tive um período sensacional. Poder conviver com pessoas incríveis e ter uma autonomia que até então não tinha experimentado. Mas quem já passou por isso sabe que a vida glamourosa é coisa de filme de cinema. Você trabalha ainda mais que assalariado e recebe menos, com a promessa de ficar rico no futuro. A verdade é que realmente deve-se estar apaixonado para seguir nessa vida. Mais do que isso, é necessário fazer as contas para avaliar se realmente a fortuna vai chegar no caso da empresa bombar.

Nesse turbilhão de trabalho várias ideias me ocorriam e não podiam ser colocadas em prática por conta do tempo demandado como CTO. Certo dia toda empresa participou do “Day1”. Esse é um evento onde empresários relatam sua história de sucesso, dizendo qual foi o dia em que perceberam que a empresa iria decolar. Foi um divisor de águas em minha vida.

Na pegada de startup, sempre fomos instigados a pensar na história que gostaríamos de contar em nosso futuro. O intuito era querer mudar o mundo com a startup e ver um propósito maior no que fazíamos no dia a dia. Me lembro de todos meus amigos saindo do evento extremamente motivados e felizes. Sai totalmente desmotivado. Não falei nada para não estragar a alegria alheia.

Mas reparei atento nos palestrantes. Enxerguei um padrão. A maioria contou a mesma história: “Trabalhei muito, sacrifiquei feriados e a convivência com a família para conquistar tudo isso. Agora estou vendendo a empresa para aproveitar, vou recuperar o tempo perdido e aproveitar”. Passei um bom tempo pensando nisso. Eles não me pareciam felizes, pelo menos não da maneira que eu pensaria que estaria no lugar deles. Me perguntei: “Como é que eles vão correr atrás do tempo perdido? Tem gente ali que deve ter filho com 18, 20 anos e não deve ter participado da vida dele. Como se recupera esse tempo?”.

Com um adendo muito importante: ali estavam aqueles que “venceram”. Os “perdedores”, pelo menos no Brasil, não costumam contar história. Imagine esses, que nem sequer com o consolo de uma fortuna contam?!

Nessa mesma época passei a frequentar comunidades de tecnologia e acabei vendo uma palestra do Henrique Bastos que me mostrou uma terceira opção: lifestyle business. Pesquisei, li blogs interessantes, como o do VinicusTelles. Devorei livros sobre o assunto: 4 hour week work, The Incredible Secret of Money Machine.

Durante esse processo de pesquisa e auto conhecimento, não me lembro onde me deparei com a seguinte pergunta: “O que você faria se ganhasse num concurso um salário de R$ 20.000,00 vitalício?”. Por mais simples que essa pergunta possa parecer, demorei certo tempo a responder. Depois de meditar por algum tempo, cheguei em algumas respostas: “Daria mais atenção a minha família, faria exercícios físicos, emagreceria, viajaria, escreveria um livro, leria mais, faria software por diversão, daria aulas”.

O ponto importante de chegar nessa resposta foi a conclusão de que eu não precisava ter uma fortuna. O que eu precisava era do bem infinitamente mais precioso que grana: tempo! Mas a “matrix” não nos deixa ver isso.

Foi então que comecei a me preparar financeiramente para ter tempo livre. Cancelei cartão de crédito, parei de comprar bugigangas inúteis (ex: trocar de celular só porque saiu marca nova). Diminui as contas até um patamar onde apenas com um dia e trabalho por semana eu as honraria. Com um detalhe importantíssimo: esse dia de trabalho é na faculdade, dando aula, que já é/era justamente uma das atividades que eu gostaria de fazer ;). Além disso, para me preparar para o pior caso, o de não poder trabalhar por alguns meses, fiz uma reserva financeira.

Falando assim até parece que tudo é/foi fácil e instantâneo. Confesso que não foi. O cagaço bate, quase desisti.

Mas nesse momento refleti sobre o que de pior poderia acontecer. É engraçado o que ocorre quando você descreve seu medo. Ele deixa de ser aquele monstro perverso que você imagina. Sendo do mercado de TI, sei que ele está extremamente aquecido. Deixando a modéstia de lado, sempre recebi e recebo ofertas de trabalho, de CTO de startup a trabalho assalariado. E isso acontece com todos da área, não é privilégio meu. Logo, o pior que poderia acontecer seria voltar para o mesmo ponto: trabalhar no mercado. Nessa conjuntura, não fazia sentido nenhum não tentar uma nova opção.

Então depois de alguns meses de preparo, desde julho de 2013 passei a viver o chamado lifestyle business. Não existe mais aquela frase “quanto eu tiver tempo faço”. Com tempo livre, bateu a vontade, faço. Como agora que estou escrevendo esse artigo =P.

E assim surgiram várias oportunidades e projetos: Meu livro; Python Birds, curso de Orientação a Objetos com Animação, projetos open source, vídeo aulas gratuitas. Nesse processo, ainda descobri que não era necessário muito dinheiro para viajar. Esse ano conheci Santa Rita do Sapucai, Brasília, Aracaju, Lavras e Goiânia. Em todas elas o custo da viagem foi menor do que eu gastaria ficando em casa! Mas isso é história para outro post.

Esse ano li mais livros do que toda minha vida: 4 hour week work; Contrato Social; Revolução dos Bichos (Animal Farm); A Arte de Estar Sempre Certo: 38 estratagemas; 5 livros Game Of Thrones; Como fazer amigos e influenciar pessoas; O que é Marketing (Raymar Richers). Esses pelo menos que eu me lembre.

O importante, se você leu até aqui, não é ficar imaginando se eu sou doido, corajoso, sortudo, convencido ou qualquer coisa desse gênero. Pelo contrário, não sou e não quero ser exemplo para ninguém. O principal é você saber que existem opções diferentes das “40 horas semanais”. Mais importante ainda é que a opção “startup” pode não ser a mais recomendada para você. Não existe fórmula fechada, as rédeas de sua vida estão em suas mãos.

Então a pergunta que você deve se fazer agora é: “Estou feliz com minha opção atual?”. Se a resposta for sim, viva intensamente a segurança e conforto de seu trabalho semanal; a adrenalina, agitação e desafios de sua startup; os projetos a que você se dedica por conta do tempo livre conseguido com seu lifestyle business.

Agora se a resposta for não, saia da zona de conforto. Pare de culpar os outros por sua infelicidade. Só cabe a você mudar a situação!

Qual história você quer contar daqui 30 anos?





quarta-feira, 1 de outubro de 2014

A Saga do Sequestro em Budapeste


A Saga do Sequestro em Budapeste

No fim do terceiro ano do ITA os alunos se reúnem na chamada Comissão de Viagens (CV). Seu objetivo é angariar recursos durante o quarto ano para financiar uma viagem técnico cultural dos participantes pela Europa, vulgo mochilão.

Meu amigo Beraba, agora mas conhecido como hacker do Facebook, foi aclamado presidente da comissão. Eu fui diretor da CAPRO, Comissão de Artigos Promocionais.

Depois de arrecadados os recursos, embarcamos cerca de 40 pessoas no sucatão, o Boieng que o Lula desovou para a Força Aérea. Naquele época o voo era fornecido gratuitamente, já aproveitando a viagem para cumprir missão no exterior. Então junto com a tripulação foram várias caixas de peças de avião.

Aterrissamos em Madri e a viagem começou animadíssima. 40 moleques felizes igual pinto no lixo. Todos se organizaram em pequenos grupos. No meu havia 3 pessoas, eu, Jandaia e o Beraba.

Na primeira noite fomos à uma rua de balada espanholas. Lisos como todo estudante, tentamos dar um “Bob Nelson” para entrar de graça. Ali escutamos uma frase de um segurança que devíamos ter levado mais a sério: “No hai nada gratis”.

A viagem prosseguiu e visitamos diversas cidades. Na ordem: Madri, Barcelona, Paris, Amsterdam, Bruxelas, Bruges e Toulouse. Nessa fizemos uma visita muito legal à Air Bus. Se a memória não me falha, vimos um Beluga. Conclui que qualquer coisa com asas voa:


 
Meu cartão de crédito não funcioanva em nenhum lugar. Assim, o Beraba virou meu pai e passou a pagar tudo que era de conta de cartão.

Durante toda a viagem seguimos um ritual. Íamos a um supermercado e comprávamos uma garrafa de Absolut e energético. Essa vodka era mais barata que Smirnof lá. Então uma era finalizada cada dois dias, durante as baladas, passeios e albergues da vida.

Em Toulouse pegamos um voo para Londres. Mas fomos apenas eu o Beraba. Jandaia prosseguiu para a Russia sozinho.

Chegando na Inglaterra ficamos em um dos melhores albergues da viagem, próximo ao Hide Park. Chegamos de noite e tinha somente o dia seguinte para turistar. Nesse dia caminhamos por toda Londres por umas 7 horas. Foi desgastante.

Contudo, ao voltar para o Hostel, nos esperava nosso energético. Resumindo, Beraba bebeu demais e se passou no Hostel. Cedinho tínhamos que pegar um voo para Budapeste. Foi muito legal porque fomos andando pelo parque por conta da ressaca. Nada parava na barriga do “gordim”...kkk. Tenho um vídeo  daquela manhã:



Em toda viagem a gente comia só no Mc Donaldos por conta da liseira. Mas a fama no Leste Europeu era das coisas serem mais acessíveis. Isso e as baladas também. Era um sábado, mas por conta da “enfermidade” do meu amigo, acabamos não saindo naquele dia.

No domingo ele estava um pouco melhor, mas não ao ponto de beber. E eu louco para sair. Naquela pilha toda, acabamos indo em uma balada esquisitíssima. Antes de entrar bebi toda minha parte da vodka, e também a do Reginaldo. O lugar parecia uma construção velha da época da segunda guerra. Na entrada havia umas cortinas de plástico no estilo daquelas de açougue. Dentro tinha uma galera alternativa. Em algumas mesas, havia banheiras em vez de banco para sentar. Mas só tinha cueca lá.

Decidimos voltar para o Hostel. Eu já estava totalmente embriagado. Heis então que brota um húngaro do nada e nos convida para conhecer sua balada. Disse que a entrada era franca e ainda ganhávamos uma cerveja. Deveríamos ter desconfiado. Esmola demais...

Beraba me pergunta se quero entrar. Eu muito doido, falei “Bora”. Pegamos nossa cerveja grátis e ao entrar só tinha um cara no que parecia um porão-bar. Não deu 5 minutos, o Beraba falou para irmos embora porque aquilo estava esquisto. Falei: “Partiu”.

Na saída o caixa falou que tínhamos que pagar a conta. Perguntamos: “Que conta? Só pegamos a cerva grátis e nem ela tomamos inteira!”. Ela então aponta para nossa mesa. Estava cheia de bebidas. Champagne, whisky e algumas outras que não estavam ali 5 minutos antes.

Mal começamos a argumentar e já havia 5 seguranças em nosso redor. Pensei: “a gente vai apanhar muito hoje”. O interlocutar e aparentemente líder do bando era igual o gangster do seriado Nip Tuck. Começa então o bate papo “amistoso”.



O gangster passa a conta pra gente: 300.000 Forentis, a moeda húngara. Eu muito doido, começo a fazer a conta de cabeça e em etapas. 250 Forentis igual a 1 Euro, 2.500 a 10, 25k a 100, 250k a 1000. Parei e disse: “Beraba, faz essa porra dessa conta que eu to doidasso, na minha cabeça está dando mais de 1000 euros!”. Só ouço a reposta “deu 1.2k euros”. Pensei: “Não vamos apanhar hoje, vamos morrer”.

Então a gente começa argumentar, e os caras falando em húngaro entre eles. Pela expressão corporal parecia que ia “azedar” bastante. Entre as ameaças o gangster fala “Se vocês sumirem aqui, ninguém vai nem saber”. Prontamente o Beraba pega meu passaporte, que era de militar, e diz que estávamos em missão. O cara responde num sotaque bizarro “Do you like to play games?” (você gosta de brincar?). “guarde isso agora. Caso contrário, você vai ver o que vai te acontecer”. Acho que o criador de jogos mortais deve ter ouvido nossa história para criar o bordão .

Como todo bêbado é macho, eu digo “Amigo, chama a polícia que a gente paga”. Logo ele responde “This is my city, my police” (Essa é minha cidade, minha polícia). Mas bêbado não desiste da macheza: “Então chama aí”. O cara simplesmente caga pra mim. Cada vez eu tinha mais certeza que nossas vidas estavam próximas do fim.

Vai ameça, vem ameaça. O álcool me dá uma brilhante plano de ação: “Amigo, vou fazer o seguinte: vou te dar toda grana que tenho e a gente fica acertado”. Enfio a mão no bolso. e pego uma nota de 5 Forents, mais umas moedas. Junto tudo em uma mão e dou porrada com a grana no balcão. Eu não lembro da cara do Beraba, mas imagino. O gangster fala: “Are you crazy, are you drunk?” (Você está doido, está bêbado?). A pronta resposta “Lógico que tô bêbado, você não está vendo?”. Ele retruca: “Vou te revistar e se achar alguma coisa você verá o que vai te acontecer”. Cauteloso, eu digo: “Pera aí então que eu to muito doido, deixa eu dar mais uma conferida”. Retiro do meu bolso 50 centavos mais uma manteiga de cacau e dou mais uma porrada no balcão...kkkkkkkkkkkkkkkkkkkkk. Obviamente o cara ficou muito, mas muito puto. O Beraba diz que eu até levei um “pedala” nessa hora, mas não lembro. Se era para morrer, que pelo menos fosse tirando onda.

Por fim eles surgem com um plano de pagamento. O Beraba iria até o caixa para retirar o dinheiro e eu ficaria de refém no bar-porão. Eu pensei: “Beleza, espero que o Beraba fuja. Com uma testemunha solta, não vão me matar. Como estou anestesiado por conta da cachaça, nem vou sentir as porradas que vão me dar até ele voltar para me buscar”. Não sei porque não falei isso pra ele na hora em português, para ele fugir.

Beraba vai escoltado por um segurança baixinho mais uma mulher. Eu embriagado fiquei enchendo o saco dos que ficaram comigo: “Gente, que vida de merda vocês tem, ter que ficar dando golpe para sobreviver deve ser uma foda”. Bêbado insuportável, eles se afastaram.

Reginaldo volta com seus amigos em 5 minutos, cartão não funcionou. Então eles falam que é minha vez de ir. Mandam o mesmo segurança baixinho e mulher. Meu pensamento foi : “Sou eu então que tenho que fugir”. Morei no Rio de Janeiro e por conta disso meditei: “Pessoal lerdo, mandar um segurança anão e uma mulher só comigo”. Mas vi que ele estava com um casaco preto e com a mão sempre no bolso. Pensei que naquele mato tinha coelho.

Mesmo assim, ao caminhar fui tentando decorar o caminho para resgatar o Beraba caso eu fugisse. Me levaram em uma avenida onde tinha o caixa. Insiro o cartão e ao pedir a senha, olho feio para o segurança. Muito educados, eles viraram de costas para não verem. Pensei: “Se fosse bandido carioca eu já tinha levado uma coronhada e já estavam com minha senha e cartão”.

Mas meu cartão não funcionou em nenhum lugar da Europa, por que iria aqui? Parceiro, a Lei de Murphy é implacável. Saquei o máximo, 100.000 Forents, saiu uma montanha de dinheiro. O segurança diz: “Faltam 200k”. Tento fazer mais um saque no mesmo valor. Consigo! Cartão “fela da puta”. Meu racioncínio: “Os caras já vão ter o dinheiro e nós dois lá naquele porão, não vai ter mais nada pra negociar”.

Então o santo álcool me deu coragem: “Amigo, acabou a negociação. Tenho aqui 200k, que é mais do que você merecem. Eu não vou voltar. Você traz meu amigo aqui e te dou a grana”. O cara fica puto e pega no meu braço para me levar de volta. Dou um tapa na mão delr, fazendo ele me largar. Repito “Acabou parceiro, traz meu amigo e te dou a grana”.

Nisso vem uma mulher andando pela rua. Eu peço: “Me ajuda, esse pessoal sequestrou meu amigo e querem me matar, chama a polícia!”. A mulher saca o celular. O anão segurança late algo em húngaro com ela. Pelo que entendi, deve ter sido algo como “Não se mete ou vai sobrar para você”. Ela me fala que não confia em mim. Eu digo: “Não confia em mim? Maravilha, então chama a polícia!”. Ela se afasta rapidamente.

Mais uma vez sou puxado pelo braço. Mais uma vez repilo com um tapa. Andando na rua aparecem dois adolescentes. Mais uma vez peço ajuda. Eles tentam andar rápido para me despistar. Eu sigo e digo “Eu vou seguir vocês. Eles estão com meu amigo. Se for para eu morrer, vocês irão junto comigo agora”. Cara, eu rio hoje imaginando se esse caras não cagaram na calça.

A corrida maluca segue em frente. Eu atrás dos jovens, o segurança e a mulher atrás de mim. Mas uma vez sou agarrado. Me desvencilho com o velho tapa e digo num tom mais alto: “Me larga”. A mulher responde: “Hei, fala baixo”. Penso comigo: “Falar baixo?”. Junto todo ar nos pulmões e grito o mais alto que já consegui na vida: “HHHHHHHHEEEEEEEEEELLLLLLLLLLLPPPPPPPPPPPPP!!!!!!!!!!!!!!!”. O grito ecoa por toda Budapeste. No finzinho eu fecho olho e aguardo o tiro da pistola que eu achava estar na jaqueta do segurança.

Bom esse post já está enorme nesse ponto, então vou deixar o restante para outro.

Só queria deixar um ensinamento dessa história antes de você ir embora furioso por ter lido até aqui e ter que esperar pelo final:

“No hai nada gratis”. Se te disserem que a entrada é grátis, pergunte quanto custa a saída ;)

Além disso, intimo meu amigo Beraba a escrever a versão dele dos fatos ;)

Grande abraço e até o próximo post!

quarta-feira, 23 de julho de 2014

App Engine e Django: No! hell!


Ultimamente tenho evangelizado a Plataforma como Serviço (do inglês PaaS – Plataform as a Service) Google App Engine (GAE), utilizando a linguagem Python. Uma pergunta me é feita de forma recorrente: “Renzo, é possível rodar Django no App Engine? Funciona bem?”. Isso era de se esperar, visto que Django é o framework web full-stack mais famoso dessa linguagem.

Versão curta:

Sim, é possível utilizar o Django no GAE com o porte não oficial: 


Contudo, você encontrará várias limitações:


Na prática, você vive no pior dos dois mundos: não consegue utilizar nem o Django nem o GAE 100%, ficando com uma solução capenga. Então não use o Django no GAE!

Se você quiser usar o Django, use em um stack padrão para ele. Seja Heroku, Amazon ou Digital Ocean.

Se quer usar App Engine, use com suas apis. Apesar do medo do “vendor-lock-in”, em 4 anos nunca sofri com isso. Se for para portar para outro host, melhor é usar o Appscale (http://www.appscale.com/) do que Django. Use um framework full-stack feito exclusivamente para a plataforma:

https://github.com/renzon/tekton

Versão Longa:

DJango é um framework feito com SQL em mente. Suas apps, painel de adminstração, ORM e scaffolding dependem fundalmentalmente desse tipo de banco para funcionar 100%. Assim, querer portá-lo para NoSQL me lembra a célebre frase “para quem só conhece martelo, tudo é prego”.

Um dos grandes atrativos para iniciantes é o painel de adminstração. Aliado ao scaffold, é possível prototipar rapidamente aplicações web. Contudo, ao tentar rodar o DJango-Admin no GAE, as limitações do Datastore (https://developers.google.com/appengine/docs/python/ndb/) não permitem o uso integral do painel. Além disso, a plataforma em si já provê um painel de adminstração próprio, mesmo que mais rústico.

Mas as limitações desse banco existem por uma razão: escalabilidade. Elas estão lá para permitir que sua aplicação escale sem haver necessidade de alterar o código. E o fato é que depois de conversar com engenheiro de grandes sites, como Facebook e Globo.com, conclui que mesmo trabalhando com SQL, várias dessas limitações impostas acabam sendo necessárias nesse tipo de banco para se atingir uma grande escala. Como exemplo a eliminação de joins para facilitar o cache:


Outra grande vantagem do Django é seu ecossistemas de apps (módulos). Elas resolvem problemas recorrentes apenas com a instalação de uma biblioteca. Para exemplifcar, procurei no Google: “app django voting” e consegui uma para resolver votações online: https://code.google.com/p/django-voting/. Contudo, uma vez que se baseiam em Django + SQL, elas também não funcionarão 100% no GAE. Basta a app precisar de um simples join e sua funcionalidade não irá funcionar.

Tendo então comprometidas as duas grande vantagens, sobra ainda uma outra muito interessante: geração e validação automática de formulários a partir dos modelos. Isso é extremamente útil, evitando replicação de código e reduzindo sua complexidade. Porém, para utilizar os formulários, pelo menos o ModelForm, é necessário utilizar os modelos do Django.

Ao utilizar o ORM do Django, e algumas outras apis, você irá perder uma grande vantagem do ndb: chamadas assíncronas (https://developers.google.com/appengine/docs/python/ndb/async). Com elas é possível paralelizar as diversas buscas que devem ser feitas em banco de dados durante uma requisição. Assim é otimizado o uso de seus recursos gerando economia para seu bolso, uma vez que o modelo de cobrança é proporcional ao tempo de uso. Logo, mais uma vez um recurso não será utilizado 100%.

Ok, se te convenci nesse ponto de que usar Django no GAE é “martelar parafuso”, então a pergunta lógica a ser feita é: “O que uso para desenvolver?”

Quando comecei a usar a plataforma, o projeto Django-nonrel não existia. Da mesma maneira, o micro framework Flask também não. Mas o que percebi, acompanhando discussões Flask versus Django na comunidade Python é que microframeworks, como o primeiro, são preferidos por devs mais experientes, pela liberdade de escolha que proporcionam. Mas para devs iniciantes, um framework full-stack é mais adequado. E a razão disso é muito simples: para um dev iniciante, é melhor contar com as decisões feitas por profissionais mais experientes dentro do framework do que bater cabeça tentando criar suas soluções.

Essa conclusão então me chamou a atenção para a pergunta recorrente do início do post, que aqui repito: “Renzo, é possível rodar Django no App Engine? Funciona bem?”. Acabei meditando melhor, deixando meu preconceito contra frameworks full-stack de lado, tentando entender o que realmente essa pergunta queria dizer. Como fruto desse pensamento, acabei traduzindo a pergunta para “Existe uma forma de automatizar o código no GAE da mesma forma que faço com o Django?”. E a reposta é sim.

A solução então foi adaptar minha biblioteca, o Tekton. Ele foi construído em cima do framework padrão da documentação do App Engine, o webapp2. Sua versão inicial tinha a mesma filosofia do Flask. E por conta do que comentei sobre esse tipo de framework, essa é uma opção não familiar para devs iniciantes ou àqueles que conhecem as facilidades do Django.

Passei então a analisar os pontos fortes do Django e também do Rails. Minhas conclusões:


  1. Seria legal ter scaffold para prototipação
  2. Seria legal ter validação automática de formulários a partir de modelos
  3. Seria legal ter a criação de código html a partir de modelos
  4. Seria legal ter um ecossistema de apps mínimas para começar, e ir acrescentando outra com o tempo
  5. Seria legal fornecer uma arquitetura para permitir o uso das API's assíncronas do Google, ao mesmo tempo em que se construa apps isoladas como as do Django
  6. Seria legal documentar todas ferramentas
  7. Seria legal criar uma comunidade em volta desse framewok


Para as primeiras 4 questões, segue o vídeo:




Para as demais:

Apps: 

Até agora escrevi 5 apps:
  1. GAEBusiness. Arquitetura para camada de negócio que permite separar apps e ainda sim executar código utilizando as vantagens da API assíncrona;
  2. GAEGraph. Lib que permite modelagem de dados no banco como um grafo. Prove várias features interessantes, como recuperação de nós, salvamento entre outras. Isso utilizando memcache para aumentar performance e reduzir custos;
  3. GAECookie. App de segurança de cookie para validação de sessão e para evitar ataques CSRF;
  4. GAEPermission. Plataforma de login com Google, Facebook e Passwordless. Também prove camada de segurança por lista branca (white-list) para controlar permissões em alto nível;
  5. GAEPagseguro. Plataforma de integração com pagseguro.

Todas essas features podem ser conferidas em https://pt-dot-tekton-fullstack.appspot.com/ e também em http://adm.python.pro.br/

Quanto a documentação, vou reescrever todo o livro https://leanpub.com/appengine para conter essa nova abordagem. Após isso vou documentar todas apps no Github.

Por fim, fica a criação da comunidade. É isso que começo fazer agora! Assim, se você quiser participar desse projeto ou tirar dúvidas, fica o endereço do fórum para você se filiar:


Até o próximo post!