English readers and other languages: Many posts are in portuguese, you can use the Translate button at left side.

Clique nas imagens dos artigos! Elas levam você para o site do artista que a criou e muitas
vezes tem assuntos relacionados ou outras imagens para expandir seus horizontes!
Mostrar mensagens com a etiqueta Produtividade. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Produtividade. Mostrar todas as mensagens

segunda-feira, 21 de dezembro de 2009

Administrando por Objetivos


O lendário Rowan (esquerda) com o General Garcia (direita)

Administrando por Objetivos

Quando você estabelecer metas, lembre-se que as metas só serão possíveis se houver meio para isto.

Textos como a famosa 'Carta para Garcia' falam sobre capacidade de automotivação e independência na solução de problemas, mas não tem nada a ver com milagres que tantas empresas tentaram explorar e até hoje vemos isto acontecer.
E sim, sabemos que nem tudo que tem ali é verdadeiro, mas vale a estória.

Nos tempos recentes, e isto se repete a cada tantos anos, por causa de uma tal de crise que foi causada por excessos de gastos e mau gerenciamento, noutros países ou no nosso, houve muito oportunismo em cortar custos e cobrar atitudes verdadeiramente heróicas do tipo que só uma mãe desesperada é capaz de fazer para salvar a vida de um filho.
Porém a menos que o CIO tenha colocado a própria mãe para trabalhar para ele e dito que ele perderia o emprego, a mulher e os filhos, este tipo de expectativa tende mais a ser um fator desmotivador para a equipe.

Em resumo, se você precisa de resultados, lembre-se de que o pessoal da sua equipe também espera ter resultados da sua parte.
Apenas pedir, pedir, pedir para fazer com quase nada ou pouco em troca, são atitudes que vão custar muito mais no futuro, seja por trabalhos mal feitos ou incompletos, seja por falta de elementos, ferramentas de trabalho, etc adequados.

As coisas tem custo. Se a empresa não pode, ou simplesmente não quer pagar por algo, não pode esperar transformação de água em vinho.

O melhor, é ser realista, prover as necessárias condições de trabalho e liberdade inclusive, necessárias.

A Carta para Garcia, fala de alguém que recebeu uma missão sem contestar, mas note bem, não colocaram empecilhos para que alcançasse o objetivo. Realmente foi uma condição extrema, mas ele não tinha um chefe atrás dele pegando no pé. O mérito foi dele, não do chefe.

Vou repetir para o pessoal que adora usar metodologias da moda e textos motivacionais: o mensageiro recebeu uma missão mas ninguém ficou em cima dele querendo impor como ele deveria fazer. Ou seja: se tem pessoas de talento, deixe elas trabalhar! E se fizerem milagres por você, seja ao mínimo justo e dê muito mais que a porcaria de um tapinha nas costas. Valorize realmente!

A empresa é de todos. É fácil ser uma empresa grande, difícil é ser uma grande empresa. 


P+
21/12/2009 
.'.

quinta-feira, 5 de novembro de 2009

Como ser um bom programador

Foto: riebschlager

Como ser um bom programador


Programação é uma atividade intelectual, racional, emocional, artistica, espiritual e mística. Tudo depende do como cada pessoa vai trilhar este caminho.

Seguindo na proposta de comentar sobre otimização, desenvolvimento e outras coisas, coloco então algumas observações que tenho coletado, observado e principalmente, vivenciado nestes anos todos.

Tornar-se um bom programador tem a ver com desenvolver suas habilidades pessoais em primeiro lugar. Ter gosto pelo estudo mas sem se apegar a dogmas e paradigmas. Estar pronto a revisar conceitos. Procurar fazer o melhor de si.

Claro que aprender tecnologias é importante, mas de nada adianta decorar milhares de parágrafos de informação se na parte da interação social entre você e as demais pessoas, o computador ficar como uma barreira.

O programador realiza a tarefa de projetar em detalhes e traduzir para o computador uma determinada tarefa humana. É isto que deve ser lembrado, os computadores devem estar a serviço da humanidade e é por isto que é sempre bom aprender sobre as pessoas.

Nosso trabalho é aprimorar as maneiras de se conseguir isto, mesmo que seja trabalhando muito mais para que outros possam trabalhar muito menos.

Acredite que você pode fazer melhor e trabalhe para isto.

Se você encontrar algo errado, arrume. Não interessa quem fez, se está na sua mão é responsabilidade sua melhorar ou resolver o problema.

Simplifique a vida do usuário. Seu programa deve ser simples e fácil de usar. Inclua tratamento decente de erros, com mensagens claras e objetivas. Crie tratamento automatizado para os erros mais comuns.

Teste seu programa de todas maneiras. Teste seu programa de todas maneiras. E principalmente, teste seu programa de todas maneiras. Só porque tem um botão na tela, não pense que alguém vai clicar direto nele. É mais provável que vão fazer de tudo, e as vezes, até clicar o maldito botão.

Documente seu código. O código deve ser claro, auto-documentado. Evite siglas e menmonicos, prefira nomes auto-explicativos.

Use bem os recursos de máquina. Boa performance economiza tempo, energia e ajuda a conservar o meio ambiente.

Dedique o tempo necessário para conseguir uma boa solução. Mas não gaste mais tempo do que o benefício que se pretende conseguir.

Identação de código é obrigatório. Desculpe, mas se você não entende nem isto, por favor, mude de ramo, esqueça programação e nunca mais chegue perto de um programa.

Lembre que algum dia alguém vai ter que mexer neste programa. Pode ser até você mesmo, mas com certeza, os comentários e clareza do código serão de imensa ajuda.

Evite malabarismos desnecessários só para mostrar que aprendeu alguma mágica diferente.

Elimine código inútil ou sem uso.

Fuja do código spaghetti tanto quanto possível.

Divida o programa em pequenas secções, use funções, etc.

Pense no que está fazendo. Longas cadeias de IFs ou IFs quilométricos, que se extendem por páginas e páginas são uma fonte certa de dor de cabeça e não tem a mínima justificativa.

Faça modelos ou programas de exemplo para testar o funcionamento das diferentes partes, algoritmos e/ou funcionalidades.

Nenhum otimizador de programa ou SQL ou seja o que for, vai fazer milagre se o seu código for mal feito. Pode até melhorar um pouco e virar um código mal feito otimizado. Otimizadores funcionam bem mesmo é com código razoavelmente bem feito. Nenhum deles vai fazer milagre em arrumar lógica absurda.

Máquina mais rápida faz código ruim rodar um pouco menos devagar. Melhore o código até chegar ao equilíbrio entre tempo de desenvolvimento versus custo de hardware.

Lembre, programar é a arte de dizer ao computador quais são os passos que deve executar com as informações. Ponto. Portanto, estude lógica e pratique.

Verifique, compile, teste seu programa com frequencia.

Leia seu código fonte. Quanto mais você ler o código fonte, melhor vai ter compreensão dele.

Use padrões.

Reutilize código que funciona. Crie funções genéricas para atender necessidades comuns.

Use sua auto-crítica.

Otimize. Reotimize. Melhore e aperfeiçoe.

Adote um padrão de codificação.

Foto loupiote (Old Skool)

Não seja preguiçoso. Fazer algo correndo pode lhe custar dez vezes mais tempo mais tarde. Ao invés de ser preguiçoso, use sua criatividade para desenvolver ferramentas que vão tornar seu trabalho mais fácil. Lembre, no início havia apenas a linguagem de máquina. Depois algum programador criou o Assembler e as linguagens de programação que facilitaram tudo.

São os programadores quem vão criar as ferramentas que serão usadas amanhã, portanto, não espere encontrar tudo pronto nalguma ferragem.

KISS. Sigla de "Keep It Single Stupid". Tradução: Faça isto simples estúpido!

Código bom é código simples. Mesmo que seja uma rotina complexa, pode ser feita com clareza a objetividade.

Não se case com nenhuma idéia. A pior coisa é você estar atrelado a uma grande idéia e ter apenas uma única grande idéia.

Mantenha contato com seus superiores e usuários para saber se vocês estão indo na mesma direção.

Converse com outros desenvolvedores para debater sobre o código, algoritmos, metodologias, etc. Conversa de bar está liberada.

Mantenha-se informado e adote novas tecnologias sempre que adequado.

Estudar novas tecnologias e também outras áreas, incluindo ciências humanas, lhe trazem idéias, inspiração e conhecimento sobre diferentes maneiras de fazer as coisas, de pensar, analisar e solucionar problemas.

Aprenda outras linguagens e principalmente, aprenda a programar de maneira diferente pois cada linguagem tem conceitos diferentes. Se você faz a mesma coisa com linguagens diferentes, está desperdiçando o potencial que cada ferramenta possui. É por isto que vejo tanto programa spaghetti feito em linguagem Java!

Não existe uma linguagem que seja ótima para tudo. Se necessário, adote linguagens que possam ser complementares, utilizando o melhor de cada uma, de acordo com a necessidade a ser atendida.

Pense para o futuro! A sigla de tecnologia da moda de hoje, será ultrapassada em dois anos.
Em cinco anos você vai descobrir que a linguagem atual é muito mais parecida com a linguagem de 20 anos atrás do que você pensa.
Em dez anos você vai saber que os princípios continuam os mesmos, apenas temos ferramentas melhores, hardware mais rápido e barato.
Boa parte das melhores ferramentas de hoje, foram idealizadas e desenvolvidas pelos que já pensavam nelas a 20 ou 30 anos.
Se você duvida, é só ler os livros e manifestos dos anos 70 e 80.

P+
05/11/2009



Leia também:



.'.

quarta-feira, 4 de novembro de 2009

Manifesto pelo Desenvolvimento Ágil de Software

Manifesto for Agile Software Development


Gostei desta e presto meu apoio:


Manifesto para Desenvolvimento Ágil de Software


Estamos descobrindo maneiras melhores de desenvolver
software, fazendo-o nós mesmos e ajudando outros a
fazerem o mesmo. Através deste trabalho, passamos a valorizar:

Indivíduos e interações mais que processos e ferramentas.

Software em funcionamento mais que documentação abrangente.

 Colaboração com o cliente mais que negociação de contratos.

Responder a mudanças mais que seguir um plano.
 
Ou seja, mesmo havendo valor nos itens à direita,
valorizamos mais os itens à esquerda.




Princípios por trás do Manifesto Ágil

Nós seguimos estes princípios:
  Nossa maior prioridade é satisfazer o cliente
através da entrega contínua e adiantada
de software com valor agregado. 


Mudanças nos requisitos são bem-vindas,
mesmo tardiamente no desenvolvimento.


Processos ágeis tiram vantagem das
mudanças visando vantagem competitiva para o cliente. 


Entregar frequentemente software funcionando,
de poucas semanas a poucos meses,
com preferência à menor escala de tempo. 


Pessoas de negócio e desenvolvedores devem trabalhar
diariamente em conjunto por todo o projeto. 


Construa projetos em torno de indivíduos motivados.

Dê a eles o ambiente e o suporte necessário
e confie neles para fazer o trabalho. 


O método mais eficiente e eficaz de transmitir
informações para e entre uma equipe de desenvolvimento
é através de conversa face a face. 


Software funcionando é a medida primária de progresso.
Os processos ágeis promovem desenvolvimento
sustentável. Os patrocinadores, desenvolvedores e
usuários devem ser capazes de manter um ritmo
constante indefinidamente. 


Contínua atenção à excelência técnica e bom design
aumenta a agilidade. 


Simplicidade--a arte de maximizar a quantidade de
trabalho não realizado--é essencial. 


As melhores arquiteturas, requisitos e designs
emergem de equipes auto-organizáveis. 


Em intervalos regulares, a equipe reflete sobre como
se tornar mais eficaz e então refina e ajusta seu
comportamento de acordo.




Site do manifesto: http://www.agilemanifesto.org

.'.

quinta-feira, 29 de outubro de 2009

Adicionar Hardware Não Compensa Software Lento

Relação de Amor e Ódio
Foto: Jay Murdock

Adicionar Hardware Não Compensa Software Lento
29/10/2009

Por causa da redução do preço do hardware ou limitações de desenvolvimento (tempo, experiência, etc), tornou-se prática comum colocar mais máquinas para compensar o fraco desempenho dos sistemas.

Além de maior consumo de energia e dos impactos ambientais, isto não significa tanta melhoria assim nos resultados.

"Você é programador? Quer fazer algo pelo meio ambiente e mesmo, fazer do mundo um lugar melhor? Então comece a otimizar seu código! - Jeff Atwood."


Simplesmente colocar mais equipamento tem sido a solução preferida ao invés de fazer o software rodar mais rápido com o hardware existente. Fazer mais com menos é uma regra importante a ser lembrada, tanto quanto a Lei de Wirth: "Software fica lento mais rápido do que o hardware acelera."

Como resultado, isto anula os ganhos com a Lei de Moore!!! O hardware fica mais rápido a cada 18 meses, mas o software dobra de tamanho, fica maior, mais lento.

Jeff Atwood sugere alguns passos para começar:
  1. Coloque hardware mais rápido e barato para o problema de performance.
  2. Se o aplicativo atingir sua meta de performance, pare por aí mesmo.
  3. Faça benchmarks para determinar aonde estão os problemas de performance do seu software.
  4. Analise e otimize as áreas que você identificou no passo anterior.
  5. Se agora o aplicativo atingir sua meta de performance, pare por aí mesmo.
  6. Volte ao passo 1.

Outra coisa importante a observar é quais aspectos otimizar, como por exemplo, a interação com o usuário. Um tempo de resposta de até um segundo é até aceitável. A partir de um segundo, isto já chama a atenção do usuário e pode começar a irritar. Se passar de dez segundos (máximo!), o usuário vai perder a linha de raciocínio e passar a fazer outras coisas enquanto espera.

Para grandes volumes de dados também existirão os aspectos de tempo de execução e da quantidade de volumes alocados durante o processamento, que certamente afeta outras tarefas que poderão estar sendo feitas.

Otimização de performance envolve mais testes e menos adivinhação. Quando se pensa numa escala de milhões de operações por segundo, qualquer detalhe pode ser importante. Mas também existem detalhes que tomam tempo e não valem a pena otimizar.

Com certeza, a otimização requer conhecimento efetivo e prática dos recursos e técnicas adotadas.

Pessoal com menos experiência vai ter melhores resultados se trabalhar em grupo e utilizarem intensos benchmarks para analisar cada porção do software.

E claro, isto vale para mim e para todos: Sempre estude. Procure aprender de quem sabe mais que você. Graças a internet, hoje alguns dos melhores programadores do planeta mantém sites, blogs, etc com um amplo conjunto de informações e código fonte que merecem ser cuidadosamente estudados.

Dica: soluções de estruturas de lógica, de "como fazer", podem ser feitas com diferentes linguagens, portanto, amplie seu foco de estudos. Como se diz faz décadas, basicamente "quase tudo são IFs e assinalamentos."

As vezes, descobre-se que seria mais desejável reescrever o software. Isto deve ser considerado quando:
  1. O código for efetivamente ruim ou mau feito;
  2. A solução atual puder ser realmente melhorada;
  3. Houver incompatibilidade na maneira que o código faz o processamento, em relação a algum outro recursos, normalmente externo.

E lembrando, muitas vezes o código é reescrito apenas porque o programador não entendeu o que foi feito. Geralmente falta estudar o código. Portanto, antes de qualquer coisa, estude o código e a solução de lógica adotada, conheça a ferramenta ou linguagem que está usando.

Soluções de automatização de performance, como as existentes nos gerenciadores de banco de dados e, em certas linguagens de programação, podem muitas vezes ser uma armadilha. As pessoas acham que o computador vai resolver sózinho o trabalho de melhorar a execução do código, mas esquecem completamente que isto vai ser feito de acordo com algumas regras padronizadas. Logo, com frequencia os resultados podem ser bem fracos em relação ao esperado.




Leia também:




.'.

sexta-feira, 9 de outubro de 2009

Créditos - Imagens são mais que 1.000 palavras

Foto: Fabio Teles

Acho que atrás de uma imagem estão idéias, pensamentos, sensações.

Além de procurar imagens que relacionem-se de alguma forma com os assuntos abordados nos meus artigos que escrevo no blog, assim como capas para os vídeos, procuro conteúdo que se relacione de alguma forma ao assunto.

Cliquem nas fotos! Eu coloco o link para o site do autor e cada imagem postada por mim na maioria absoluta das vezes vai lhe levar para conhecer um novo mundo, o trabalho de outra pessoa e surpresas muito agradáveis lhe esperam! 

Faço questão de prestar os merecidos créditos aos autores e colocar o link para a fonte original. 
É mais do que simplesmente resguardar e valorizar o trabalho quem fez. É também para mostrar aos meus leitores outras fontes, visões diferentes, abrir muitas janelas e portas. 

Tenham certeza de que cada imagem eu escolho entre milhares que tenho salvas no meu acervo pessoal, e procuro sempre algo relacionado. 

Quando vocês clicam o link para o local aonde a mesma foi encontrada, ou o site do autor, poderão estar outras imagens, assuntos, enfim, coisas para que a pessoa que tem interesse em buscar e aprender coisas novas, possa ampliar um pouco mais seus horizontes.

Tem a ver com o que faço nas minhas consultas de tarot, runas, numerologia, magias, o que for. Meu trabalho, seja escrevendo sobre as energias, seja comentando e aconselhando, é buscar mostrar caminhos, talvez apontar direções que já estão no mapa da própria vida de cada um. Cada pessoa tem sua caminhada, e são tantas as possibilidades.

Cada imagem que eu posto costuma ser também um convite, uma porta para vocês entrarem e descobrirem coisas novas, outros pontos de vista e idéias. E claro, conhecer o trabalho sensacional que essas pessoas fazem.   

Esta é uma das coisas que procuro estimular para vocês fazerem ao acessar a internet.

Visitem sites de outros países, usem os tradutores para visitar material que está em línguas diferentes.

Assim como eu não vejo o menor problema ao indicar e passar algo para pessoas que estão em qualquer lugar do mundo, também acho que o mundo pode lhes mostrar algo novo e diferente.

O mundo é maravilhoso, existem tantas coisas por descobrir, tantos pontos de vista e idéias que irão expandir seus horizontes e até, trazer a inspiração para seus próximos passos.


A importância dos créditos na magia

Para todos que são estudantes e praticantes da magia, seja qual for sua área, lembrem de algo muito importante: os espíritos também estão vendo o que vocês fazem! Portanto prestar e reconhecer créditos adiciona muita energia no seu trabalho espiritual e na magia! 
Este é um simples motivo pelo qual recomendamos que comprem os livros ao invés de mendigar PDFs de graça, pois isso é roubo. Ponto final. Não trás méritos perante as forças espirituais, pelo contrário! Se realmente não puder comprar, Ok, sem problema, mas valorizem o que conseguirem, copiem até mesmo a mão o material colocando também seu próprio esforço e claro, divulguem então as fontes, que já será uma ajuda para os autores e vocês assim conseguém mérito para si. 


Boas viagens explorando o mundo das imagens e de tantos autores fantásticos!


Nota legal: Eu procuro observar direitos autorais, sempre pesquiso os sites e informações do autor e não vou postar material que não se permita divulgação, porém podem ocorrer falhas minhas. Caso você seja o autor de alguma imagem que eu tenha usado indevidamente por favor me notifique que a mesma será imediatamente removida. 


P+
09/10/2009

.'.

Leia também: 
.'.

Consultas e atividades com Gilberto Strapazon

Consultas e Trabalhos em Magia - Portuguese text


Readings and Magic Works - English text


.'.


segunda-feira, 5 de outubro de 2009

Valor de ferramentas, terceirizações, produtividade, etc

"The minimum amount of knowledge required for the task to be carried out with an acceptable degree of success."
Foto Edward Bilodeau

Valor de ferramentas, terceirizações, produtividade, etc
05/10/2009

Revisando alguns posts, estava observando este, de 2003, em que debatiamos alternativas para continuidade de sistemas desenvolvidos em Clipper.

O resultado, foi que comentamos sobre qualidade de serviço, terceirizações, além é claro, sobre o valor das coisas.

Segue-se mais um post, que colocarei aqui mais tarde, para deixar claro que não estou dizendo que grátis é ruim, muito pelo contrário.

O que estou dizendo, é que tudo tem valor e devemos cuidar de como encaramos isto.


Esta mensagem foi postada no excelente fórum Clipper-Br do Yahoo Groups, dedicado a linguagem Clipper e linguagens do padrão xBase.


Data: Qui Jun 5, 2003 2:33 pm
Assunto: Re: X-HABOUR p/Gilberto

Carlos. escreveu:

porém vc não consegue desenvolver nenhum tipo de trabalho de alta
qualidade sem que ele receba críticas.

Pura verdade.

Sandro escreveu

objetos do xBase++. Inconvenientes do xBase++: é pago, caro e ....
.......

Ôôôpa!!!

Seguem meus comentários:


O fato de ser PAGO é justamente um critério que permite que as pessoas que estão trabalhando recebam pelo seu serviço e possam no mínimo sobreviver. ISTO É UMA QUESTÃO ÉTICA, que é justamente assegurar as pessoas que recebam uma justa renumeração pelo seu trabalho. Posições públicas de que este ou aquele software é ruim porque é "pago" induzem mais ainda, aos MAUS empresários, aos que tem visão "limitada" e aos espertalhões em geral, de que podem exigir que os outros trabalhem de graça ou por valores abusivamente baixos.

Caso você não saiba, hoje em dia muitas empresas oferecem serviço "temporário", sem nenhum vínculo legal, nem estabilidade, nem horas extras, pelo mesmo que se paga para, por exemplo, um cobrador de ônibus, que é também uma profissão digna como todas as outras.

Isto é muito ruim, pois as empresas PERDEM muito mais do que pensam ridiculamente estar economizando, pois trabalhadores temporários não geram algo importante que é conhecido por "CULTURA EMPRESARIAL".

O know-how vai embora todos os meses pelo ralo da economia mal feita.

Se você tirar o açúcar, o café fica uma droga né? Além disto, algums empresas além de fazer a nociva "economia de cafezinho", fazem pior, fazem "economia de água".

Alguns resultados disto:
  1. o conhecimento é perdido e tende a surgir uma desorganização constante. Mesmo pequenos padrões são difíceis de manter e perdem-se a cada mínima mudança na equipe.
  2. na sua maioria, os profissionais não vão fazer tudo que sabem ou poderiam;
  3. não se desenvolvem realmente muitas técnicas novas;
  4. não vai existir empenho nem motivação em alguém que sabe que vai ser descartado;
  5. é uma prática predatória, portanto, fatalmente vai extinguir sua fonte.

Ferramentas pagas, ajudam a lembrar aos seus usuários, que os técnicos também são pagos. E também que a formação técnica, como treinamento, atualização e disponibilidade de recursos para aprendizado é responsabilidade das empresas e não apenas dos funcionários. Ou por acaso alguém é maluco para comprar por conta própria uma instalação completa de algum DB só para aprender como funciona e depois dar "de grátis" para empresas que não valorizam o trabalham e pagam mal?

Grandes empresas migram para Linux e outras ferramentas, porque é "de grátis". Depois seus diretores compram um terno Giorgi Armani novinho, fazem declarações modernistas lindas de morrer (de rir) na revista Info, Exame, ComputerWorld, etc enquanto reduzem o salário e despedem programadores e analistas achando que eles também devem trabalhar de graça.

Minha posição sobre software "de grátis" é amplamente pública: 
Se não tiver alguma renumeração DIGNA para quem faz e quem mantém SOU CONTRA. 
 
Isto inclui xHarbour, Linux e tudo o mais. Tudo bem que existam alguns laboratórios com "alguma" verba governamental, mas daí a não terem uma responsabilidade de gerar resultados reais, ou seja, gerar seus próprio sustento, acho muito preocupante.

Sabem por que nos países desenvolvidos Empresários (com "E" maiúsculo) investem pesado em projetos e pagam bem suas equipes?

Simplesmente porque vivem do que fazem e seus projetos visam lucro e desenvolvimento de empresas.

Quem é que vai fazer algo assim se a empresa que trabalha não precisar gerar lucro nenhum? Se o café da manhã sempre for servido na cama, a pessoa nem se levanta mais e suas pernas atrofiam.

E não, note bem, não tenho dinheiro para pagar por todas licenças de software que gostaria de ter, por isto:
  1. uso só as que posso.
  2. uso as que estão compartilhadas no mercado e que servem também como promoção de seus autores. Está de uso corrente uma versão limitada que é free e outra que é paga, o que ajuda a manter o negócio andando.
  3. sempre presto créditos a tudo que uso. É o mínimo que posso fazerpara retribuir.
  4. considero que parte de meu trabalho assalariado é ajudar a manter estas ferramentas. Ou seja, a empresa me paga para prestar colaboração no mercado.

Foto: PaDumBumPsh

Uma coisa é termos ferramentas elaboradas com a participação de milhares de pessoas, em regime de colaboração e assistência mútua, levando ao crescimento coletivo.

Agora, outra coisa totalmente diferente é alguém dedicar-se em tempo integral para algo que é entregue sem qualquer renumeração. Vai viver de que? Papai e mamãe vão sustentar toda vida? Empreguinho que titio e padrinho querido arrumaram passando por cima de todo mundo?

Veja, nem todo mundo tem a possibilidade de estar, por exemplo, literalmente "mamando" numa empresa estatal para sair por ai fazendo propaganda do software livre, quando tem seus salários gordinhos assegurados por conta de impostos cobrados das empresas (coitadas) que tem de vender e (conseguir) receber pelos seus trabalhos. Além do que, estando assegurados pelo concurso público, alguns não se importam em tratar realmente mal os coitados dos clientes que eventualmente a empresa tenha. Qualquer problema, o governo paga a conta (ou seja os impostos cobrados...)
Claro que boa parte do pessoal do funcionalismo público é boa gente, mas não sou cretino para negar que o lixo continua todinho lá, atrapalhando quem tenta trabalhar direito.

Por favor, sugiro que repense nestas palavras, pois eu realmente não posso trabalhar de graça para ninguém. Cada vez que faço isto, a energia elétrica é cortada, falta comida na minha geladeira, eu não posso comprar sequer um sapato.

Eu adoro ensinar as coisas que sei, colaborar com os demais e me entusiasmo ao desenvolver coisas novas e sofisticadas, mas de graça, eu só mostro uma fração do que sei e posso fazer. Colaboro aonde posso, mas tenho sempre a visão de que este é meu trabalho, minha fonte de sustento, portanto, preciso fazer  propaganda e mostrar um pouco do que faço para os demais.

Quanto a ser caro, tem preço para tudo. Já comentei uma frase que vi na correspondência de uma grande empresa estrangeira que explicava que:
 "a BMW não baixa o preço se você só tem dinheiro para comprar um Chevette."


Nota:
Meus comentários são minha opinião e não refletem opiniões e/ou ideais do meu empregador.



.'.

quarta-feira, 30 de setembro de 2009

Dize-me o que vestes e direi quem te manda

O Adriano Silva, da Exame, escreveu um interessante questionamento sobre como as empresas controlam ou não a maneira de vestir de seus funcionários. Este controle muitas vezes vai a extremos.

Meu comentário publicado no artigo "Sua corporação é control freak? ":



Modo irônico = ON.

Outra imensa bobagem! O que tem de errado em uniformizar o pensamento dos "empregados" se estes são pagos para trabalhar e fazer o que a empresa manda? Calem a boca, não pensem e fazem o que mandamos! Pagamos pela sua vida! Obedeçam nossas neuroses autocráticas!

Produtividade é fazer o que tem de fazer. Pensar é para quem é pago para "pensar" em como fazer o que o Deus-Chefão-Todo-Poderoso quer.

O resto deve cumprir ordens, ficar com a bunda na cadeira e nada de perder tempo com coisas absurdas e improdutivas!

De preferência devem baixar a cabeça e só trabalhar e não devem nem respirar pois estão sendo pagos para trabalhar (escutei isto recentemente de um gerentão nacionalmente famoso até sair da empresa nacionalmente famosa)...

Máquinas paradas não produzem! Pás encostadas não cavam! Com certeza o mesmo vale para qualquer atividade que a "peonada" tem que fazer.

Qual a diferença entre fazer força nas máquinas ou empurrar o teclado para fazer o computador funcionar?

Ora, dizem até que "estudamos em Universidades de Alto Nível", "somos superiores a essa gente toda"...

Habilidades, histórico profissional, talento, nada disto importa.

Para os atuais senhores de engenho e suas mesmas velhas e mimadas idéias, a grande Senzala Virtual continua sendo seu território.

Quem discorda, ou vai para o tronco ou é atirado embora. E sempre perseguido com certeza pelos cães e seus capatazes.

.'.

segunda-feira, 28 de setembro de 2009

Dinossauros Atletas e Jovens Decrépitos

Foto: Karen Ilagan

Maturidade pessoal, profissional e empresarial seria apenas o tempo ou o conhecimento? E a sabedoria onde entra?

Aos mais experientes, tanto quanto para os mais novos, é necessária atualização constante. Assim como em qualquer outra profissão, é necessário procurar estar em dia.

Tecnologia da Informação (T.I.), com sua enorme diversidade, possui constantes mudanças e também, novos caminhos que poderão ser trilhados.

Ainda a velha tela caracter dos anos 70-80.
As pessoas, especialmente os menos experientes (e digo que podem ter décadas de inexperiência... risos...), às vezes simplificam tanto, que acham que por ter o título de dinossauro, eu seja apegado de alguma forma ao passado.

Olha, se fosse saudosista, eu usaria cartão perfurado ou seria fã de editores de texto como o VI.

Sou dinossauro pelo tempo apenas. Lá nos anos 70 já tínhamos o sonho de ter computadores que facilitassem o trabalho. Fazer a máquina trabalhar mais para nós e não o contrário.

Vou deixar bem claro: acho muito legal mainframes pelo seu imenso poder de processamento, mas não tenho nenhuma saudade de cartões perfurados, linhas de texto; Muito menos dos discos magnéticos de 25 Kg!

Bolas! Passamos a vida estudando, buscando aprimorar a qualidade e produtividade para ficar usando carrinho de mulas? Isto quando já existem veículos motorizados? E por quê? Por causa de alguns que acham lindo usar coisas pré-históricas?

Telas gráficas facilitaram muito o trabalho.
Mas tem quem prefere arcaicas linhas de comando...
Porque eu vou deixar de usar editores que me proporcional dezenas/centenas de vezes mais agilidade e produtividade? É um exemplo simples, mas quando vejo os mais novos usando ferramentas e métodos de trabalho que faz décadas são improdutivos, de pouca qualidade ou baixos resultados, me pergunto aonde irão chegar se já começam pela velhice senil.

Aprendizado em TI, em minha opinião, não é acumular tecnologia. É estar sempre caminhando para frente. "Decoreba" não é aprendizado. Devem-se dominar os conceitos.
 
E para os mais novos, é necessário praticar sim. Ninguém começa por cima. Assim como o confeiteiro melhora botando a mão na massa, todos os dias, as práticas aliadas ao estudo continuam que vai dar a bagagem para encarar as tarefas.

Software, computação, tem que trazer resultados práticos reais. Antes de chamar alguém de vovô façam um programa de alta performance, que use bem os recursos e forneça ótimos resultados. Festival de efeitos visuais e "coisinhas" piscando na tela são bonitos para videogames. 

Busquem criar algo que consiga fornecer recursos para análise ou demonstração ampla da informação. Por exemplo, vejam o artigo "Meditaçao Empresarial - Sementes de Pontos de Vista". A foto final mostra muito mais do que qualquer gráfico multidimensional. E é bonita para a alma, estimula a criatividade e ajuda o desenvolvimento da consciência.

E como falei de videogames, lembrem que estes precisam ter uma excelente qualidade técnica, alta performance e criatividade. Ou seja: tem que saber o que faz e dominar isto. E não é só a técnica, mas conhecer as pessoas, os usuários, os seres humanos que vão interagir com o programa.

A maturidade da empresa vai ocorrer quando esta deixar de ser um celeiro protetor de práticas que não funcionam mais. Ou um local de técnicas velhas que apenas mudaram de nome.

Maturidade empresarial vem quando existe a consciência interior de que precisa ser um lugar aonde exercer e ter opções reais de aprendizado e evolução deve ser em todos os níveis..



Honeywell Information Systems Series 6000 mainframe computer system 1973
Foto Jack Mulligan

Deparo-me a todo o momento com pessoas que estão nos seus primeiros anos de profissão e continuam programando exatamente igual ao que faziam no início, cinco ou dez anos atrás (desculpem o pleonasmo... rssss). Não aprenderam nada! Podem até ter a ferramentinha da moda para desenhar algum diagrama, mas a maneira de trabalhar continua a mesma.

Deparo-me também, a todo o momento, com pessoas com longo tempo de trabalho, mas que só usam internet para e-mail pessoal, da empresa e olhe lá. Mas muito raramente eu as vejo entrarem num site técnico, num fórum de debate de TI, pesquisar algoritmos ou tecnologia que possam lhes trazer ganhos no aprendizado profissional.

A maturidade deve ser buscada por todos. Deparo-me todo tempo com pessoas de pouca idade, mas com a confortável mentalidade de velhos, sem iniciativa, mas que se consideram donos da bola, do campo, do apito, são o principal jogador e o próprio juiz!

Maturidade não é idade. É nível de consciência. É ser capaz de um pensamento completo por si só e ser responsável por seus atos, de forma a elaborar e executar com qualidade, produtividade e inovação. Maturidade é o pensamento consciente que vai gerir novos frutos e saber dar-lhes o necessário cuidado, desde a semente, passando pelas diversas fases.

Em cada estágio do que fazemos é necessário tanto o conhecimento e a experiência, quanto o impulso e a vitalidade para as atividades necessárias. Deparo-me a todo tempo com velhos arcaicos e retrógrados, aos vinte e poucos anos!

E são muitos, infelizmente. Deparo-me a todo tempo com empresas que pensam que é um trabalho escolar. Iniciativa é algo que ou a pessoa tem ou não tem e precisa desenvolver.


Foto: Claudio Zeiger

Maturidade é algo que a empresa vai ter quando tiver a visão e o nível de ação que se espera de quem esteja consciente de si, dos demais, do que representa e do caminho a seguir.

Só então começará a atuar de forma mais integral, com qualidade e produtividade, proporcionando satisfação e a realização da sua atividade de forma mais equilibrada e capacitada de continuar atuante e com vistas ao futuro.



.'.

terça-feira, 22 de setembro de 2009

Como regrar o acesso dos usuários à Internet na Empresa

The Future is Bright - Imagem: Erica Cinnis
Bem, como prometi, vou passar algum material sobre uso de internet na empresa.

Achei um artigo bem simples e prático, e acrescentei alguns comentários.

Basicamente fala de algo que é muito esquecido nas corporações: “negocie com seus funcionários”.

Dialogo!


Quando você faz isto, está oferecendo a oportunidade de que os colaboradores façam parte da empresa.

Mas isto deve vale para os dois lados. Se a empresa delega para os funcionários certas definições, mas depois exime-se de fazer sua parte, corre-se o risco de perder credibilidade e principalmente, participação expontanea e interessada.

Da mesma forma, os profissionais devem estar cientes de suas responsabilidades.

Em hipótese alguma, admite-se o nivelamento "por baixo". Saber dar nomes, delegar tarefas, cobrar responsabilidades e manter o equilíbrio entre os diversos níveis de profissionais, é uma das características necessárias a uma boa gestão.

Tradução com adaptações do trabalho: "How to limit internet access to users":

Como limitar o Acesso da Internet pelos Usuários

O uso da internet é comum nos negócios. Um passo a frente em condições de trabalho e performance dos funcionários. Mas o uso fora do negócio da web, também pode ter repercussões negativos ao negócio.

Aqui vamos lhe dar algumas sugestões e conselhos para limitação de forma inteligente do contexto da internet.

Primeiro, vamos lembrar que o uso da internet no trabalho, e-mail pessoal, etc, é nos dias de hoje, como permitir que os funcionários atendam o telefone para assuntos particulares ou façam ligações. Porém é possível acessar e trocar informações de todo tipo, estudar, planejar, etc.

Empresas que acham inoportuno até o uso do telefone, isolando os funcionários do mundo, terão certamente muita dificuldade a este respeito. Lembremos que estamos no século XXI, e interatividade e agilidade são conceitos chave em negócios faz muitos anos.

Para profissionais de TI (Tecnologia da Informação), a falta de contato com as inovações que são diárias, são toda diferença entre manter-se atualizado ou ser apenas mais um medíocre repetindo a mesma coisa ano, após ano.

Por que regulamentar acesso à internet no negócio?

Regulamentar (não proibir) o acesso a internet, é possível para incrementar o funcionamento da companhia em vários pontos:
  • ganho de produtividade;
  • uso mais profissional da internet (informação concernente a companhia);
  • redução do risco de ataques de vírus na rede;
  • conexão de internet (bandwidht) mais rápida e disponível

Monitorar funcionários ou limitar o acesso à internet?

Alguns softwares permitem dispor ações individuais para cada usuário na empresa. Esta abordagem radical certamente não é a mais efetiva. É mais apropriado o acesso por regulamentação negociada (veja abaixo). Se você implementa um sistema de controle por indivíduo, deve estar preparado para prover os procedimentos para seus colaboradores. Por exemplo, registro das páginas visitadas).

Limitando o acesso à internet: Definindo um Código de Conduta

Negociação e comunicação com funcionários continua sendo uma das mais efetivas formas de regular o acesso à internet. O objetivo é tornar os usuários “responsáveis” em sua “navegação” na web. É cada vez mais comum ouvir os funcionários, e fazer com que estes efetivamente tenham a empresa como sua.

Reuniões de instrução, encontros de comitês, seminários corporativos e workshops são oportunidades para negociar com representantes ou com os próprios funcionários. Pode-se chegar a entendimentos ou acordos sobre as condições de uso da Web na empresa.

Disto originam-se “códigos de boa conduta”. Número de horas e situação das tarefas diárias, tipo de conteúdo proibido, regras de uso de e-mail particular...). Divulgue na empresa em reuniões, murais, e-mail interno, informativo, etc.

Lembrando: em muitos locais, o bom senso funciona! Quando as pessoas sabem o que estão fazendo e tem suas responsabilidades, assim como seus benefícios, atendidos, o controle pode ser bem mais informal.

Vale lembrar também do velho ditado: Trate as pessoas como espera ser tratado.

Modos de regular o acesso à internet

Regular o acesso a internet pode ser classificado em duas formas: limitar o tempo de uso ou filtrar o conteúdo acessado. Para maior eficiência, você pode combinar estas duas formas de controle. Mas atenção: filtrar o conteúdo requer um BOM conhecimento das estações da rede. Consulte seu administrador de rede ou na falta deste, a assistência (suporte) de seu provedor de serviços.

Limitar o tempo de acesso a internet na empresa.

Solução amigável. Pode-se estabelecer tempo para assuntos que não sejam do trabalho, diário, ou por cota semanal, etc. Isto pode ser em paralelo com canais que poderão estar disponíveis, como MSN, Twitter, e-mail pessoal. Claro que bom senso dos funcionários é fundamental, daí o processo colaborativo ser mais indicado.

Soluções de software

Com software relativamente simples, pode-se restringir o acesso em cada PC, conexão com internet e programas de mensagem (MSN, etc).
Para usar estes softwares, você deve ser o administrador de cada PC na rede. É requerido login e password em cada máquina. Se houver um administrador de rede na empresa, a tarefa será atribuida a ele.

Filtrar o conteúdo acessado pelos usuários na empresa

Definir filtros é uma operação mais complexa. Este trabalho deve ser certificado pelo administrador da rede da empresa ou provedor do serviço.

Tipos de filtros

Você pode aplicar filtros em três níveis:
  • URL – Pode-se banir certos endereços. Por exemplo, videos online, sites “sensíveis” (adultos, etc).
  • Palavras chave (keywords): Define-se uma lista de palavras banidas. O usuário não poderá acessar resultados em sites de pesquisa. Observação: Nos dias atuais, lembre que certas discussões políticas serão bloqueadas (risos).
  • Tipos de arquivos: Pode-se filtrar que tipos de arquivos serão bloqueados. Por exemplo, música, vídeos, etc. Isto ajuda a limitar a possibilidade de ataques e infecções por vírus na rede corporativa.

Nota: Um esquecimento comum, é que certos sites utilizam serviços hospedados noutros provedores. Por exemplo, desenvolvedores que utilizam opensource, podem estar usando código do Sourceforge, e este poderá estar bloquedo por outros motivos, como downloads, etc. Então, cuidado ao generalizar demais.

Existem vários softwares disponíveis, como webAllow, Messenger Blocker, Pgsurfer, Chronager entre muitos outros além das soluções corporativas como o Blue Coat, IronPort, etc
----o----


Bem, são algumas sugestões que achei interessantes de traduzir e fazer alguns acréscimos. O post anterior já tocou um pouco mais o tema.
Pessoalmente, acho essencial a responsabilidade do funcionário saber do seu serviço, ser produtivo e estar em dia, tanto quanto a da administração prover recursos para atualização técnica e boas condições de trabalho. O tempo das empresas que praticamente mantinham seus funcionários na cadeia ou senzala durante o expediente ainda não terminou infelizmente.

Mas as últimas décadas, e os avanços em qualidade de vida, metodologias de trabalho baseadas em profissionalismo e menos em servidão, tem mostrado melhores resultados para as empresas mais competitivas e vitoriosas.

A geração Y não é a única a se beneficiar dos avanços. Mas todos nós, que trabalhamos para que essa cultura um dia chegasse a mais pessoas e lugares.

Internet é só 'chat' para quem não se atualiza. Se o fizesse, descobriria que existem até chats unicamente de intercâmbio técnico nas mais diversas áreas.

Veja outras matérias sobre este tema em: Redes Sociais
.'.

sexta-feira, 11 de setembro de 2009

Programador também faz POG

The Duck Tape Programmer
Foto: Graeme - New Zealand


A POG, Programação Orientada a Gambiarra, possui diversas formas de implementação.

A escolha da abordagem mais adequada, é geralmente na base do que funcionar primeiro. Por incrível que pareça, na programação POG, o que vale nem sempre é o menor esforço, pois o que está em jogo é o resultado e não a capacidade do programador entender o que está fazendo. Isto inclui também, os misteriosos problemas no kernel ou nas ferramentas de desenvolvimento e softwares de terceiros, para os quais, nem sempre o fabricante fornece suporte adequado.

Vejamos alguns dos tipos de POG mais encontrados:

FORCEPS

De fácil compreensão, esse recurso é largamente utilizado, caso um valor não seja atribuído a sua variável durante a execução de um programa por algum problema desconhecido pelo programador POG. Assim em vez de perder horas e horas debugando um programa, através do altíssimo nível de programação orientada a gambiarra, o programador POG atribuiu um valor na base da porrada e o programa roda livre e sem bugs. É claro que de tempos em tempos esse pequeno ajuste deve ser mantido.

Programação Orientada a Estagiário

Consiste na capacidade do analista de sistemas sobrecarregar o estagiário ou o técnico mais próximo com todas as suas funções, desde interação com clientes até desenvolvimento de casos de uso e bancos de dados, aproveitando ao máximo toda a energia gambiarrizadora que essas categorias possuem. Sabendo que fica mais fácil para o programador entender e realizar a POGização do sistema se ele conversar diretamente com o usuário, o analista sabiamente permite que o programador realize os contatos com o cliente, permitindo assim que o analista realize funções que condizem mais ao seu cargo, como acessar a desciclopédia, ficar o dia inteiro na cantina ou ir puxar o saco do chefe, por exemplo. Além do mais, o contato do programador com o usuário economiza papel e tinta de impressora, pois a parte da documentação impressa é nula, já que o analista não participa do processo e assim não gera as toneladas de folhas com diagramas e especificações. O acoplamento do sistema é muito maior, pois foi desenvolvido por uma única pessoa, facilitando na manutenção, pois existem poucas classes para serem modificadas (no máximo cinco, para programas muito complexos).

Apellation Number Technic

É um método muito utilizado por MVP's (MOST VALUABLE POGrammer), que resolve 90% dos BUGs sem que precise queimar nenhum neurônio. POGramadores experientes sabem que: Deu um BUG no sistema? Digita -1 em algum lugar que funciona!!! Ainda não se sabe o motivo, e nem precisa saber. apenas funciona e pronto.

Static Spree

Um dos patterns mais utilizados da POG. O objetivo desse padrão é que tudo fique visível em qualquer canto, porque private é coisa de gente sem vergonha. Também conhecido por Public Static Spree, pois comumente tudo é feito "public static".

Imagem: Dom Herms
Public Global Access

Pattern que simplifica o desenvolvimento eliminando todos aqueles métodos de acesso inúteis, tornando todos os atributos acessíveis globalmente, diminuindo a quantidade de lixo no código. Apesar da semelhança com o Static Spree, os atributos não precisam ser static.

RCP Pattern

Significa Reuse by Copy-and-Paste (Reúso por Copiar e Colar). O RCP dita que, na pressa, quando não dá pra fazer a coisa por herança, basta copiar e colar, quantas vezes for necessário. Em geral se espera que futuras alterações sejam feitas por outros trouxas, digo programadores, perdão. Os trechos de código são copiados de todo e qualquer lugar possível, geralmente de outro programador (muitas vezes o estagiário) ou código da internet, para criar partes funcionais do programa. Utiliza-se a do "Ctrl+C" e "Ctrl+V" para juntar as partes e adaptá-las para funcionar, por tentativa e erro. Leva um considerável tempo para se adaptar o programa, e um número absurdo de compilações, mas pelo menos pode-se dizer que foi você quem fez o código. Este pattern também é conhecido como "Contra o C e Contra o V".

BCDR Pattern

Black Cat in a Dark Room (Gato Preto em um Quarto Escuro). Consiste em criar métodos que recebem apenas um parâmetro (um Map em Java ou um params em .NET). O argumento que você precisa está lá dentro, mas você não sabe exatamente onde. Esse padrão permite passar quantos argumentos forem necessários a um método, sem poluir o código. Permite criar métodos cujas assinaturas seriam, de outra forma, extremamente longas . Evita a alteração de assinaturas de métodos no momento da manutenção do código, fazendo desnecessário qualquer tipo de refactoring.

Há registro de programadores de Black Cat in a Dark Room. Um exemplo complementar é o parâmetro String[]:

Um exemplo prático é o sistema de gerência de Mensagens do Windows.

User Friendly Exception

Consiste na padronização de todas as mensagens de erro do sistema para uma única mensagem amigável ao usuário. Um sistema 100% compatível com esse padrão, nunca trava nem encerra de forma inesperada, mas apenas não atende ao usuário exibindo uma mensagem do tipo "Caro usuário, tente novamente observando as regras de uso do sistema". Observação: Trata-se da evolução de um padrão amplamente utilizado em sistemas Microsoft com mensagens "Catastrophic Failure" e "Unexpected Error".

Exemplo de implementação em Java:
public static void main(String[] args){
while (true) {
  try {
  ...
       } catch (Throwable ex) { // qualquer erro do sistema cai aqui
      // só pode ser culpa da besta ignorante do usuário
      System.out.println("Caro usuário, tente novamente observando as regras de uso do sistema");
      // após a mensagem, o while(true) garante a robustez do sistema que nunca aborta!
      }
   }
}


Chaotic Experimentation

Padronização de construção de funções para continuar a executar o programa mesmo que dê pau em alguma rotina. Exemplo clássico: On Error Resume Next (Visual Basic).

Controller Confusion

Tática que permite uma menor escrita de classes no sistema. Consiste simplesmente em eliminar o M do padrão MVC, ficando um padrão muito mais legal - o VCC ("View/Controller Confusion", ou "Vai catar coquinho"). Alguns tem sugerido inclusive a eliminação do V - ou seja, ficando apenas o CC (Codigo coco para os usuarios mais intimos) - a lógica, o modelo, os templates, o HTML, tudo e mais um pouco dentro do controller confusion. Como você pode ver, o padrão cêcê faz jus ao nome.

N.M.L. Combat Action POG Pattern

É um Design Pattern POG ousado, moderno, revolucionário e NÃO-EMO. Os arquitetos emos e POGuistas ADORAM, junto com seus miguxus, incrementar suas frameworks utilizando MUITAS camadas, geralmente desnecessárias. A N.M.L. (No More Layers) aborda uma estrutura onde todas as regras de negócio, validação (client e server side) e acesso à dados estão na tela! Para que Facades, Commands, Bussines Delegate e outras viadagens EMO detonando a performance da aplicação? Manutenção? Não é necessário, pois quem domina e faz uso dessa técnica modesta e humilde produz códigos Chuck Norris Style, ou seja: PERFEITOS. Esse paradigma está amplamente difundido por programadores VB e Delphi, e tem migrado com sucesso para a plataforma .NET, porque o que importa é a beleza da tela, e não a tecnologia que está por trás!

UFB -Uso de Força Bruta

Método muito famoso no meio dos programadores POG.

O método se aplica para solucionar problemas sem perder tempo voltando no código para procurar onde deu errado.
...


if (var==20)
   ChamaMetodoSolucao(var);
else

   {
   var=20;
   ChamaMetodoSolucao(var);
   }


Strombolic Bridge (ou, DRIBLE DA VACA)

O Paradigma Strombolic Bridge (Ponte Estrombólica) ou mais conhecido no Brasil pelo Pseudonome de "Drible da Vaca" é uma evolução do já consagrado BRUTE FORCE. Consiste em alimentar uma variável global que será utilizada dentro de algum método, mas certificando-se de que seu valor inicial será retornado ao original após o uso dela pelo método. Por exemplo:
varTemporaria = varOriginal;
varOriginal = "NovoValor";
Executa(varOriginal);
varOriginal = varTemporaria;


Reparem que, tal como o "Drible da Vaca":
- A varOriginal dá um 'totózinho' lateral do seu valor para a variável temporária,
- Recebe o novo valor que será utilizado pelo método,
- (corre) e recebe de volta seu valor la na frente...
Não tem erro.... assim você sempre terá certeza que o valor original será sempre o mesmo !!!

Space Kick Pattern

Consiste em ir chutando pro espaço, até acertar e a coisa dar certo!

Abstract Observer Pattern

Método para dar manutenção em código POG. Você observa um monte de gambiarra, mas abstrai e considera a coisa como funcional.

------------------------------------------------------------------------------------------------------

O texto acima está com algumas pequenas modificações e acréscimos feitos por mim. O original foi encontrado no  Blog Mundo .Net do Constantine

.'.

quarta-feira, 2 de setembro de 2009

Performance: Quando A Culpa Não é do Banco de Dados

The IBM Stretch supercomputer.
Photo: IBM

Performance: Quando A Culpa Não é do Banco de Dados
02/09/2009

Otizimizando a performance em SQL com Join e Subquerys


Com frequência temos casos em que uma determinada seleção de registros, apesar de parecer atender as necessidades iniciais, não é satisfatória devido a demora do processamento.

Uma das causas, é pela utilização apenas de dados de teste, em tabelas pequenas. Com isto, o tempo real de execução deixa de ser avaliado e, como resultado, o coitado do DBA vai ter que ouvir mais uma vez que “minha Select funcionou, então é o banco de dados é que tem problema”. Ou então, será alegado culpa do usuário...

Mas existem muitas diferenças entre simplesmente “funcionar”, e funcionar de forma eficiente.

A complexidade de uma seleção de dados, vai levar em conta, o tempo de que dispomos para sua codificação é claro, mas também, é preciso ponderar no ganho de tempo, mesmo na fase de testes com dados reais, e os recursos utilizados em produção. Na maior parte das vezes, o tempo ganho estudando a otimização compensa largamente e geralmente diminui o tempo de programação e testes.

Outra falha, é confiar excessivamente nos recursos de otimização automática dos gerenciadores de banco de dados. Nem sempre estes farão a melhor escolha. Como por exemplo, ao avaliar a disponibilidade de outros índices, neste caso, mudando as chaves de seleção de alguma forma, que poderá ter um impacto significante. Também a hierarquia como serão processadas as condições de seleção e até mesmo, transferir parte dos recursos para outra tabela, ainda assim de forma mais eficiente no resultado geral, pelo aproveitamento de dados em cache.

Tomei para este exemplo, uma seleção de dados numa tabela real, mudando é claro os nomes para o exemplo, com cerca de 60 milhões de registros de movimentos relativos a um conjunto de setores, relacionadas noutra tabela.

Esta transação era utilizada diariamente numa consulta pelo usuário final, os diretores da empresa para decisões de mudanças estratégicas em tempo real para ofertas nas suas lojas, mas demorava até absurdamente 2 horas! Imagine alguém da diretoria precisando tomar decisões de enorme valor financeiro a nível nacional, literalmente milhões de $ e tendo que esperar este tempo todo! Certamente era desejável obter uma boa performance.

É importante observar, que mesmo que fosse o caso de um programa de execução única ou eventual, a enorme perda de tempo durante a fase de testes compensa largamente que se faça um código melhor.
Veja bem: como é que vou trabalhar se entre um teste e outro preciso esperar horas? Estamos no Século XXI, é hora das coisas funcionarem melhor e serem melhor feitas. 
Desta forma, teremos nosso trabalho pronto mais rápido, e também, estaremos economizando os recursos do sistema e da empresa que também são utilizados pelos demais usuários.
E também muito importante, é lembrar que geralmente, não teremos exclusividade de uso do servidor. Existem outros programas disputando recursos. No caso do exemplo atual, eram mais de 5000 estações fazendo todo tipo de transação acessando exatamente a tabela principal desta pesquisa, além de uma grande quantidade de processamento batch realmente volumosos.

O sistema gerenciador de banco de dados (SGBD) neste caso, era o Sybase AES (Adaptative Server Enterprise) 12.5. Usei os comandos sp_showplan e sp_statistics para listar resumos das execuções.
Os conceitos aqui mostrados servem para qualquer outro SGBD Relacional, como Oracle, Sql Server, etc.


A Select original que está abaixo, vai retornar a soma para quatro condições diferentes em cada setor existente.
Para nosso exemplo temos duas tabelas: Setores e Movimentos. Precisamos selecionar os Setores de Tipo = 'X', e os movimentos dentro de um periodo de datas, que tenham um determinado CodigoTeste igual ou diferente de zero e, que poderá ter uma segunda condição a ser testada. Ainda, precisamos o total geral de registros.

Neste modelo, em que a tabela de setores é a principal, simplesmente fizeram quatro varreduras na tabela de movimentos para cada um dos setores dentro do período selecionado. Uma leitura para cada um dos campos a ser somado! O tempo de execução foi obviamente bastante longo.

Logo abaixo estão as estatísticas de execução.

Select Original:

select Setores.codigoSetor,
       (select count(*) from Movimentos b
               where Setores.codigoSetor = b.codigoSetor and
                     dataOperacao between '04/01/2009' and '04/30/2009'),
       (select count(*) from Movimentos c
               where Setores.codigoSetor = c.codigoSetor and
                     dataOperacao between '04/01/2009' and '04/30/2009' and
                     codigoFlagTeste 0),
       (select count(*) from Movimentos d
               where Setores.codigoSetor = d.codigoSetor and
                     dataOperacao between '04/01/2009' and '04/30/2009' and
                     codigoFlagTeste = 0 and tipoABCDE in (1, 2, 3, 4)),
       (select count(*) from Movimentos e
               where Setores.codigoSetor = e.codigoSetor and
                     dataOperacao between '04/01/2009' and '04/30/2009' and
                     codigoFlagTeste = 0 and tipoABCDE not in (1, 2, 3, 4))
  from Setores (index indiceSetores01)
  where (tipoSetor = 'X' or Setores.codigoSetor = 999)
  order by Setores.codigoSetor


Estatística da Execução:
----------------------------------
Table: Movimentos scan count 121, logical reads: (regular=124152 apf=0 total=124152), physical reads: (regular=1129 apf=123023 total=124152), apf IOs used=123023

Table: Movimentos scan count 121, logical reads: (regular=6949399 apf=10100 total=6959499), physical reads: (regular=843310 apf=5103725 total=5947035), apf IOs used=5090713

Table: Movimentos scan count 121, logical reads: (regular=1003943 apf=2237 total=1006180), physical reads: (regular=37563 apf=261910 total=299473), apf IOs used=262198

Table: Movimentos scan count 121, logical reads: (regular=1003943 apf=0 total=1003943), physical reads: (regular=0 apf=0 total=0), apf IOs used=0

Table: Setores scan count 1, logical reads: (regular=51 apf=0 total=51), physical reads: (regular=47 apf=16 total=63), apf IOs used=1


===> Total actual I/O cost for this command: 132.860.664... !!!
Total writes for this command: 125

Execution Time 749.
SQL Server cpu time: 74900 ms. SQL Server elapsed time: 1.471.296 ms.

(121 rows affected)
----------------------------------


Vemos que houve um processamento bastante repetitivo e bem pesado. Para cada linha selecionada na tabela Setores, são feitos quatro leituras na tabela de Movimentos, que neste caso, pelo menos tinha um Indice por data. Mas ainda assim, é demais.

Podemos melhorar isto em duas partes principais.
  1. Fazer apenas um ciclo de leitura na tabela de Movimentos eliminando as subconsultas. 
  2. Otimizar a forma como vamos validar quais código de setor serão validados.

Para aproveitar melhor o ciclo de leitura, fazendo a contagem das condições que precisamos verificar, utilizamos o comando CASE WHEN, que é semelhante a do SQL Server. A maioria dos SGBDs possui uma condição de critério.
A tabela de Movimentos passa a ser o principal e não mais o de Setores, também temos no mesmo um índice por setor e data.
E usamos o Join que não era usado!

Assim teremos:

  select codigoSetor, count(*),
        sum ( case
                when b.codigoFlagTeste 0 then 1 else 0 end ),
        sum ( case
                when b.codigoFlagTeste = 0 and
                     tipoABCDE in (1, 2, 3, 4) then 1 else 0 end ),
        sum ( case
                when b.codigoFlagTeste = 0 and
                     tipoABCDE not in (1, 2, 3, 4) then 1 else 0 end )
   from Movimentos b
   join Setores (index indiceSetores01)
     on Setores.codigoSetor = b.codigoSetor
   where dataOperacao between '04/01/2009' and '04/30/2009' and
        (tipoSetor = 'X' or Setores.codigoSetor = 999)
   group by codigoSetor
  

Estatística da Execução:
----------------------------------
Table: Movimentos scan count 1, logical reads: (regular=60523 apf=53 total=60576), physical reads: (regular=48421 apf=6249 total=54670), apf IOs used=6173

Table: Setores scan count 95560, logical reads: (regular=99289 apf=0 total=99289), physical reads: (regular=10 apf=0 total=10), apf IOs used=0

Table: Worktable1 scan count 1, logical reads: (regular=6545 apf=0 total=6545), physical reads: (regular=0 apf=0 total=0), apf IOs used=0


===> Total actual I/O cost for this command: 1.317.060... (apenas 1% do anterior)


Execution Time 15.
SQL Server cpu time: 1500 ms. SQL Server elapsed time: 83.800 ms.


Basta uma rápida olhada para perceber imediatamente que a diferença na quantidade de I/Os e no tempo de processamento é impressionante, próximo de apenas 1% da select original!

Mas ainda podemos mudar um pouco isto para explorar alternativas.

Observem que utilizamos um Join para validar a tabela de setores. Mas neste caso, poderemos ter várias releituras da mesma.

Também seria possível a condição 'where... IN' para validar o setor, ao invés de Join. Mas neste caso, pode ocorrer um aumento no número de I/Os, que é pequeno em relação ao problema original, mas que deverá ser estudado se for noutra implementação

Assim teremos:

select codigoSetor, count(*),
       sum ( case
               when b.codigoFlagTeste 0 then 1 else 0 end ) ,
       sum ( case
               when b.codigoFlagTeste = 0 and tipoABCDE in (1, 2, 3, 4) then 1 else 0 end ) ,
       sum ( case
               when b.codigoFlagTeste = 0 and tipoABCDE not in (1, 2, 3, 4) then 1 else 0 end )
  from Movimentos b
  where dataOperacao between '04/01/2009' and '04/30/2009' and
        codigoSetor in (select codigoSetor
                          from Setores (index indiceSetores01)
                          where tipoSetor = 'X' or Setores.codigoSetor = 999)
  group by codigoSetor  

Estatística da Execução:
----------------------------------
Table: Movimentos scan count 1, logical reads: (regular=60523 apf=26 total=60549), physical reads: (regular=51955 apf=4993 total=56948), apf IOs used=4822

Table: Setores scan count 95560, logical reads: (regular=99627 apf=0 total=99627), physical reads: (regular=27 apf=0 total=27), apf IOs used=0

Table: Worktable1 scan count 1, logical reads: (regular=6545 apf=0 total=6545), physical reads: (regular=0 apf=0 total=0), apf IOs used=0


===> Total actual I/O cost for this command: 1.358.992.
Total writes for this command: 6884

Execution Time 18.
SQL Server cpu time: 1800 ms. SQL Server elapsed time: 107.326 ms.

(113 rows affected)
----------------------------------


Portanto vemos que a Alternativa A ainda foi uma melhor modificação.

Uma observação adicional, é que ao mudarmos a select original, também foram eliminados alguns resultados desnecessários, que precisariam processamento posterior, daí a diferença na quantidade de registros resultante ter baixado de 121 para 113.


Comparativo


Custo Total
I/O
Tempo Execução
Tempo CPU
SQL Server elapsed time
Original
132.860.664
749
74900 ms
1.471.296 ms
Alternativa A
1.317.060
15
1500 ms
83.800 ms
Alternativa B
1.358.992
18
1800 ms
107.326 ms



Conclusão:

Obtive para a empresa uma redução aproximada de 99% na quantidade de I/Os necessários e de 98% no tempo de execução.

Alguns pontos podem ser melhorados, mas em face do ganho obtido, já ficou num nível mais satisfatório, especialmente considerando a cultura local da empresa. 

Assim, passaram a tomar decisões mais rápidas, negócios de milhões $ que puderam agilizar de maneira melhor e certamente maiores lucros. 


Resultados:

  • Enorme economia de recursos.
  • Maior disponibilidade do servidor para atender outras transações.
  • Maior satisfação do usuário final que passou a ter muito mais agilidade.
  • Ciclo de desenvolvimento e testes do programa foram reduzidos a uma fração do previsto.
  • Ganhos de milhões de $ para a empresa diariamente. 


Gostaram do exemplo? 

Apenas para citar, que tal outro caso de uma aplicação chave para a empresa, novamente envolvendo muitos milhões de $ e demorava 16-18h. Só podiam executar no fim de semana e tinham que cortar os servidores da rede. Consegui reduzir para menos de 2h e sem afetar a rede. Neste caso, além de otimizar o SQL também foram utilizadas soluções de lógica complexa necessarios para melhor uso da CPU e obter melhores resultados. 

Quanto sua empresa ganha com serviço bem feito


Se precisam de um profissional de longa experiência que sabe o que fazer, aceito convites que sejam realmente sérios. Só falo diretamente com o responsável pela contratação, não entro em fila e nem preencho ficha em site.  




Leia também:



..