tucaz.blog.now() Rotating Header Image

Você é importante?

Reza a lenda[1] que, trabalhando na Apple, a qualquer momento você pode encontrar Steve Jobs e ouvir dele a seguinte pergunta: “O que você faz aqui?” e, caso ele não goste da resposta você pode ser demitido na hora.

Apesar de essa ser uma atitude drástica, acho que faz bastante sentido, principalmente no cenário de desenvolvimento de software. Alguma vez você já se perguntou o que realmente faz na empresa onde trabalha? Se a resposta for tão simples como “escrevo código” talvez você esteja prestes a ser (merecidamente) demitido promovido ao mercado de trabalho . Mesmo como programador seu trabalho não é apenas escrever código, mas sim transformar idéias em maravilhas tecnológicas que vão fazer seu usuário delirar e com isso agregar valor para a empresa ou qualquer outra coisa que o valha. Isso vale para todas as posições.

Desde gerentes (que tradicionalmente só controlam cronogramas, ou seja, fazem nada) até gerentes de produto que ficam pra cima e pra baixo mandando as pessoas fazerem coisas. O ponto é, se você não contribui para o produto final você é inútil, totalmente dispensável e deveria arrumar uma outra coisa pra fazer. Sua contribuição não precisa ser necessariamente técnica (com código), mas também com soft skills (organização, segurança, criatividade, etc) que ajudem efetivamente seu time a chegar ao objetivo.

Acho que esse é um ponto importante de reflexão. Para sermos melhores no que fazemos temos que entender realmente o que queremos e temos de fazer.

O que você acha?

[1] – Segundo relatos existentes de (ex) funcionários no livro “A cabeça de Steve Jobs”

Cuidado com os especialistas!

Hoje em dia com toda essa modernidade (como diria minha vovó) e a facilidade na disseminação da informação que a internet nos trouxe surgem a cada dia mais e mais especialistas. Em cada esquina da internet é possível encontrar um. Não importa o assunto.

O cara começa com um blog ou um grupo de discussão, manda bastante tweets, adiciona uma pitada de promoção pessoal em todo canto, dai avança pra meia dúzia de palestras e até se propõe a ministrar um curso sobre o assunto. De repente, em poucos tempo virou especialista E referência no assunto!

Vendo tanta propaganda você deve achar que o cara tem muita experiência e é uma ótima fonte de informação. Boa fonte de informação pode até ser, mas repetir tudo que ve como um papagaio é ser um especialista? Ministrar cursos e posar de conhecedor do assunto apenas com conhecimento teórico é suficiente? É ético?

Será que é essa mesmo a definição de especialista que procuramos? Ainda mais sobre assuntos não técnicos ou soft-skills onde toda a bagagem e experiência que podemos conferir é escrita/falada?  São essas nossas referências?

Tenha cuidado quando alguém lhe apresentar o título de “Especialista em XYZ”. Papel e meios de comunicação similares aceitam qualquer coisa, já dizia minha professora na quina série.

Infelizmente não há maneiras práticas e fáceis de reconhecer falsos especialistas. O único jeito é desconfiar sempre e não disseminar informações baseadas na falácia da autoridade. Seus amigos, seu chefe e seu bolso agradecem!

Lidando melhor com WCF – Ciclo de vida no cliente

<Importante>

Todos sabem que WCF é uma plataforma poderosa e extensível. O que muita gente não sabe é que WCF é para poucos.

WCF é uma plataforma que permite a construção de sistemas distribuidos e sistemas distribuidos raramente são necessários. De maneira simplificada, podemos dizer que um sistema é distribuido quando tem seus componentes instalados em mais de um computador.

O problema da construção de sistemas distribuídos é que devido a não centralização de seus compnentes existe um overhead de comunicação entre os computadores e serialização/deserialização de objetos e isso consome muita memória e banda de rede.

Como gastamos mais recursos do que necessário temos como resultado final um aumento no tempo de resposta e gasto extra de hardware que, as vezes pode ser um problema grave além é claro do aumento da complexidade técnica.

No entanto, não sei por qual motivo, no momento em que lançou o produto, a Microsoft esqueceu de avisar seus “consumidores” a respeito destes pequenos detalhes. Talvez porque queria promover o produto?

</Importante>

<Importante 2>

WCF é uma tecnologia relativamente simples, mas apenas depois que você entende o BeABá da coisa (ou ABC[1] no caso do WCF). Até lá, qualquer coisa que fuja do point&click que o Visual Studio nos oferece é relativamente complexo.

Portanto, sugiro que antes de aplicar WCF você procure entender um pouco mais dos fundamentos e do papel de cada objeto que ele utiliza.

</Importante 2>

Agora que entendemos que não devemos usar WCF em toda aplicação que construimos (talvez isso seja tópico pra outro post?) vou falar um pouco da experiência que estou tendo com esta tecnologia e das boas práticas e atalhos que conheci.

Pretendo fazer uma pequena série e pra começar vou abordar boas práticas de consumo de serviços WCF, ou em outras palavras, como acessar um serviço WCF a partir de um cliente da maneira mais eficiente possível.

Para que seja possível consumir um serviço WCF é necessário que alguém o tenha publicado e também que tenha disponibilizado o WSDL[2] do serviço.

O WSDL nada mais é do que um arquivo XML que descreve quais são os tipos de dados que o serviço irá trafegar e quais operações ele oferece.

Geralmente, assim que temos um WSDL para consumir vamos ao Visual Studio e utilizamos a funcionalidade de Add Service Reference que ele nos oferece para gerar o objeto proxy que irá cuidar pra nós da comunicação com WCF. A partir dai utilizamos este objeto em toda nossa aplicação. E este é o nosso maior erro.

Este proxy, gerado pelo Wizard, encapsula todas as classes necessárias para ler o WSDL, criar os tipos necessários e lidar com os canais de comunicação em cada operação que executamos. No entanto, ele o faz da pior maneira possível.

Cada vez que invocamos uma operação através deste proxy, ele cria uma instância da classe ChannelFactory<T>. Esta classe é responsável por ler as configurações definidas em nosso app.config e baseado nestas configurações abrir os canais de comunicação com o serviço que iremos consumir. Este processo é muito lento, pois todos os sockets, listeners e objetos necessários da própria infra estrutura do WCF são criados e configurados neste momento.

No entanto, este processo não precisa ser feito a cada chamada para o serviço WCF uma vez que estas informações não mudarão enquanto a aplicação estiver rodando. Então, para otimizar bastante o consumo de serviços devemos ignorar o proxy gerado pelo Wizard e cuidar da criação e destruição de canais nós mesmos mantendo este objeto (ChannelFactory<T>) como Singleton que irá durar pelo tempo de vida da aplicação. Dessa forma toda vez que chamamos uma operação remota não existe a necessidade de executar o setup e tear down desse objeto.

Para facilitar a gerência desses objetos construi uma pequena DLL que é composta apenas de uma classe. O código está disponível no github e a DLL compilada está aqui. A documentação inicial também está lá. Tudo pronto para ser usado.

Referências adicionais (e importantes)

[1] ABC = Address, Bindings e Contracts
[2] É possível consumir um serviço WCF sem acesso ao WSDL, mas este é um cenário pouco comum

[Off-Topic] Problemas com monitor Samsung e exemplo de péssimo atendimento

Não costumo fazer esse tipo de off-topic, mas essa situação me revolta simplesmente pelo fato de não poder fazer nada além de reclamar e “chorar” por ai.

Em dezembro de 2007 adquiri um monitor Samsung 2232BW pelo valor de R$1027,00. Até onde eu sei esse valor não é baixo e tem gente que não ganha isso em um ano inteiro de trabalho.

Pouco mais de 2 anos passados, mês passado ele começou a apresentar um problema com seu painel. Isso já me deixou p*** da vida, pois 2 anos de vida útil em um produto deste valor é rídiculo. Meu CRT 17 nunca deu um problema em quase 5 anos que ficou em uso.

Como um monitor equivalente hoje custa na faixa de R$500, decidi que valeria a pena tentar levar meu monitor para conserto e caso o custo do serviço ficasse em até R$200,00 acredito que compensaria.

Procurei no site da Samsung as assistências técnicas autorizadas, que apesar de serem terceirizadas, levam o nome Samsung e deveriam responder com o  mesmo padrão de qualidade que a Samsung vende em seus produtos e encontrei 3 em um ráio de 20km da minha casa. Fui as três e realmente conclui que elas atendem seguinde o mesmo padrão inexistente de qualidade da Samsung com filas de mais de uma hora e meia apenas para ser atendido na recepção pra tentar descobrir se é possível o conserto e qual seria o valor.

Conclusão: é mais fácil ser atendido no poupa tempo ou em um posto do INSS do que em um serviço autorizado da Samsung que iria receber pelo atendimento.

Obrigado Samsung pelos momentos de frustração e pela demonstração de como operar um negócio onde o cliente claramente não tem importância nenhuma além, é claro, de me colocar em uma posição onde eu tenha que implorar para ter meu monitor consertado!

Qual é a dos apertadores de botões?

Não importa onde eu vá, seja a empresa grande ou pequena, sempre existem pessoas dos dois grupos: apertadores de botões e as pessoas que vão pra frente.

As pessoas que vão pra frente são fáceis de identificar e não me interessa falar muito sobre elas neste post. Elas estão sempre empolgadas, comentam a respeito de novidades e procuram fazer ela e as pessoas em sua volta prosperarem, mesmo quando essa não é a intenção.

Já os apertadores de botão estão sempre na mesma. O incrível é que esse perfil (ou falta de perfil?) existe em todos os papéis e profissões. DBAs -que só rodam scripts e não analisam o log (nem quando solicitado!) pra ver o que aconteceu e ajudar o pobre desenvolvedor que não tem acesso ao DB-, Desenvolvedores -que programam o que está especificado não importando o quão errado esteja do ponto de vista técnico ou funcional-, entre muitos outros.

No entanto, podemos ainda criar outra categoria de apertadores de botões: os que fazem apenas tarefas repetitivas. Quem nunca viu o “operador de computador” (acho que essa expressão é do mesmo tempo CPD) que todo dia, o dia inteiro, fica copiando/alterando arquivos de lá pra cá, sempre igual?

Por mais que eu não goste do meu trabalho (ainda bem que eu gosto!), acredito que devemos tirar o melhor proveito dele. Ou melhor, devemos tirar o melhor proveito de tudo que fazemos na vida. Portanto, o que motiva uma pessoa a executar o mesmo processo igual todo dia sem nem mesmo pensar em uma maneira de automatizá-lo ou de faze-lo de maneira diferente?

Mesmo que você não consiga remover todos os processos repetitivos ou não crie uma obra de arte quando conseguir é importante tentar. Não importa se você vai ser reconhecido por isso, não importa se você irá ganhar $algo$ em troca e não importa se você não é pago pra automatizar nada. Faça por você! Mesmo quando o esforço não valer a pena você vai no mínimo ter aprendido alguma coisa nova.

Portanto, se você se encaixa em algum desses perfis, já passou da hora de se mexer e mudar, não acha?

Reunião .NET Architects em 16/01/2010 – Referências

Ontem durante a reunião do nosso grupo de discussão de .NET o Fabio Galuppo falou sobre um pouco sobre F#. A apresentação foi muito boa e logo após, durante a “mesa redonda”, eu mencionei uma série de aulas gravadas na Universidade de Berkeley sobre o assunto Linguagens Funcionais. É o curso completo gravado. Como o pessoal se interessou e pediu os links ai vai:

Depois da reunião oficialmente terminada fomos almoçar e como acabamos entrando no assunto de gestão de projetos comentei um pouquinho a respeito de gestão democrática e prometi deixar alguns links disponíveis:

Eu não uso Scrum porque Scrum não funciona!

É Isso ai! Scrum não funciona!

Sabe porque Scrum não funciona? Porque se chama Scrum. Esse hoje é o maior problema do Scrum. Há dois anos atrás pouquíssimo se falava nisto que hoje virou hype. Nessa época as pessoas só falavam que usam Scrum depois de estudar bastante, trocar experiências e exercitar bastante. Ai sim alguém tinha coragem de dizer “Eu uso Scrum” e ainda assim com um pouco de receio, pois sabiam que tinha mais coisas além de apagar toda documentação do projeto e e quebrar as cadeiras pra fazer as reuniões em pé. As pessoas (a maioria) que diziam isso sabiam o que estavam dizendo. Scrum tinha credibilidade.

Nessa época, essas pessoas que conheciam agiram como evangelizadores do Scrum e finalmente ele atingiu as massas. No entanto, hoje o que mais se ouve são times/pessoas que não tem a menor idéia das noções e fundamentos por trás do Scrum ou qualquer outro processo/metodologia/framework ágil dizendo que são praticantes de Scrum. Até gente que nunca participou de um projeto usando Scrum hoje vende Scrum.

Isso é propaganda ruim. E propaganda ruim se multiplica muito mais rápido do que a boa. O pior da propaganda ruim é que cria-se ainda mais preconceito em cima de algo que já encontra resistência naturalmente. Isso tira todas as chances de sucesso de uma implementação de Scrum. Estou cansado de ver em todos os lugares pessoas frustradas dizendo que tentaram implantar Scrum em suas empresas e não conseguiram. Mas é claro que não! O filme do Scrum já está queimado. Você vai falhar antes mesmo de tentar.

Já faz um tempo que eu parei de vender a idéia de usar Scrum. Desde então eu digo que eu procuro executar práticas ágeis. Soa mais leve, mais simples. O pré-conceito diminui dessa forma e a resistência também. Do que importa se meu facilitador chama Gerente de Projetos ou Scrum Master? As pessoas se preocupam mais com nomes do que com resultados e esse é o problema. Agilidade é o que há, mas funciona melhor sem rótulos.

Verbos HTTP: GET e POST. Você sabe mesmo a diferença?

Até pouco tempo atrás quando eu fazia entrevistas a fim de contratar desenvolvedores, não importando o nível, eu fazia a mesma pergunta: “Você sabe a diferença entre GET e POST em uma request HTTP?”. Por incrível que pareça poucas pessoas sabiam responder. Na maioria das vezes alguém que se considerava um desenvolvedor web não tinha a menor idéia  sobre o que eu estava falando. Acho que era culpa do RH que fazia uma pré-seleção muito ruim, mas anyway…

Hoje essa informação já chegou a maioria dos desenvolvedores web (já era hora, não?) então a pergunta no contexto original perdeu um pouco a validade. Todo mundo sabe que enviar formulários via GET manda as informações pela querystring e que POST manda encapsulado dentro da request e bla bla bla. No entanto, com a nova “moda”, que acho bem bacana aliás, de REST(ful) a pergunta ganhou um contexto novo e tornou a ser válida: você sabe qual a diferença dos verbos em uma request HTTP? Não só de GET e POST, mas de todo o resto?

Decidi fazer esse post rápido enquanto retomava meus estudos a respeito de WCF e assistia a um vídeo do MIX do ano passado que está no final deste post.

POST não escala, GET sim. Porquê? Por causa da semântica! POST, PUT, DELETE e outros verbos são por definição non-safe e com efeitos colaterais, ou seja, é esperado que uma request usando esses verbos modifique algum recurso. Dessa forma é impossível fazer cache desse tipo de chamada. E como todos nós sabemos, sem cache = sem escalabilidade, isn’t that right?

Vamos tomar como exemplo uma chamada a URI imaginária: http://meusite.com.br/usuario/novo passando via POST todas as informações necessárias para se criar um usuário. Se tudo correr bem, vamos receber como resposta um HTTP Status Code 201 indicando que o recurso foi criado e a URL para acessa-lo. Provavelmente algo como http://meusite.com.br/usuário/765.

Agora a pergunta: é seguro para os intermediários dessa request tais como proxies, clientes, etc efetuarem o cache disso? Não! Imagine um usuário do sistema que utiliza esse recurso tentando cadastrar um novo usuário com os mesmos dados. Ao invés de receber uma resposta de conflito ele receberia um status 201 dizendo que o recurso foi criado. De fato o recurso foi criado, mas será que deveriamos mostrar isso pra ele quando na verdade a criação desse recurso já havia acontecido e a ação que ele executou neste momento não trouxe sucesso? Acho que não.

Já o GET, por definição é cacheavel, pois não possui efeitos colaterais. Ele apenas devolve o recurso desejado sem modificar nada. Claro que isso só acontece quando bem usado, pois tem muita gente que utiliza esse verbo de maneira errada e baseado em parâmetros executa ações que deveriam ser associadas a outros verbos HTTP. Como não modifica nenhuma informação é possível efetuar o cache desse recurso com segurança.

Pra quem quiser ver mais a respeito de REST, GET, POST e cache, basta acessar o vídeo no site do MIX 09.

De volta a terrinha

Acho que todo mundo já sabe, mas para aqueles que não sabem ainda voltei ao Brasil no mês passado. A idéia era ir para os EUA e ficar por lá, mas como nem tudo na vida são rosas tive uns problemas familiares por aqui que fizeram com que voltasse. A idéia de me mudar daqui ainda é muito forte e vai acontecer. Só teve de ser postergada um pouquinho :)

Apesar de voltar pro Brasil continuo trabalhando pra HNI, mas de maneira remota, o que não deixa de ser uma experiência bem interessante dada a diferença de timezone e dificuldade de comunicação.

Isso quer dizer que vou voltar a postar bastante no blog como eu fazia antes? Espero que sim, mas agora vou fazer um pouco diferente e gostaria de um feedback de quem lê pra ver se estou agradando ou não. A idéia do blog foi sempre postar coisas que eu acho interessante e conheço, mas com alguma experiência prática e opinião pessoal no assunto. Isso faz com que os posts saiam relativamente grandes e demorem muito para serem escritos (da trabalho, mesmo que o resultado final não seja o melhor do mundo! eheheh).

Por conta dos problemas do dia a dia e da natureza do meu atual trabalho posts assim vão ficar um pouco mais raros, mas quero aumentar sua frequência em breve. Enquanto isso, vou compartilhar informações mais curtas, comentários menores e links que acho que valham a pena divulgar.

Além disso, também estou fazendo uns tweaks no blog e um deles que já pode ser visto é o de idiomas. Quando acessarem o blog pela próxima vez via HTTP o plugin vai identificar sua origem e direcionar para os posts na lingua correspondente: inglês ou português. As duas línguas vão ficar disponíveis, mas será necessário clicar no post de outro idioma para le-lo.

O endereço direto para os posts em inglês é: http://blog.tucaz.net/en e para os posts em português é: http://blog.tucaz.net/br.

Dessa maneira contínuo escrevendo em inglês e praticando o idioma e posso escrever também em portugûes conteúdo que acho que valha a pena apenas para nós brasileiros (como é o caso do próximo post que está na fila).

Ainda não sei exatamente como os feeds vão se comportar, mas vamos descobrir em breve. :)

Por último, caso encontrem problemas com o feed ou com o blog ou tenham comentários ou perguntas de qualquer natureza, POR FAVOR me avisem pra eu melhorar/resolver o que for necessário. Okidoki?

Soçarba

(Inglês) [Book Review] Startup

Desculpe, mas este post só está disponível em Inglês.