Arquivo de março de 2009

A equipe de um projeto de software

terça-feira, 10 de março de 2009

o clássico livro de Frederick Brooks, The Mythical Man-Month, um dos capítulos fala sobre a montagem de uma equipe de desenvolvimento. Ele apelida isso de equipe cirúrgica, na qual traça um paralelo entre uma equipe médica e uma célula de desenvolvimento de software.

A equipe cirúrgica de Brooks

O projeto descrito no livro é enorme e exigia uma quantidade grande de pessoas para terminá-lo. Para evitar os problemas de comunicação, adotaram o princípio de uma equipe cirúrgica, na qual temos 2 cirurgiões e 1 anestesista, sendo apoiados por várias outras pessoas. Lembre-se que o cirurgião deve ter foco total no trabalho e problema diante de sí e não pode nem deve ser distraído com coisas como buscar soro aquecido ou procurar luvas esterelizadas. Essa analogia serve para projetos de software, o dividir para conquistar. Um projeto é dividido em vários outros menores, com seu prazo e escopo definidos.

Inspirado no livro, fiz o diagrama abaixo, baseado nas minhas próprias experiências e literatura corrente como o SWEBOK. Aproveitei para usar outra analogia também. Espero que gostem e entendam.

equipe_Software

Essencialmente, temos uma equipe de pelo menos 3 pessoas. Um analista/programador principal, que toma as decisões de arquitetura, tecnologia e projeta o software e um outro analista/programador de apoio. Um coordenador ou gerente de projetos é necessário para tomar conta de toda a burocracia que afeta o projeto diretamente, mas não faz parte da construção do mesmo.

O diagrama acima é apenas uma sugestão do que seria uma célula de desenvolvimento e cabe a você adaptar e decidir o que é melhor para o seu projeto. Preste atenção na quantidade de pessoas, pois aumenta a dificuldade de comunicação e difusão de conhecimento entre seus membros. Uma equipe de desenvolvimento deve ser coesa na forma de trabalhar e se expressar no código-fonte gerado.

Lembrete: de nada adianta criar regras e padrões se ninguém irá aderir a eles. Determine o que é mais confortável e que irá ser seguido, mesmo debaixo de pressão. Algum planejamento é essencial, por menor que seja.

Outros analistas/programadores podem fazer parte do projeto, mas devem seguir as normas, arquitetura e estilo definidos pela dupla principal. Se isso não for seguido, o que você terá no final é código-lixo, com estilos de programação diferentes e que apenas uma ou outra pessoa será capaz de efetuar manutenções, alterações e correções. Nem sempre o programador concorda com uma abordagem. Ele pode e deve sugerir mudanças, mas cabe ao líder pesar se essa melhoria vale a pena ser propagada para todo o restante do código. Boas idéias e soluções sempre surgirão durante um projeto, mas coesão é mais importante que inovação depois de 10 meses.

Mas… e se a empresa for muito pequena? Euquipe?

euquipe

A primeira coisa a se fazer, é planejar seu tempo. Considere tudo, até os minutinhos gastos em reunião, telefonemas com o cliente, etc. Precisou passar no banco, contabilize. Justifique seu tempo com ajuda a colegas e avise o seu gerente o tempo todo e liste o que foi feito com o seu tempo durante o dia ou semana. São os 15 minutos mais bem gastos do seu dia, nem que precise ficar depois do horário ou chegar uns minutos antes.

Um bom gerente irá criar um escudo contra as burocracias e atividades da empresa que atrapalham o trabalho de análise e programação. A melhor saída é usar um velho conhecido, o TimeBox.

Ele consiste em definir o que pode ser feito dentro de um prazo de 2 semanas. E o que estiver pronto em duas semanas é entregue. O prazo nunca muda e sim os requisitos. Se um requisito é grande demais para ser feito e entregue em duas semanas, o CLIENTE deve ser informado e a decisão é tomada de forma conjunta. Lembre-se também que o tempo gasto em planejamento deve ser contado e justificado. É muito comum o capataz gerente considerar o seguinte no cronograma, se houver um: 2 semanas = 10 dias = 8-10 horas/dia => 80-100 horas-homem de programação. É mais seguro considerar 5-6 horas por dia no começo e ajustar semanalmente.

Não é possível 9 mulheres gerar um bebê em 1 mês. (Frederick Brooks)

Fontes:
Meiobit
Bicalho’s Memory About Fraked Up Projects
BROOKS, Frederick P., Jr. 1995. The Mythical Man-Month, Anniversary Edition. Reading, Mass.: Addison-Wesley.
(referência não está no formato ABNT)

Como estudar

segunda-feira, 9 de março de 2009

O cérebro é um monte de informações. Nós não lembramos de fatos simples, mas ao invés disso, interligamos por associação. Toda vez que nós experimentamos um evento novo, nosso cérebro liga os pontos visuais, cheiros, sons e as nossas próprias impressões juntos em um novo relacionamento. O cérebro lembra das coisas através da repetição, associação, lembranças visuais e todos os cinco sentidos. Com isso, em mente, aqui vão algumas dicas de como estudar para ajudá-lo:

Flashcards
Nosso cérebro assimila conhecimento mais facilmente através da repetição. Quanto mais você ouvir, ver ou repetir algo, mais fácil vai ser lembrar-se dele depois.

Com os Flashcards é possível memorizar diversas coisas rapidamente, além do diferencial de sua portabilidade, ou seja, você pode praticar em qualquer lugar.

Crie o ambiente certo
Normalmente, o lugar em que você estuda é tão importante como a forma que você estuda. Procure um lugar tranqüilo. Muitas pessoas não conseguem estudar em silêncio, mas também não é uma boa opção ficar em um lugar no qual você tem muitas distrações.

Escolha um lugar fixo para estudar, assim, sempre que você for até ele, estará criando uma rotina produtiva de estudos. Você se torna mais produtivo neste lugar, porque você o assimila com estudos.

Use acrônimos para se lembrar
Você já deve ter ouvido falar em acrônimos. São aquelas pequenas frases em que a primeira letra de cada palavra nos lembram algo relativo à matéria. É simplesmente abreviação, mas como transformamos em frases fica mais fácil trazer à memória. Além de que, em geral, são frases bastante engraçadas ou sem o menor sentido.

Ouça músicas
Pesquisar tem mostrado que certos tipos de músicas nos ajudam a lembrar de informações. Se você estuda ouvindo determinada música, ao pensar nela mentalmente você se lembra do que estava estudando.

Re-escreva suas anotações
Isto pode ser feito à mão ou no computador. Mas lembre-se que escrevendo à mão você gera mais atividade cerebral do que escrevendo no computador.

Simplesmente estudar as anotações pode ser desinteressante e gerar distrações. A melhor forma de estudar é ativamente, ou seja, se for estudar anotações, escreva-as novamente ao invés de simplesmente ler.


Utilize suas emoções
Emoções e sentimentos são partes importantes de nossa memória. Pense nisso. A ultima vez que você foi à uma festa, de quais pessoas você se lembra? A garota que te fez rir, o homem que machucou seus sentimentos e a criança que saiu gritando pelo salão são os que você se lembrará com mais facilidade. São os que têm um impacto emocional.

Felizmente, você pode usar o poder das suas emoções em seus próprios estudos. Aprimore sua memória usando seus cinco sentidos. Não memorize simplesmente. Não ouça ou veja as coisas em sua mente. Crie uma imagem visual exata do que você quer aprender.

Por exemplo, se você esta tentando aprender os componentes da célula humana, comecei imaginando a célula. Imagine como cada parte deve se parecer. Separe-a mentalmente pedaço a pedaço e depois una tudo novamente. Essa brincadeira emocional e visual ajuda a memorizar a matéria com mais facilidade e com mais chances de se lembrar depois.

Faça associações
Uma das melhores formas de se aprender novas coisas é relacioná-las a algo que você já sabe. Isso é conhecido como associação e é a cola mental que move seu cérebro.

Você já ouviu uma música e ela ficou na martelando na sua por alguma memória que ficou conectada a isto ? Você já viu um velho amigo que ativou memórias da sua infância ? Este é o poder da associação.

Para maximizar o nosso poder mental, nos devemos constantemente procurar por caminhos para relacionar novas informações com idéias antigas e conceitos que já são familiares.

Você pode fazer isso usando mapas mentais. Um mapa mental é usado para colocar palavras, fotos, pensamentos e ideias em diagramas e interconectar com as informações. Essa é uma prática simples que irá ajudá-lo a conectar qualquer coisa que você aprende.

Então, Quais são as suas melhores dicas ? Fale sobre o assunto nos comentários.

O texto é baseado no artigo How to Study [LifeHack].

Fonte: GotchaIT

Adsense: A verdade que os outros não diseram

segunda-feira, 9 de março de 2009

Já fiz alguns artigos sobre monetização de blogs, como o “5 ótimos programas de afiliados para rentabilizar seu blog” ou o “10 maneiras de ganhar dinheiro com seu blog de verdade“, mas na verdade o que a maioria das pessoas buscam na web, é como fazer o Adsense render mais, ou seja, ganhar mais do que meros trocados, sim, porque o que a maioria ganha, faz a gente acreditar que não é capaz de ganhar dinheiro com blogs, não é verdade?

Também existe muitos blogs que mentem, e mentem descaradamente quanto ao Adsense.
Tem gente que chega a falar em milhares de dólares ao dia somente usando o Adsense, Mentira!!!!!!! Se isto fosse possível, nós teríamos muito mais relatos de riqueza na web, mas todos sabem que isto não é verdade.

Agora deve estar se perguntando: “Tá! Mas da ou não para ganhar dinheiro com o Adsense?
Eu respondo que dá!
Não da para ficar rico, mas da para ganhar o dinheiro da “xepa”, e se bem arrumado com um bom tráfego, e alguns truques, da para fazer a xepa, a farmácia e até o açougue.

Exemplo disto é este mesmo blog, o Como Fazer Web, que tem apenas 2 meses e meio e tem uma média diária acima de $2,00(isto é referente a esta semana), pois tem subido gradativamente, conforme vou ganhando mais tráfego, e vou posicionando melhor os anúncios.

Imagem de Kawanet

Não pense que isto é pouco, em uma progressão bem planejada, com bons artigos, e claro fazendo os cálculos em cima do crescimento obtido até agora, este blog poderá alcançar até um patamar de $50 dólares diários quando completar um ano de vida(daqui um ano farei um novo artigo rsrsrsrs).

O que tem que acabar, é este negócio de dizer que não se pode monetizar um blog, pois atrapalha a leitura, ou esta não é a minha, coisas do tipo; Não querer monetizar com o Adsense, é aceitável, pois tem pessoas que entraram na web e permanecem na web com o único intuito de ter um blog por hobby, e claro que isto é aceitável, mas se alguma vez pensou em ganhar alguma coisa com seu blog, faça-o sem medo, pois se você escreve um artigo de qualidade e o leitor chega até você porque gostou do artigo, ele com certeza não irá se importar com o fato de você querer ganhar algum com o seu trabalho.

Acreditem ou não existem blogs como o Efetividade que em bons dias de tráfego chegam a ganhar $80 dólares por dia com o adsense, isto em 2006, quando ele escreveu este artigo “Como ganhar $160 dólares em um único dia com o adsense em um blog pessoal“, este artigo é formidável e aconselho a leitura, leia com atenção, pois da para tirar muita coisa dele.

Ainda aconselho estes artigos:

Fonte: Como Fazer Web

Discurso do Steve Jobs para Formandos em Standford

segunda-feira, 9 de março de 2009

Este video é sobre um discurso muito impressionate do Steve Jobs feito em 2005 e que vale a pena assistir. São palavras sobre as lições aprendidas em sua vida e que ele compartilhou não só com os alunos de Stanford, como com todos nós.

O discurso foi dividido em duas partes, com mais ou menos 15 minutos no total e está com legenda em português. Recomendo que veja o video sem pausas, porque pode perder um pouco da mensagem passada.

Parte 1:

Parte 2:

Indicação: Tavinho Costa

Engenharia de Software: Anatomia de um Projeto Fracassado

domingo, 8 de março de 2009

Houve um feedback muito positivo sobre os posts relacionados a engenharia de software e projetos. É impressionate como as empresas e obviamente, as pessoas que fazem parte delas, continuam cometendo os mesmos erros. E mais, são erros tão comuns que não importa a tecnologia. Prazos muito curtos, estimativas completamente erradas, requisitos mutantes, gambiarra e fracassos, muitos fracassos.

O The Standish Group publica um relatório chamado The Chaos Report e mostra o cenário da indústria de software:

- Aproximadamente 18% do projetos são cancelados por atrasos e orçamento estourados.
- Aproximadamente 52% dos projetos estouram o orçamento e/ou o prazo.
- Aproximadamente 30% de todos os projetos de TI atingem seus objetivos dentro de prazo e custo estimados.

Se apenas 3 de cada 10 projetos dão certo, o que raios está havendo com os outros 7? A taxa de falhas é enorme e não há comparação com outros tipos de indústria e os motivos já foram descritos em inúmeros livros e um deles é: software é abstrato.

Quando alguém pede para colocar rodas de liga leve no carro, espera pagar por isso. O objeto “roda de liga leve” pode ter sua qualidade analisada imediatamente: menor peso, mais bonito, etc. A mesma lógica não funciona para software, já que ele não existe no mundo físico, é texto que magicamente faz alguma coisa acontecer dentro do computador.

“…colocar uns botões dinâmicos aqui, sem refresh… poderia ser em Flash ou quem sabe Silverlight. Hum… será que Flex seria vantajoso? Vamos fazer em Flex. Se ficar ruim, tentamos Flash e/ou Silverlight. Mas não pode atrasar!”

O que assusta muita gente é que não há linguagem, framework, ferramenta ou plataforma que resolvam problemas que estão além da tecnologia. As metodologias de desenvolvimento ágil como o Iconix, Scrum e XP tem o mantra “embrace change”, ou seja, não lute contra mudanças, mas integre-as ao seu dia a dia. Apesar disso parecer uma novidade, não é. Esse tipo de busca já havia sido objeto de pesquisa e análise nos anos 60 e 70 do século passado.

E o que é mais interessante. A lista que vou apresentar abaixo é antiga e muita gente lê e diz: nossa, verdade.

anatomia_fracasso

Agora, dos listagem acima, quantos deles o PHP, Ruby on Rails, Java ou .Net possuem influência?

Nenhum. São atividades que precedem a escrita do código e a escolha da tecnologia. Todas circulam em torno de Planejamento. Há um enorme vício em começar a trabalhar sem planejamento algum. É impressionante como o importante é sempre o mantra “começar o desenvolvimento o mais rápido possível”. É o velho pensamento de que se não há código, não há progresso.

Se traçarmos um paralelo com o mundo real, é como começar a construir um prédio, sem saber quantos andares ele vai ter.

Fonte:

Meiobit

Bicalho’s Memory About Fraked Up Projects

Os 25 erros de programação mais perigosos segundo a SANS

segunda-feira, 2 de março de 2009

Fonte: core.eti.br

Saiu no site da SANS a lista criada com o consenso entre varios profissionais e empresas do ramo de segurança e desenvolvimento descrevendo os 25 erros de programação mais perigosos para o desenvolvimento seguro. Eu vou traduzir os nomes e informação básicos mas o melhor é ler o artigo na íntegra, em inglês.

Os erros estão separados em três categorias: Interação insegura entre componentes, Gerenciamento arriscado de recursos, Defensas porosas.

Categoria: Interação insegura entre componentes

  1. Validação Imprópria de Entradas: Entradas que recebem dados e os aceitam mesmo sem certificar que eles são do tipo/formato esperado.
  2. Codificação ou Escape Impróprios de Saída: Saídas que não são codificadas ou escapadas corretamente são a maior fonte de ataques de injeção de código.
  3. Falha ao Preservar a Estrutura da Busca SQL (conhecido como Injeção de SQL): Se os atacantes podem influenciar as procuras SQL do seu programa, então eles podem controlar o seu banco de dados.
  4. Falha ao Preservar a Estrutura do Código da Página (conhecido como “Cross-site Scripting”): Assim como o anterior, se os atacantes podem injetar código ou scripts em sua página, eles podem controlar a página.
  5. Falha ao Preservar a Estrutura de Comandos do Sistema Operacional: Se você permitir que entradas ilegais sejam passadas para aplicativos do sistema operacional, o atacante pode controlar o servidor.
  6. Transmissão de Dados Sensíveis em Texto Puro: Senhas, dados de cartão e qualquer informação considerada sensível deve ser criptografada.
  7. Falsificação de Requisição Entre Sites: Um atacante pode criar uma requisição que é enviada a outro site forjando a origem e fazendo o mesmo partir de um usuário inocente, aproveitando credenciais de autenticação e acessos.
  8. Condição de Corrida: Atacantes vão sempre procurar por condições de corrida no software para conferir se alguma informação importante não é obtida no processo.
  9. Vazamento de Informações em Mensagens de Erro: Atacantes vão procurar por mensagens de erro que descrevam mais que o necessário, como nomes de campos SQL, objetos e bibliotecas sendo utilizadas.

Categoria: Gerenciamento arriscado de recursos:

  1. Falha ao Limitar Operações aos Limites de um Buffer de Memória: O conhecido buffer overflow.
  2. Controle Externo de Dados Sensíveis: Informações críticas que são mantidas fora de um banco de dados por questões de performance não deviam ser facilmente acessíveis por atacantes.
  3. Controle Externo de de Caminho ou Nome de Arquivo: Quando você usa dados externos para montar um nome de arquivo ou caminho de gravação, você está se arriscando a ser atacado.
  4. Caminho de Procura Inseguro: Se o caminho de procura de recursos estiver em algum lugar sob controle de um atacante, bibliotecas ou código pode ser inserido a revelia.
  5. Falha ao Controlar a Geração de Código: Caso o atacante consiga influenciar a geração de código dinâmico (se geração de código dinâmico for utilizada no programa) ele poderá controlar todo seu código.
  6. Download de Código sem Verificação de Integridade: Se você executa código obtido por download, você confia na fonte. Atacantes podem aproveitar esta confiança.
  7. Desligamento ou Liberação Impróprias de Recursos: Arquivos, conexões e classes precisam ser corretamente encerradas.
  8. Inicialização Imprópria: Dados, bibliotecas e sistemas inicializados incorretamente podem abrir margens para problemas.
  9. Cálculos Incorretos: Quando o atacante tem algum controle sobre as entradas usadas em operações matemáticas, isso pode gerar vulnerabilidades.

Categoria: Defensas porosas:

  1. Controle de Acesso Impróprio: Se você não garante que seus usuários estão fazendo apenas o que deviam, os atacantes irão se aproveitar de sua autenticação.
  2. Uso de um Algoritmo Criptográfico Quebrado ou Vulnerável: Utilização de algoritmos fracos ou comprometidos levam a falhas de criptografia e vulnerabilidades.
  3. Senha no Código: deixar um usuário e uma senha no próprio código traz inúmeros problemas.
  4. Permissão de Acesso Insegura para Recurso Crítico: Configurações, arquivos de dados e bancos de dados devem ter suas permissões de acesso protegidas.
  5. Uso de Valores Insuficientemente Aleatórios: Se você usa tipos de segurança que dependem de aleatoriedade, usar um gerador aleatório insuficiente só vai causar problemas.
  6. Execução com Privilégios Desnecessários: Se seu programa precisa de privilégios elevados para executar suas funções, ele deve abrir mão destes direitos assim que ele termina de executar as ações que precisavam dos privilégios.
  7. Aplicação de Segurança do Lado do Servidor pelo Cliente: Atacantes podem usar engenharia reversa em um cliente de software e escrever seus próprios clientes removendo testes e aplicações de segurança.

Algumas coisas foram realmente chatas de traduzir, sinta-se livre para sugerir correções.

intel

PS: Lembre-se sempre “os 25 mais” não quer dizer “os 25 únicos”. Grain of Salt faz bem.

Fonte: core.eti.br