Dicas para um bom programa em Python

Postado por Osvaldo Santana

Oi pessoal, desta vez eu vou pular as ‘desculpas’ por ter demorado tanto para postar aqui no blog e vamos direto ao assunto.

Recentemente eu tenho trabalhado bastante com Python (dã!) desenvolvendo projetos de diversos tipos e resolvi escrever aqui sobre algumas coisas que pratico enquanto desenvolvo.

Código mais robusto

Deu certo ou errado?

O que você faz quando acontece algo errado na execução do seu método? O que você responde à requisição que lhe foi feita?

Eu tenho visto em muito código por aí os desenvolvedores retornando valores sentinela (None, null, 0, -1, etc.) para avisar que algo incorreto aconteceu na execução do método.

def f(arg):
   if not arg:
      return None
   return [ "resultado", "de", "um", "processamento"  ]

Algumas linguagens de programação não possuem estruturas de tratamento de exceção e, neste caso, o uso de sentinelas é válido. Mas quando a linguagem de programação te disponibiliza essa funcionalidade é bom usá-la.

def f(arg):
   if not arg:
      raise ValueError("Argumento Invalido")
   return [ "resultado", "de", "um", "processamento"  ]

Deixem as exceções fluirem.

Isso mesmo. A menos que você saiba exatamente o que você deve fazer quando uma exceção aparece deixe-a exceção “subir”. Pode ser que “lá em cima” alguém saiba cuidar dela adequadamente.

Quando não fazemos isso estamos ocultando informação importante para os usuários do nosso código (sejam eles usuários, outros desenvolvedores ou nós mesmos).

def f():
   try:
      return conecta()
   except ExcecaoQueDeveriaSerErro:
      return None

Quando eu implemento esse tipo de método/função eu faço assim (na verdade eu não implementaria f() e chamaria conecta()):

def f():
   return conecta()

O que seu método/função retorna?

Código que eu encontrei recentemente:

def get_fulanos():
   q = Q("select * from patuleia where alcunha like 'fulano%'")
   ret = [ str(fulano['nome']) for fulano in q ]
   if len(ret) == 1:
      return ret[0]
   return ret

Perceberam o que está errado? O seu método retorna uma lista de Fulanos ou retorna Fulano?

Isso está conceitualmente errado e pode fazer você perder horas preciosas do seu dia tentando achar um bug causado por esse tipo de código.

Aconteceu comigo. Note que str() implementa uma interface de sequence da mesma forma que list(). Então o erro passa silenciosamente no caso abaixo:

old_fulanos = [ "Ze Ruela", "Ze Mane" ]
old_fulanos.extend(get_fulanos())
print old_fulanos

Rodando esse código você vai obter ['Ze Ruela', 'Ze Mane', 'q', 'u', 'a', 'c', 'k'] sendo que, em mais de 90% dos casos, o que você gostaria de ter seria: ['Ze Ruela', 'Ze Mane', 'quack'].

“Nada” é diferente de “alguma coisa”.

Essa dica é só uma complementação da primeira e da segunda dica.

Quando o seu método/função retorna uma collection (seqüência, conjunto, hash, etc) vazia você deve retorná-la vazia e não um valor sentinela (como None). Isso facilita a vida de quem vai usar o seu método/função:

def vazio():
   return []
 
for elemento in vazio():
   pass #... faz algo se o conjunto contiver dados ...

Se você retorna um valor sentinela:

def vazio():
   return None
 
elementos = vazio()
if elementos:
   for elemento in elementos:
      pass # ...

Notou que tivemos que criar uma variável com o resultado da operação (para não precisar chamá-la duas vezes) e tratar a sentinela com um “if“? Se eu esqueço de tratar a sentinela meu programa vai quebrar.

Lembre-se sempre que uma collection vazia tem valor booleano “False“.

Todo ‘elif‘ tem um irmão ‘else‘.

Sempre que você precisar usar uma construção if/elif coloque uma cláusula ‘else‘.

Além de usar a cláusula ‘else‘ eu geralmente faço com que ela gere uma exceção. Desta forma eu sou obrigado a trabalhar todas as possibilidades nos ‘if/elif‘ evitando ocultar uma situação que pode ser inválida.

class InvalidCommand(Exception):
   pass
 
def minihelp(comando):
   if comando == "print":
      return u"""Imprime dados na tela.
                 Deixará de ser comando no Python 3.0"""
   elif comando == "assert":
      return u"""Certifica se uma condição é
               verdadeira e gera uma excessão em caso contrário"
   elif comando == "...":
      pass # ...
   else:
      raise InvalidCommand(u"Comando %s inválido." % (comando,))

Eu gosto dessa prática mas isso não significa que você deva seguí-la sempre. Existem situações onde ter um “valor default” é necessário e nestes casos o uso do else sem levantar exceção se faz necessário.

if comando == "if":
   print "Vai usar elif?"
elif comando == "elif":
   print "Muito bem. Agora falta o else"
else:
   print "Pronto. Agora está bom."

“Pythonismos”

Use mais atributos públicos do que atributos protegidos (”_“).

Programadores acostumados com Java utilizam muito as cláusulas ‘private‘ e ‘protected‘ para encapsular os atributos de um objeto para logo depois implementarem os getters e setters para acessar esses atributos.

Essa prática é aconselhada em Java porque em algum momento do futuro você, talvez, precise validar esses dados ou retornar valores calculados. Nestes casos os programadores apenas implementam essa lógica nos métodos que acessam o atributo privado.

Mas em Python isso não é necessário. Em Python você pode transformar seu atributo público em uma “property” que não muda a forma de se acessar o atributo e permite o acrescimo de lógica ao acesso do mesmo.

Evite usar “__“.

Por convenção, em Python, todo método ou atributo iniciado com um “_” é considerado privado (equivalente ao protected em Java) e não deve ser acessado de fora da classe mesmo sendo possível fazê-lo.

Dito isso parece meio óbvio que não precisamos usar “__” para dificultar ainda mais o acesso à esse atributo/método. Além disso o uso do “__” traz alguns incoveninentes para quem quer derivar a sua classe e acessar este método/atributo já que o Python o renomeia acrescentando o nome da classe ao seu nome (__attr vira Classe__attr).

Não sobrescreva builtins.

Python disponibiliza várias funções e classes builtins que facilitam muito o uso da linguagem e economizam digitação. Mas esses builtins tem nomes muito “comuns” e frequentemente a gente usa os nomes dos builtins como nomes de identificadores. Eu mesmo vivo (vivia) fazendo isso.

O problema é que em certos momentos alguns problemas podem acontecer quando você tenta chamar um buitin que já não é mais um builtin. Na maioria das vezes o problema “explode” logo e você rapidamente conserta mas em alguns casos você pode perder muitas horas tentando achá-lo.

Algumas pessoas usam um “_” no fim do nome do identificador (ex. “id” vira “id_”) mas eu acho isso um pouco feio então uso só quando não encontro uma alternativa melhor.

Vou colocar aqui uma tabela de equivalências que eu costumo usar para substituir o nome dos builtins mais comumente sobrescritos:

  • id – ident, key
  • type – kind, format
  • object – obj
  • list – plural (lista de element vira elements)
  • file – fd, file_handler
  • dict – dic, hashmap
  • str – text, msg

Análise estática economiza seu tempo.

Eu uso o pylint, mas conheço algumas pessoas que preferem o pyflakes ou o PyChecker.

A dica é essa: usar um programinha de análise estática como esses pode diminuir consideravelmente aqueles errinhos chatos de sintaxe, ou de digitação. Pode limpar os ‘import’ desnecessários do seu software, etc, etc.

É lógico que esse tipo de ferramenta não substitui uma boa política de testes mas é um bom complemento para ela.

Challenge yourself

Máximo de 3 níveis de indentação. (ou 4 se estiver dentro de uma classe)

Ao se esforçar para que seu código não fique muito aninhado você está trabalhando melhor a implementação dos seus métodos e funções. Nem sempre é possível (ou aconselhável) restringir tanto o nível de identação do seu código mas muitas vezes isso melhora a sua implementação.

Máximo de 2 indireções.

Recebeu um objeto como parâmetro? Chame apenas métodos dele e evite ao máximo chamar métodos do retorno desses objetos:

def f(obj):
    obj.metodo() # legal!
    obj.metodo().outro_metodo() # ruim!

Quando você chama um método pra um objeto retornado por outro método você está aumentando o acoplamento entre as classes envolvidas impedindo que uma delas seja substituída (ou reimplementada) ‘impunemente’.

Essa regrinha é uma das regrinhas da Lei de Demeter.

Máximo de 0 ‘if/elif/else’s.

Polimorfismo é isso. No mundo OO ideal, perfeito e utópico praticamente não precisaríamos do comando “if” e usaríamos somente polimorfismo. Mas… como não conseguimos isso tão facilmente* devemos, ao menos, usar o “if” com moderação.

Conclusão

Esta é uma lista incompleta de dicas para programadores Python. Se futuramente eu lembrar ou aprender algo novo eu volto aqui para falar sobre o assunto.

Alguns desenvolvedores podem não concordar com as dicas. Neste caso eles podem enriquecer ainda mais esse texto argumentando sobre o as suas restrições no espaço para comentários.

Se você tiver alguma dica para compartilhar com a gente coloque nos comentários. Se ela for boa mesmo eu coloco ela no corpo principal do blog.

* eu mesmo só consegui fazer uma aplicação OO funcional sem usar um único if. Era uma implementação do joguinho de adivinhação de animais (aquele que pergunta “Vive na água? (s/n)”) em Smalltalk.


Empreendedores 2.0

Postado por Osvaldo Santana

Como todos já sabem eu abri uma empresa para levar adiante uns projetos voltados para a Web (chamada de Web 2.0 pelos mais “antenados”).

Eu ainda estou longe de chegar no estágio alcançado pelos empresários que conheci, neste fim-de-semana durante o FMDS, mas mesmo assim foi legal conhecê-los aprender algumas coisas com seus acertos e tropeços.

Eu desconhecia uma grande parte dos projetos brasileiros apresentados durante o evento e por essa razão fiquei surpreso com a qualidade deles. Vou listar alguns:

  • Pagestacker – é um site para bookmark on-line. Faz algumas coisas que o del.icio.us não faz, outras que o del.icio.us faz (de forma diferente). Tudo no visual do Pagestacker é simples, agradável e fácil de usar. A diferença fundamental, que eu notei, entre o del.icio.us e o Pagestacker é que no primeiro existe um foco nas tags para organizar os bookmarks e no segundo a ênfase fica no sistema de busca.
  • Compra3 – projeto desenvolvido por uma empresa de Curitiba que cria um sistema para compras coletivas que gera descontos para compras em volumes nos sites mais conhecidos de comércio eletrônico brasileiro. Fiquei impressionado pelas experiências que eles tiveram e que os levaram a reeditar o negócio diversas vezes. Dicas preciosas sairam da apresentação deles.
  • Amanaie – o pessoal da Amanaie trabalha com desenvolvimento de aplicações para sites sociais. Na apresentação eles focaram no OpenSocial, que é utilizado por diversos sites sociais tais como Orkut, hi5, etc. Eles também trabalham com aplicações para a plataforma do Facebook. Através deles conheci o Michael Nicklas que é um norte-americano que veio para o Brasil aprender sobre o mercado de startups e de capital de risco.
  • BroguiBlogs – é uma plataforma para blogs que funciona nos moldes do Wordpress.com (eles até usam o mesmo software) mas com foco na facilidade para usuários que estão entrando no mundo dos blogs. Tirei uma lição valiosa com eles (e com a apresentação do Pagestacker) sobre o temor que eu tinha de lançar um serviço que não fosse inédito na Web. A apresentação de ambos me mostrou que se você fizer algo bacana as pessoas usarão. Mesmo se não for algo inédito.
  • Videolog / Tivi – o pessoal do Videolog/Tivi era a turma mais ‘veterana’ do evento. Eu honestamente não conhecia o Videolog (O Tivi é um projeto recém-lançado deles para criação de emissoras de TV on-line com vídeos do Videolog, Youtube, …) e fiquei absurdamente espantado com a qualidade dos serviços. Sério. Pra entenderem o que estou dizendo acessem o Youtube e depois acessem o site deles. Façam o mesmo para vídeos em HD.
  • Power – esse eu não vi durante o evento mas achei bem legal. É um unificador de grafo social (as conexões que você tem nas mais diversas redes sociais).

Com essa lista já é possível ver que o evento foi animal. Mas a história não acaba por aí. Logo depois do evento o Alexandre Fugita do blog Techbits lançou o Techcrunch brasileiro: Startupi. Neste blog o Fugita e mais alguns colaboradores tentarão reunir esse universo das startups e seus vizinhos (ex. ventures) nos moldes do que o Techcrunch faz nos Estados Unidos.

Se tudo der certo, e eu me dedicar um pouco mais na execução dos projetos que estão pendentes por aqui, logo logo estarei nesta lista também :)


PyConBrasil 2009 na sua cidade. O prazo está acabando!

Postado por Osvaldo Santana

Dia 10 de novembro termina o prazo para envio das candidaturas à cidade-sede da PyConBrasil 2009!

Se você mora numa cidade com uma comunidade pythônica entusiasmada, com uma boa infra-estrutura para sediar o evento e gostaria de ver reunida a ‘nata’ do Python no Brasil (e no mundo) é a sua chance de candidatá-la para sediar a próxima edição do maior evento de Python da América Latina!

Para candidatar é fácil. Basta preencher um formulário e seguir as dicas do Manual do Big Kahuna que as suas chances aumentam.

Os critérios para escolha da cidade variam bastante entre os participantes da banca de avaliação mas parece haver um consenso de que passam por:

  1. Participação, importância do Big Kahuna na comunidade e sua capacidade de coordenação
  2. Força do GruPy local
  3. Disposição de ambos para trabalhar duro durante quase um ano na organização do evento
  4. “Potencial pythonico” da cidade (quantos desenvolvedores python conseguiremos ‘converter’)
  5. Infra-estrutura pro evento
  6. Infra-estrutura da cidade-sede (transporte, acesso aéreo/terrestre)
  7. Mais alguns outros critérios que, com certeza, esqueci…

Os resultados serão divulgados no dia 25 de novembro. A banca de avaliação ainda não foi formada mas logo que tivermos mais detalhes eu aviso por aqui.


GP Brasil 2008 de F1, eu também fui…

Postado por Osvaldo Santana

Então… desde o começo do ano eu estava planejando essa viagem. Pra ser honesto estou planejando isso desde o ano passado mas só comprei os ingressos no começo deste ano.

Eu fui!
Eu fui!

E então chegou o tão esperado fim-de-semana e eu fui ver uma das corridas mais emocionantes das últimas décadas.

Pra ser perfeita precisava ter 10 gotas a menos de chuva no final. Tá ok… talvez alguns milhares de gotas a menos fossem o necessário para que a Toyota do Glock não perdesse tanto rendimento na última curva.

Eu fiquei no setor “G” da pista de Interlagos. O setor “G” ocupa todo o espaço da reta oposta. Estava lotado.


Interlagos vista de um helicóptero…

Mas vamos começar pelo sábado. Dia de treino e classificação.

Chegamos no autódromo para assistir ao treino da manhã e sentamos bem no meio do setor “G” de onde conseguíamos ver a saída dos boxes e bem ao longe o fim da reta onde, obviamente, tinha uma curva :)

Se esse negócio de ficar arrepiado é coisa de boiola o barulho de um F1 ‘enviada’ qualquer macho. Escutá-los reduzindo a marcha no fim da reta então faz os boiolas virarem mulher.

Algo que você só escuta lá: quando reduzem a marcha você consegue ouvir alguns ‘estouros’ do motor e um ronco grave que mostra que alí dentro tem um motor de verdade e não uma negócio qualquer que ‘grita fino’.


McLaren saindo dos boxes para volta de aquecimento

Os carros correm tanto que a foto acima deve ter sido a vigésima tentativa. Não lembro se essa McLaren era do Hamilton ou do Kovalainen. Só lembro que era saída dos boxes (não era velocidade máxima).

Terminado o treino da manhã já dava pra ver que o Massa estava bem e que o Hamilton estava na cola dele.

Algumas atividades acontecem nos intervalos entre um treino e outro. Corrida de Porches, Fórmula BMW, corrida de Masserati (muito massa), e o desfile de alguns endinheirados que pagam para fazer test-drive de Porches dentro de Interlagos. Passam com umas mulheres bonitas na carona, dirigindo um Porshe e acenando para a torcida na arquibancada.

Aliás, esse negócio de “dinheiro” lá é muito sério. Helicóptero trazendo gente para o autódromo de minuto em minuto, cerveja a R$4,50 (sem direito a profissional do sexo), espetinho de carne por R$4,00 (que se compra por R$0,50 aqui perto de casa) e o ingresso mais barato custa R$300 (antecipado) para um dia e te dá direito a frequentar um banheiro químico com uma bela vista de ’submarinos’ boiando. Lamentável.

Lojinhas da Ferrari com souvenirs fazem a gente babar…


Boné da Ferrari: R$100, Pin: R$10, Sacolinha de plástico com emblema da escuderia: Não tem preço.

… e comprar :)

E tudo isso só no dia do treino… Aliás no treino classificatório o Massa ficou com a pole position e o Hamilton só em quarto. Bom pro inglês que não precisava mais do que isso pra ser campeão do mundo.

Ah! E o dia estava extremamente ensolarado e quente. Ano que vem (sim, eu vou lá em 2009) eu vou passar protetor solar mesmo se a corrida for noturna. Não é legal ficar assim:


Ai!

Para ir para a corrida, no domingo, acordamos de madrugada porque queríamos ficar bem à esquerda do setor “G” de onde era possível ver todo o “S do Senna”, local onde muitas vezes uma corrida, e nesse caso o campeonato, se decide.

Das 7hs da manhã quando chegamos à arquibancada até as 15hs quando começaria a corrida passa-se um longo período sentado, no sol, na chuva, entediado, etc. A chatisse só diminui um quando tem as ‘atividades paralelas’ como a corrida de fórmula BMW, Masserati e G3.

Aí os pilotos fazem uma volta em cima de um caminhão…


Desfile dos pilotos…

… depois eles saem um a um para a configuração do grid (o Felipe sobe 5 marchas num espaço de 100m da marca branca no chão)…


Vai Felipe!

…e então, no momento da volta de apresentação, despenca uma chuva forte em Interlagos. Só o suficiente para molhar a pista.

O Safety Car dá uma volta na pista pra verificar como ela ficou e então a direção de prova opta por atrasar a largada em 10 minutos.

Eu perdi as fotos e o vídeo da largada porque estava tão ansioso com o momento que apertei todos os botões errados do meu celular :)

Mas a única coisa que aconteceu no “S do Senna” foi um estranhamento entre Nakagima, Couthard e Piquezinho que forçou a entrada do Safety Car na pista.


Manja como eles estão devagar…

Depois disso eu não tirei mais fotos nem fiz mais vídeos pois precisava acompanhar a corrida (num autódromo você é quem fica responsável por ‘trocar de câmera’ para saber o que está acontecendo).

Quando o Felipe Massa passou pela linha de chegada o setor “G” inteiro começou a pular e a gritar “Campeão!”… O Felipe então para o carro na entrada da reta oposta para pegar algo (devia ser uma bandeira) com os fiscais de prova e então no som da rádio Band News (que é a locução oficial no autódromo) começa a gritar: “Hamilton Campeão! Hamilton é Campeão!” e eu não entendo mais nada…

O Massa, então, passa na nossa frente e o setor “G” começa a esmurecer… todos começam a perguntar entre si o que tinha acontecido afinal…

O único trecho que não é visível no setor “G” é justamente o ponto onde o Hamilton ultrapassou o Glock.

A torcida então começa a gritar o nome do Massa… e eu vou embora… na chuva. Muita chuva.

Dicas pro ano que vem:

  • Comprar ingresso pro setor M (mas só se for numerada)
  • Levar capa de chuva
  • Levar uma TV portátil
  • Levar uma câmera com 12x de zoom
  • Levar um binóculo
  • Levar litros de protetor solar
  • Não perder o cartão de crédito
  • Levar guarda-sol ou um sombreiro

Tem umas fotos ‘bônus’ no meu flickr.


Latinoware 2008, eu fui…

Postado por Osvaldo Santana

Como sempre faço quando vou à um evento vou relatar aqui a minha primeira experiência participando da Latinoware 2008.

A decisão sobre a minha participação só foi tomada dois dias antes do evento pois quem iria patrocinar a minha viagem (INdT) conseguiu viabilizar o treinamento de Python para Maemo bem em cima da hora. Participei apenas do primeiro dia do evento.

Cheguei em Foz do Iguaçu na quinta-feira (30/10/2008) de madrugada e tinha um serviço de transfer no aeroporto para carregar os palestrantes até os hotéis onde ficariam hospedados. O meu nome não constava na lista mas isso era justificável por minha decisão tardia. De qualquer maneira bastou uma conversa rápida com o responsável pelo transporte e eu já estava dentro da Van em direção ao hotel.

Quando cheguei no hotel avistei uma placa avisando que um ônibus passaria lá às 8hs da manhã em direção à Latinoware. Às 7h30 eu estava na frente do hotel juntamente com mais 3 outras pessoas que também iriam para o evento.

Desistimos de esperar às 8h30 e dividimos um taxi até o local do evento. Descobri depois que o ônibus sequer havia passado no hotel.

Ao chegar no posto de credenciamento que estava instalado num estacionamento de Itaipu avistamos as filas para pegar crachás. Me dirigi à fila de crachás para “Palestrantes, Imprensa e Autoridades”.

A fila estava pequena (umas 8 pessoas) mas não andou 1 milímetro sequer até que um dos organizadores nos retirou da fila para entregar os crachás que estavam com ele. Mas o meu crachá, afinal, não estava com ele e tive que me contentar com um crachá em branco onde preenchi à mão o meu nome e RG.

Os palestrantes então deveriam entrar num ônibus que estava estacionado ao nosso lado pois seriamos levados até o “Parque Tecnológico de Itaipu” onde a estrutura do evento estava montada.

Esperamos por mais alguns minutos (que pareceram horas) até que um grande amigo meu entra pela porta do ônibus e comenta algo que eu já havia notado: “Esse é o evento mais desorganizado dentre todos os de informática dos quais já participei.” Note que em meu caso e no dele isso significa muitos eventos.

O ônibus saiu com lotação total de pessoas sentadas e em pé. Detalhe: faltavam poucos minutos para as atividades do evento começarem e uma parte considerável dos palestrantes ainda estava em um ônibus saindo da área de credenciamento.

Poucos metros dali o ônibus para e todos que estavam de pé tiveram que trocar de ônibus. A troca foi feita sob a vigilância atenta de um dos seguranças de Itaipu que olhava atentamente para nossos crachás preenchidos à mão para ver se não detectava alguma fraude :D Eita segurança…

Finalmente nos salões onde as atividades do evento iriam ocorrer tratei logo de ir para a sala de palestrantes ou para o stand da Associação Python Brasil para me conectar à Internet e terminar o material do meu treinamento…

Vencida a falta de sinalização do lugar fui até a sala de palestrantes mas ela já estava completamente lotada.

Fui então à caça do stand da APyB e ao chegar lá descobri que o ponto de rede estava com problemas. A sorte foi que o Ramiro levou um roteador wireless para conectar no ponto de rede do pessoal do Debian Brasil.

O almoço era razoável e foi ‘di grátis’. Servido apenas até as 14hs fez com que os instrutores dos mini-cursos da manhã tivessem que improvisar suas refeições já que seus treinamentos eram de 4hs (sem intervalo) e terminariam somente às 15hs.

No meu treinamento deu quase tudo certo. Mas nesse caso específico a culpa pelas falahas foram majoritariamente minhas (o ambiente necessário para o treinemento não estava instalado nas máquinas do laboratório pois eu não havia feito a solicitação em tempo hábil). Faltou um flip-chart/quadro branco na sala de aula também.

Terminado o treinamento fui dar uma bisbilhotada no pessoal da Robótica Livre que estava montando plaquinhas Severino sob a orientação do Prof. Paulo Gonçalves. O Severino é uma implementação brasileira do Arduino. Queria ter ficado lá mas tive que ir para a palestra de abertura e depois para um coquetel no mirante de Itaipu onde veríamos o acendimento das luzes da barragem. Um show que eu recomendo. Itaipu é uma daquelas coisas que temos pra mostrar as virtudes do nosso povo.

Aquele quadrado no centro é um prédio de 6 andares
Aquele quadrado no centro é um prédio de 6 andares

Já o coquetel… Eu comi dois “canapés” minguados e não bebi nada (nem água). E os canapés foram doados pelo Ramiro que se comoveu com a minha fome :)

Depois do coquetel voltamos para o hotel onde eu dormi um pouco até ir para o aeroporto embarcar de volta para Curitiba onde iria preparar minha ida para São Paulo (desta vez de carro) GP Brasil de F1. Sobre isso eu conto no próximo post.


Curiosidade nas crianças

Postado por Osvaldo Santana

Quando eu era criança eu era daquele tipo que desmontava brinquedos pra ver como funcionava por dentro, mandava cartas para a seção ‘Perguntas Superintrigantes’ para a revista Superinteressante (nenhuma foi publicada :/) e consultava todo tipo de livro ou enciclopédia que pudesses esclarecer minhas dúvidas.

Toda essa introdução serviu pra ilustrar uma coisa que se repete desde a minha mais remota infância: a curiosidade.

A minha curiosidade para aprender e entender como as coisas funcionam sempre foi enorme. A minha disposição para executar experimentos também. Cheguei ao ponto de ter incendiado o meu quarto por conta de um curto-circuito na rede elétrica.

Com cerca de 5 anos eu estava experimentando se ao dar um nó no fio a corrente elétrica ainda fluiria pelo condutor. Descobri que sim. :D Ok, foi burrice isso! Mas eu tinha só 5 anos!. Eu poderia ter simplesmente perguntado ao meu pai se isso funcionaria mas o ensinamento não teria sido tão contundente :)

E acreditem, essa experiência me rendeu alguns frutos positivos no futuro (pequenos se a gente comparar com o estrago). Essa experiência me garantiu uma vantagem durante as aulas de física elétrica quando o professor falava sobre “corrente de curto-circuito” e para o meu entendimento da Lei de Ohm (U = R.I ou I = U/R). Para simplificar imagine que na minha experiência R≅0, logo, I≅∞. Se potência é o produto de tensão por corrente (P = U.I) imagine o estrago (agravado por um disjuntor que não funcionou)…

Calvin running: Dad. Look! The sun's setting and its only 3 o'clock! - Calvin's dad: It's not 3 o'clock your watch stopped - Calvin looking to watch: Time doesn't stop if your watch stops? Calvin's Dad: Nope. - Calvin disappointed: Phooey. For a moment there I thought I'd get rich patenting this thing. Calvin's dad: I'd have bought one.

Mas voltando ao motivo principal deste post

Eu tenho 3 casos diferentes de crianças próximas de meu convívio. Meu filho que tem 4 anos de idade é uma criança tranquila, que brinca bastante com seus brinquedos e até já navega sozinho nos joguinhos do site da Discovery Kids.

Ainda não consegui perceber traços de uma criança curiosa nele. Tenho receio que seja em razão da sua pouca idade ou porque suas análises e experimentos passem desapercebidos por mim.

Ainda não dá pra fazer um comparativo comigo porque minha memória só vai até meus 5 anos e ainda assim é incompleta e só está presente para registrar as grandes descobertas (ou incêndios se preferirem).

Esse tipo de comparação entre pai e filho também deve ser evitada porque faz mal para ambos.

A outra criança é a minha sobrinha que tem 12 anos e estuda no melhor colégio que uma criança poderia estudar em São Paulo. Os pais dela (meu cunhado e cunhada) são extremamente presentes e acompanham os estudos dela de perto.

Também dão apoio e suporte nos assuntos, temas e matérias onde ela sente maior dificuldade ajudando pessoalmente quando possível ou através de atividades complementares pagas.

A minha sobrinha enfrenta dificuldades na(s) escola(s) ano após ano e meus cunhados até já a submeteram à avaliações para detecção de algum tipo de distúrbio neurológico como o DDA. Os resultados foram negativos.

Uma das características que observei nela é a ausência total de curiosidade.

Eu e o meu cunhado trabalhamos em áreas relacionadas à TI e graças a isso temos acesso constante a diversas tecnologias novas e à Internet. Sempre temos em mãos aparelhos, computadores, softwares, livros, filmes e até mesmo brinquedos que deveriam despertar a curiosidade das crianças.

Não adianta. Ela continua levando a vida dela e apenas recebendo as informações sem nunca tentar “caçá-las”.

O terceiro caso já não é mais de uma “criança”. Ele fez 18 anos no mês passado. Mas eu já convivo com ele desde os 12 porque ele é primo “caçula” da minha esposa.

A curiosidade dele é o que eu chamo de “curiosidade on-demand”. Pois ele até vai atrás de entender o funcionamento das coisas mas só quando aquilo servirá para resolver um problema prático do presente.

Po exemplo: ele sabe arrumar alguns aparelhos eletrodomésticos só porque trabalhou alguns meses fazendo isso.

Ele entende o funcionamento de um ferro de passar roupas até o ponto de saber que se o fio do chicote está partido o ferro não vai funcionar, mas nunca ao ponto de associar que o ferro de passar roupas é uma resistência elétrica que transforma a energia elétrica em energia na forma de calor.

A curiosidade dele nunca tenta romper a barreira da necessidade.

Algumas observações: tanto minha sobrinha quanto do primo da minha esposa são extremamente vaidosos e se preocupam com a aparência. Além disso eles são facilmente seduzidos por coisas fúteis e são extremamente vulneráveis aos apelos consumistas (celular da moda, roupa da moda, seriado da moda, …).

No caso do primo da minha esposa pedir pra ele ler alguma coisa é quase o mesmo que pedir pra ele se matar. Ele assiste DVD dublado pra não ter que ler a legenda.

Com isso descrito eu parto pro questionamento:

  1. Todas as crianças das últimas gerações são assim ou minhas amostras estão contaminadas?
  2. Vocês conhecem crianças curiosas? (pais corujas, por favor, sejam objetivos nas respostas)
  3. Vocês acham que as crianças de hoje não são mais curiosas porque elas não precisavam mais ‘caçar’ as informações pois basta ficar parado na frente da TV/Internet para obtê-las?
  4. Os pais podem estimular a curiosidade de seus filhos?
  5. Como fazer isso?

“Cagadas” homéricas (ou YA-meme?)

Postado por Osvaldo Santana

Durante toda a minha carreira “computeira” eu cometi alguns erros absurdos (cagadas?) que eu gostaria de compartilhar com vocês neste post.

Vou listá-las aqui na esperança de que outros façam o mesmo e que, com isso, o meu sentimento de culpa por tamanhas “obras” fique menor.

killall foobar

Certo dia, quando trabalhava na GVT, eu estava numa sessão telnet em um servidor de produção PA-RISC que rodava um HP-UX. Estava logado como root e precisava matar alguns processos que estavam prejudicando o funcionamento da máquina (consumindo CPU, memória, load alto, etc).

Meu conhecimento de Unix até aquele momento era de ter mexido muito com Linux ao ponto de saber usar com maestria o comando killall. Foi então o que eu usei para matar tais processos.

Assim que eu apertei “enter” surgiu uma mensagem de que o servidor iria se desligar em X segundos. Entrei em pânico.

Pois bem… apesar de ser um ‘fera de killall’ eu nunca tinha lido o trecho da manpage deste comando que dizia (no Linux):

Be warned that typing killall name may not have
the desired effect on non-Linux systems, especially
when done by a privileged user.

O que aconteceu? O killall do HP-UX envia um sinal para todos os processos da máquina e é usado pelo comando shutdown para matar todos os processos em execução.

Foi assim que eu desliguei, pela primeira vez, um servidor em produção de uma grande empresa de telefonia praticamente parei as vendas da empresa por pelo menos 1 hora (uma máquina dessas leva cerca de 20 minutos para voltar pro ar + acertos de configuração perdidos por causa do reboot).

delete from tabelao;

Mais uma vez na GVT… coitados…

Eu estava desenvolvendo um programinha que fazia acesso ao banco de dados Oracle e para isso eu constantemente testava algumas queries, inserts e deletes nas tabelas de um banco de dados que ficava no ambiente de desenvolvimento da empresa.

Nos bancos de dados do ambiente de desenvolvimento a gente encontrava um subconjunto dos dados do ambiente de produção e podíamos manipulá-los com tranquilidade porque uma vez por dia/semana as bases eram repopuladas com dados oriundos do ambiente de produção.

Em certo momento eu precisava deletar todos os registros de uma tabela (cerca de 50 registros) da base de dados do ambiente de desenvolvimento e rodei um:

delete from tabela;

Fiz os testes que precisava fazer sem rodar um commit e no final fiz um rollback.

Neste intervalo de tempo ocorreu um problema que exigiu minha atenção em um dos servidores de produção e esse servidor era justamente o servidor ‘equivalente’ ao de desenvolvimento onde eu estava trabalhando. Resolvi o problema do servidor rapidamente e voltei para o desenvolvimento.

Aí é que está o problema… o meu cérebro trocou de servidor mas meus dedos não e no fim eu rodei um delete from tabela; no servidor de produção da empresa :D

O estrago teria sido pequeno se tal tabela não tivesse centenas de milhares de registros fazendo com que o Oracle praticamente parasse de responder à requisições até que ocorresse uma falha de “estouro de segmento de rollback” (falha que demorou pra acontecer porque as configurações do Oracle eram muito ‘generosas’).

Seria muito difícil acontecer do estrago ser grande. Para que isso ocorresse a falha que ocorreu não poderia acontecer e depois do delete eu ainda precisaria dar um commit.

Se isso tivesse acontecido eu teria mudado de profissão :)

/home/osvaldo/icons

Essa foi no meu “início de carreira” com Linux. Eu trabalhava na Conectiva (atual Mandriva) e fiquei responsável por criar um sistema de “temas” para o Conectiva Linux 5.

Os temas deveriam funcionar igualmente no Gnome, KDE e no WindowMaker que, até então, era o WM que eu usava.

Fiz os pacotes, scripts, configurações e enviei para a máquina de integração (mapi). Dei essa tarefa como terminada e passei para as próximas.

Lançado o Conectiva 5 o sistema “explodiu” nas máquinas dos usuários e o sistema de temas não funcionava como deveria em todas as máquinas que usavam o WindowMaker .

Ao analisar o problema vi que no arquivo de configuração do WindowMaker tinha um “/home/osvaldo” no caminho de busca de imagens e ícones que causava a ‘quebra’.

Resultado: as coisas funcionavam perfeitamente na minha máquina e em todas as outras máquinas do mundo que tivessem um usuário “osvaldo”.

Esse foi um bug entre os vários desse sistema de temas que criei e que futuramente (por razões óbvias) foi abandonado.

Se você ainda tem um Conectiva 5 para instalar por aí faça o teste. :D

Off-topic

Alguns, talvez, ainda não saibam mas eu vivi um período em que queria largar da área de informática e virar publicitário (ok, eu era jovem).

Neste período “publicitário” da minha vida eu trabalhei em uma agência de propaganda chamada DLMRozani e lá nós fazíamos toda a mídia local das várias Lojas Americanas do país (a conta nacional era da agência Talent).

A mídia local inclui anúncios televisivos (para as afiliadas locais), anúncios em jornais locais e aqueles folhetinhos de ofertas que todos já devem ter visto.

Num desses folhetos onde anunciamos carne de 1ª à R$3,90/kg quando o preço correto era algo como R$13,90/kg (não lembro detalhes da oferta).

A sorte que era uma dessas “ofertas relâmpago” (válidas por 1 hora), mas o fato é que vendemos 400kg de carne em 1 hora. Filas se formaram em volta do quarteirão das Lojas Americanas e caminhões não paravam de chegar trazendo carne para ser vendida (aquele blablabla de “enquanto durarem os estoques” não tem muito amparo legal pelo código de consumidor).

Só para contextualizar: nesta época as Lojas Americanas tinham lojas que funcionavam como supermercado em várias cidades do Brasil. Essa operação foi vendida posteriormente para um grupo francês chamado Stoc.

Finalizando

Se eu lembrar de mais algumas “cagadas” eu volto a atualizar esse post mas acho que essas foram as maiores.

E vocês? Fizeram alguma dessas já?


Empreendedores do meu Brasil

Postado por Osvaldo Santana

Em abril deste ano eu saí de um dos melhores lugares pra se trabalhar nesse país afim de realizar um antigo sonho: construir uma empresa.

Desde que eu era criança eu já demonstrava essa vocação de empresário e tinha uma “empresa” que vendia seguro para as bicicletas de meus amigos. Já tinha um sócio nessa época (meu grande amigo Wagner Longo).

Em 2001 eu fundei a Haxent Consultoria juntamente com outros 5 sócios (Sérgio Bruder, Guilherme Manika, Rudá Moura, Alfredo Kojima e Eliphas Levy) e a empresa estava indo bem no começo até que alguns tropeços foram dados e fui obrigado a sair da sociedade. A Haxent ainda vai bem e atualmente tem como sócios apenas o Sérgio Bruder e o Guilherme Manika.

Como vocês podem ver em todas as minhas empreitadas sempre tive a figura do “sócio”. Não só por porque é uma espécie de “obrigação legal” (é mais fácil abrir empresas de sociedade limitada) mas porque compartilhar decisões e trabalho é sempre uma coisa muito saudável na administração de uma empresa.

Já faz uns 4 meses que fundei a Triveos Tecnologia Ltda. (por favor, perdoem-me pelo site :D ) e tenho como sócia a minha esposa (apenas para cumprir o aspecto legal já citado). Montei a empresa sozinho para depois procurar por um sócio que compartilhasse da vontade de tocá-la junto comigo.

A Triveos trabalha atualmente com Consultoria em TI nas áreas de desenvolvimento Linux Embedded e em desenvolvimento Web (feitos pra garantir o fluxo de caixa) mas o plano de longo prazo é ter produtos voltados à Web (e Web móvel).

No passado eu já enfrentei todo tipo de problema para construir uma empresa: falta de dinheiro, falta de trabalho/clientes, falta de mão de obra e até mesmo falta de um projeto para ela.

A Triveos, atualmente, não está com problema de falta de dinheiro (apesar de estar com os “cintos apertados”), não está com falta de clientes ou trabalho (eles aparecem aqui e ali pontualmente), não está com falta de mão de obra (porque a demanda ainda não pede a contratação de funcionários) e não está com falta de projetos para o futuro (tenho pelo menos 1 projeto grande e uma mão cheia de projetos menores esperando pelo aval de um sócio) mas não consigo achar sócios para a empresa. Não sei qual é a razão mas espero compreendê-la em breve.

Quer ser meu sócio?
Quer ser meu sócio?

Não é sempre que um empreendedor vai encontrar uma empresa nova, com projetos, com clientes, com um pouco de dinheiro, constituída legalmente e com todos os aspectos fiscais/contábeis impecáveis precisando apenas de alguém para trabalhar com afinco (ou ter dinheiro para se tornar um sócio-investidor).

No plano de negócios que está sendo gradualmente construído (na minha cabeça ele está pronto mas preciso passá-lo para o papel para poder verificar a sua viabilidade) eu avalio a necessidade de um sócio que saiba desenvolver software e de um sócio que saiba lidar com outro aspecto importante dos produtos que iremos desenvolver: o design.

A empresa está sediada em Curitiba mas não vejo problemas com trabalho remoto (desde que eventualmente os sócios possam se reunir presencialmente). Também não vejo problemas se o pretendente a sócio também estiver estudando ou precise continuar num trabalho que lhe garanta o sustento desde que ele comprometa uma parte do seu tempo na criação e execução de projetos para a empresa.

Esses cenários (trabalho remoto ou part-time) não são o ideal mas tendo em vista a dificuldade de se encontrar candidatos a empresários no Brasil…

Eu já mantive contato com umas 5 pessoas e por razões diversas (pessoais, estudo, dinheiro ou carreira) a coisa não funcionou. Espero que com esse post algumas pessoas apareçam.

Mas notem: estou procurando um sócio e não um funcionário!

Quero uma pessoa disposta a correr riscos e a se dar mal caso a empresa não funcione direito. Quero uma pessoa disposta a trabalhar muito e ganhar pouco (ou nada). Quero uma pessoa cujo gênio “bata” com o meu (mas que não seja muito parecida comigo). Quero alguém pra concordar, discutir e brigar comigo. Portanto, não me enviem currículos. Me envie um e-mail dizendo tudo aquilo que você acha necessário dizer para me convencer a ser seu sócio (projetos, idéias, desejos, planos de negócio, …).

Atualização: Estou enviando esse e-mail automático para todos que se candidataram à vaga:

From: Osvaldo Santana Neto <osantana triveos.com>
Subject: Vaga para sócio na Triveos Tecnologia Ltda.

[eu não gosto de respostas automáticas mas nesse caso foi
necessário]

Olá,

Eu agradeço o seu interesse em ser meu sócio. 

Como você deve presumir, ao colocar um anúncio procurando
por parceiros nessa empreitada em meu blog fez com que eu
recebesse e ainda continue recebendo diversas propostas de
candidatos à 'vaga'.

Alguns dos proponentes compreenderam que eu estava
procurando por um *sócio* e não por um funcionário. Outros
não entenderam direito essa idéia.

O primeiro e-mail que recebi foi de um candidato de Curitiba
que trabalhou na Conectiva (Mandriva) e que atualmente
trabalha em uma outra empresa de tecnologia daqui.

Seguimos adiante com as conversas e até o momento as
coisas estão num ritmo interessante.

A sociedade ainda não está 'sacramentada' porque tanto eu
quanto ele achamos que devemos esperar um pouco mais
para isso. Até lá vamos tocando um dos projetos da empresa
em parceria.

Esse e-mail então serve pra dizer que, até que se prove o
contrário, eu já encontrei um sócio desenvolvedor.

Em todo caso irei guardar todos os e-mails que recebi para
que no futuro, se as coisas não funcionarem com esse
candidato, eu volte a contactá-los.

Mais uma vez, perdoem-me pelo e-mail extremamente
"impessoal" e automático para uma questão tão séria e
pessoal como esta mas recebi muitos e-mails e respondê-los
um a um tomaria muito tempo de um jovem empresário que,
nesta etapa do negócio, tem um monte de trabalho difícil pra
fazer.

Obrigado pelo interesse,
Osvaldo Santana Neto
Triveos Tecnologia Ltda.

Persevere.


A Lição Final

Postado por Osvaldo Santana

A Lição Final

Dia desses eu estava trabalhando e ao olhar na barra do meu Google Talk eu vi que o Guido van Rossum (criador da linguagem Python) havia colocado o endereço de um vídeo no Youtube. Achei que era algum vídeo legal sobre Python e resolvi abrir.

Era o vídeo de uma palestra de um professor norte-americano que trabalhava na área de tecnologia de realidade virtual. Até aí nada de mais (eu sequer me interesso pelo assunto).

Continuei a assistir o vídeo por mais um tempo mais por “fé” na indicação do Guido do que por qualquer outra razão. Em certo momento do início da apresentação o professor, chamado Randy Paysch, mostra um Raio-X do fígado dele onde se conta 10 tumores e ele diz que tem entre 3 e 6 meses de vida.

Ele então começa a falar sobre sonhos e sobre como realizá-los. Sua habilidade como orador é invejável. Continuo assistindo a palestra. Me emociono.

Semanas depois leio na revista Época que esse vídeo havia se tornado uma febre no Youtube e que o professor Pausch estava preparando um livro com o conteúdo dessa mesma palestra juntamente com um amigo. Pensei (me esquecendo que o cara estava condenado à morte): pronto, mais um livro de auto-ajuda que vai deixar o autor rico.

A algumas semanas atrás fiquei sabendo que o professor faleceu e em uma de minhas passeadas em livrarias pude ver que uma tradução do livro já estava disponível no Brasil. Voltando do Rio de Janeiro, onde havia participado da PyConBrasil 2008, resolvi comprar o livro pra ler durante a viagem de volta.

A coincidência

Lendo o capítulo “24. O tolo que se redimiu”, onde o professor conta a história de um de seus alunos (chamado Tommy) que era fã de Guerra nas Estrelas e sonhava em trabalhar na produção dos filmes da saga, eu esbarro no seguinte trecho (página 135):

Quando me transferi para a Carnegie Mellon, todos os membros da equipe da Universidade da Virgínia me acompanharam — menos Tommy. Ele não podia se mudar. Por quê? Porque fora contratado pela Industrial Light & Magic, a companhia do produtor/diretor George Lucas. E note-se que ele foi contratado não por causa do seu sonho, mas sim por suas habilidades. No período em que participou do nosso grupo de pesquisa, Tommy se tornou um destacado programador de linguagem Python (grifo meu), por sorte dele a linguagem escolhida pela empresa de Lucas. E sorte mesmo é quando o preparo se une à oportunidade.

Não é coincidência? Eu conheço o cara através do criador do Python e voltando de uma conferência de Python eu leio que um dos alunos do cara realizou o sonho de trabalhar na Industrial Light & Magic porque conhecia Python.

O livro

No geral o livro é um complemento ao vídeo e foi escrito, segundo o autor, como uma forma de deixar uma mensagem para os seus filhos.

Seria um típico livro de auto-ajuda se não fosse a biografia de um professor que deixou uma mensagem muito bonita para sua família pouco antes de morrer. É um livro onde se encontra muitos “clichês”, muitos momentos piegas e que muitas vezes emociona o leitor (principalmente aqueles que já são pais).

Ele tem uma encadernação muito bonita com capa dura e um tamanho reduzido que o torna excelente para presentear os amigos. Por se tratar de um livro barato cuja leitura é muito rápida (li ele em 1 dia) eu recomendo a todos que tem seus sonhos e gostariam de realizá-los. Mais ainda àqueles que tem filhos.

Para comprar:

Submarino (mais barato no momento em que faço esse post)

Livraria Cultura

Lojas Americanas (dica do Prof. Marco André)


Rio de Janeiro com uma dose de velhos amigos

Postado por Osvaldo Santana

Como vocês puderam ler no meu post anterior eu fui até o Rio de Janeiro para participar da PyConBrasil 2008.

O evento estava fantástico e eu ainda tive o prazer de ficar hospedado na casa do meu velho amigo Luigi (vulgo Luiz).

Nessa minha curta permanência por lá pude conhecer a família dele: a esposa Mary e o filho Victor. Conhecia a esposa dele só por fotos e imaginei que ela seria antipática. O resultado? “Dei com os burros n’água”. Ela consegue ser mais simpática e legal que o próprio Luigi! :D

O Victor tem os mesmos trejeitos do meu filho Matheus. Apesar de ser um pouco mais novo que meu filho o Victor conversa muito mais e pronuncia as palavras muito melhor que ele. Garoto inteligente que ficou brincando de Hot Wheels e de montar quebra-cabeças comigo :)

Eu conheço o Luigi desde que nós morávamos em São José do Rio Preto e dávamos aula de programação (eu em Clipper e ele em Pascal) na falecida Microline. Lá, nessa escola, eu passei um dos períodos mais divertidos da minha vida.

Não tínhamos muito dinheiro para fazer as coisas mas mesmo assim conseguiamos colecionar HQs, jogar RPG, jogar os adventures da Lucasart, desenvolver programas de computador, ter aulas de hardware, caminhar pela linha do trem até as cidades vizinhas, montar circuitos eletrônicos, passear dentro de cavernas, fazer tour em exposição de flores (Holambra), trocar tiros de bolinhas com pistolas de brinquedo, etc, etc, etc…

O Luigi é gerente de TI de uma universidade no Rio de Janeiro (Unisuam) mas ainda reserva tempo para desenvolver os seus projetos (que inveja! :D ).

Ele me apresentou o “segundo filho” dele que é um robô com seis pneus e tem uma placa mini-ITX como “cérebro”. Me falou sobre uma “motherboard” que está trabalhando a meses dentro de um recipiente com óleo mineral (ele quer fazer um cluster refrigerado com óleo mineral). Ele também me mostrou um POV (Persistence of Vision) que ele fez com o Arduino dele.

Como vocês podem ver o Luigi é o cara. Ele consegue, como poucos, ter uma inteligência acima do normal e uma capacidade de execução invejável.

Eu também fiquei feliz ao ver que eu também estou mais magrinho do que ele ;)


« Artigos anteriores