Páginas

Mostrando postagens com marcador lean. Mostrar todas as postagens
Mostrando postagens com marcador lean. Mostrar todas as postagens

18 junho 2008

ExpoGestão 2008: aí vou eu!

ExpoGestão 2008
Saudações!

O resto desta semana estarei na ExpoGestão2008, evento que ocorrerá em Joinville...

Irei como correspondente oficial da Audaces juntamente com um dos gerentes de produto aqui... (acho que estou ficando importante... credo!)

Quero muito ouvir o caso da Boeing, já sabendo que eles aplicaram um modelo Lean de produção juntamente com a idéia de chão de fábrica global do wikinomics

Acompanhem atualizações e fotos sobre o evento neste mesmo local..

[]s

28 maio 2008

Lean: Decida o mais tarde possível!

Decida o mais tarde possível
Tudo bem, pode soar completamente arriscada a afirmação do título, principalmente com a nossa má fama de deixar tudo para a última hora...

Desenvolvimento de software é uma atividade de problem-solving, e diferentemente dos demais produtos, espera-se que sistemas de computador tenham atualizações constantes. O principal fator para isso é que utilizamos softwares para resolver problemas complexos, principalmente quando o nível de incerteza é alto.

Complexidade pode ser tratada de duas formas: através de previsibilidade ou adaptabilidade... como dificilmente conseguiremos prever o comportamento de sistemas complexos, a adaptabilidade é a melhor opção.

No post anterior, discuti sobre uma forma de tratar problemas quando a incerteza é alta: buscando informação e feedback!

Para confirmar a afirmação:
O custo do ciclo de vida de um software atribuído à manutenção é de 40 a 90% do custo total de produção de um software, segundo Kajko-Mattsson.


Isto quer dizer que, logo após o primeiro release de um sistema, com certeza ele precisará de ajustes para se adequar às necessidades dos problemas que ele se propos a resolver...

Este fato que nos ajuda a desmistificar completamente a utilização de um modelo waterfall, uma vez que todo o trabalho em definição de um Big Design Up-front trará muitos problemas na hora de realizar alterações. A curva abaixo mostra o custo da mudança num modelo assim:
Cost of Change
Software Engineering Economics


E como resolvemos isso?



Bem, se para tomar melhores decisões é preciso conhecer melhor o problema e ter feedback real sobre a interação de sua aplicação com o ambiente de produção, podemos assumir que:

  • Quanto mais conhecimento melhor

  • Quanto mais opções para solucionar um mesmo problema, melhor podemos encontrar a ideal

  • Conhecendo várias possibilidades de atuação, será possível encontrar riscos ocultos

  • Quanto melhor a solução para um problema, maior será a satisfação de seu cliente



Os itens acima estão no cerne dos processos adaptativos de software, e é a forma que optamos em construir nossos sistemas em se tratando de Desenvolvimento Ágil.

Como requisitos podem ser apenas parcialmente compreendidos para serem produzidos numa equipe Ágil, é possível que, à medida que a solução emerge, se possa compreender melhor o domínio do problema através de incursões rápidas e sistemáticas ao ambiente real de trabalho.

Isto implica em possuir requisitos de negócio mutáveis, que possam ser adaptados à medida que o sistema, e a compreensão do problema evoluí. O cliente, neste ambiente, possuí papel importantíssimo para determinar em que momento a solução tornou-se suficiente.

Trabalhe as incertezas e dúvidas de seus clientes de forma a não enrijecer o seu sistema. Somente tome decisões cruciais quando houver fatos suficientes para apoiar sua escolha, caso contrário você tem grande risco de ampliar seus gastos com manutenção de sistemas...


Continua no próximo capítulo

29 abril 2008

Lean: Set-based Development

Set-based Development
Lean é sobre comunicação: ampliada, direta, explícita, holística e ativa. Como mais uma ferramenta para ampliar o aprendizado, vou explicar o conceito de Set-Based Development: simples, mas bastante eficiente!

Imagine a situação: você quer fazer um jantar para os seus amigos! Um macarrão ao vôngole! (vulgo berbigão da lagoa para os manezinhos da ilha)

Qual a maneira mais antiga de se fazer isso? Ligando para cada uma das pessoas e avisando que o jantar será no sabado!
Mas uma questão importante para esta sua escolha é que você não está levando em consideração que seus convidados podem não estar disponíveis num sabado à noite para um jantar...

Mas como você é realmente um cara esperto, não vai logo marcando a data do jantar... afinal, você precisa saber se os seus amigos estarão disponíveis! Como você procede?
Escreva a lista de seus convidados:

- Huguinho
- Zezinho
- Pamela Anderson
- Mônica Mattos
- Jenna Jameson

Agora você precisa ligar para todos e saber quando eles estarão disponíveis.
Imaginemos a seguinte disponibilidade:

- Huguinho: Quarta, Sabado
- Zezinho: Quarta, Quinta
- Pamela Anderson: Todos os dias
- Monica Mattos: Segunda, Sexta, Sabado
- Jenna Jameson: Sexta

Bem, Set-Based Development sempre será à respeito de Restrições, não escolhas. Isto significa dizer que, à partir dos dados coletados sobre todos os convidados, pode-se tomar uma decisão mais acertada sobre quando será o jantar: sexta-feira!! Realmente a melhor opção...


E o que isso tem com desenvolvimento de software?



Contratar as moças acima fará com que os desenvolvedores trabalham mais... ou pelo menos que eles cheguem mais cedo... =)

No exemplo acima, para encontrar a solução de um problema, foi necessário coletar informações sobre as restrições que os vários domínios possuem, esperando para que uma decisão seja tomada somente no momento em que se possui o maior conhecimento sobre as várias opções.

Ao desenvolver uma funcionalidade, pode ser necessário decidir sobre um caminho. Esta abordagem supõe que se tenha mais informações sobre as possibilidades antes mesmo de escolher para onde seguir.
Significa dizer que, dados os domínios, a melhor solução pode ser encontrada definindo qual a intersseção entre eles. A figura abaixo exemplifica isso:

Set-based development


Quando existem várias equipes organizando o trabalho a cerca de um mesmo projeto, esta pode ser a forma mais simples de evitar desperdício de comunicação. Durante a produção de um item será possível avaliar a conformidade com as restrições dos grupos envolvidos.

Em produção de carros, é o mesmo que os engenheiros definirem a disposição do chassis do carro, e deixar que os designers façam o trabalho de produzir o carro mais lindo do mundo. Antes de tomarem decisões malucas sobre como será o carro, os designer podem conformar seus modelos com as restrições de chassis...

- Checklists podem ser úteis!

Você consegue identificar quais são as restrições para uma funcionalidade ou requisito de negócio? Restrições de usabilidade que os usuários alvo possuem?
Antes de decidir qual ação tomar, verifique as possibilidades que você possue e escolha a solução que melhor se encaixe no seu objetivo: construir software que satisfaça seu cliente

[]s

15 abril 2008

Lean: Como maximizar o feedback?

Maximizar Feedback


Adaptado do livro: Lean Software Development: An Agile toolkit.

Passo a passo para ampliar o feedback



1) Escolha o seu problema mais difícil e encontre uma maneira de ampliar o feedback

a. Amplie o feedback das equipes de desenvolvimento à gerencia perguntando a cada equipe ao término de uma interação as seguintes perguntas:

  • A equipe possuiu todos os conhecimentos necessários para esta iteração?

  • Algum recurso necessário faltou?

  • Como podemos modificar nosso trabalho de forma a tornar o desenvolvimento mais rápido e melhor?

  • O que está atrapalhando o caminho?


b. Aumente o feedback dos clientes e usuários para a equipe de desenvolvimento mantendo um grupo com foco no usuário final. Encontre as respostas para as perguntas:

  • O quão bem esta sessão do software resolverá o problema para o qual ela foi criada?

  • Como pode ser melhorado?

  • Como esta última iteração afetou a sua percepção sobre as suas necessidades?

  • O que você precisa para colocar este último incremento de software em produção?


c. Ampliar o feedback do produto para a equipe de desenvolvimento pode ser feito através de:

  • Ter os desenvolvedores escrevendo e executando testes de código à medida que o código de produção é escrito

  • Ter analistas, clientes ou testadores executando e criando testes de aceitação à medida que os desenvolvedores trabalham no código. Permita que os desenvolvedores auxiliem nestes testes com o intúito de automatizar tudo.

  • Permita que desenvolvedores tenham acesso aos testes de usabilidade de cada uma das funcionalidades próximas de serem finalizadas, para que eles possam verificar como os usuários reagem à implementação


d. Amplie o feedback dentro da própria equipe através de:

  • Torne os testadores em parte integrante da equipe

  • Incorpore todos os envolvidos no projeto desde as primeiras fases

  • Estabeleça a política de que a equipe de desenvolvimento deverá manter o produto



2) Inicie iterações com sessões de negociação entre clientes e desenvolvedores. Clientes devem indicar quais funcionalidades possuem a prioridade máxima, e os desenvolvedores devem selecionar e comprometerem-se somente com aquelas que eles acreditam realmente serem capazes de completar no período fechado da iteração

3) Insira os gráficos de progresso para seu projeto em uma área comum para que a equipe(s) possa visualizar sem problemas o que precisa ser feito e que todos possam ver para onde o projeto está convergindo

4) Se você dividir um projeto através de múltiplas equipes, faça um esforço a mais para dividir a arquitetura de maneira a permitir que elas possam trabalhar o mais independentemente possível. Encontre maneira dos times sincronizarem o próprio trabalho o maior número de vezes possível (build contínuo do sistema todo)

5) Equipes independentes devem considerar também a interface do usuário de forma independente

6) Encontre o seu problema mais complexo e faça sua equipe conseguir três soluções viáveis para resolvê-lo. Ao invés de escolher apenas uma das soluções, permita à equipe experimentar todas as três opções ao mesmo tempo.

[]s

13 abril 2008

Lean: Maximize o Feedback



Temos a tendência a categorizar e determinar comportamentos(procedimentos?) para todas as atividades que executamos. É comum que numa empresa busquemos padronizar o trabalho e criar regras para orientar o trabalho de todos.

No post anterior (e num dos posts mais lido do blog), apresentei a idéia de que, seguindo o modelo científico, para o desenvolvimento de software, o ciclo de aprendizado deve facilitar a experimentação ampliando o acúmulo de conhecimento. Feedback, nesta ótica, é o resultado de seus experimentos e será a forma mais efetiva de lidar com problemas em nossa área.

Como?


  • Ao invés de permitir que erros acumulem, rode os testes no momento em que o código for produzido

  • Ao invés de adicionar mais documentação ou mais detalhes ao planejamento, tente validar idéias escrevendo código

  • Ao invés de garimpar mais requisitos com os usuários, mostre a eles um grupo de potenciais telas e receba sua impressões

  • Ao invés de estudar mais cuidadosamente qual ferramenta utilizar, leve as três principais para sua empresa e teste!

  • Ao invés de tentar descobrir como converter um sistema inteiro em um único esforço massiço, crie uma interface web para o sistema legado e evolua esta idéia




Feedback para Equipes



Talvez a principal apresentação sobre o tema. Direto do Google Chanel no youtube




Série de Posts sobre Lean:


1. Elmine o Desperdício
2. Amplifique o Aprendizado

09 abril 2008

Lean: Amplie o Aprendizado

Xadrez só se aprende jogando

As origens do Lean estão diretamente ligadas à indústria. Entretanto, os princípios Lean podem ser aplicados diretamente ao desenvolvimento de software.
É preciso deixar claro: Criar software não é um processo produtivo; a atividade é melhor comparada a um processo de desenvolvimento.

Mas qual a diferença?



Entenda o processo de desenvolvimento de software como uma atividade semelhante à do Chef de cozinha, preparando um novo prato. Um processo produtivo seria eu, após ver a receita no programa da Ana Maria Braga, reproduzí-la. Para um, a variação de experiências é extremamente importante para atingir os melhores resultados... para o outro (eu e a Ana Maria), a situação é diferente, variações não são toleradas, sob pena de não ter o prato criado.

O método científico



Software está inserido no grupo de atividades chamadas problem-solving. Isto quer dizer que, de antemão, toda a intenção em criar um software está ligada à resolução de um problema.

Para problemas complexos, é necessário ter o máximo de informação possível para que se possam propor uma solução apropriada. A aborgadem coerente para tal é utilizar o método científico: observe, crie uma hipótese, execute um experimento e verifique se os resultados são condizentes com sua hipótese. O ponto interessante de tal abordagem é que, caso suas hipóteses estejam sempre corretas, você não conseguirá aprender muito. Caso exista uma possibilidade de falha em suas hipóteses, a quantidade de informação adquirida em experimentar será imensamente mais rica.

Existem duas escolas bastante distintas em na área de software:

A primeira motiva um desenvolvedor a ter certeza que todas as suas soluções - design, código, testes- estejam perfeitas à primeira execução. Neste ambiente existe pouco espaço para a geração de conhecimento através da experimentação. Esta abordagem funciona melhor em problemas bem estruturados - normalmente possuem uma única solução já bem conhecida e um caminho preferido para alcançar tal solução. Por exemplo, os principais problemas apresentados em colégios.

A segunda escola afirma ser melhor possuir ciclos rápidos de experimente - teste - corrija do que garantir à primeira vista que um código está perfeito. Citando Edward Yordon:
Um pedaço de lógica em código normalmente precisa ser reescrito três ou quatro vezes para ser considerado um trabalho elegante e profissional. Então por que existe tanta resistência em refatorar código quando estamos sempre felizes em poder revisar documentos várias vezes até chegar a um resultado satisfatório?




A sugestão Ágil



Transforme a experimentação e o feedback numa constante. Permita que os desenvolvedores possam, de forma rápida e barata, tentar formas novas de aumentar sua qualidade e produtividade. Utize os resultados para aprender o máximo que puder e não tenha medo de tomar decisões erradas.

Iterações curtas permitem um feedback instantâneo dos clientes e usuários sobre a satisfação e a utilidade que seu sistema apresenta.

Retrospectivas são um momento importantíssimo do processo de desenvolvimento de software, já que é possível encontrar problemas que afetam a todos numa equipe, que dificilmente seriam percebidos.

"Learning is everything"


[]s

07 abril 2008

Lean: Elimine o Desperdício



O que é Desperdício?


Desperdício(Waste) é tudo aquilo que não adiciona valor a um produto, valor este que deve ser percebido pelo usuário.

Se um componente de software não utilizado usuário é mantido no sistema, isto é disperdício. Se um ciclo de desenvolvimento de software se esforça para levantar um livro de requisitos que não é lido, isto é desperdício. Se os desenvolvedores produzem mais funcionalidades que o imediatamente necessário, isto é disperdício. Em desenvolvimento de software, transpor o trabalho entre equipes é disperdício.
Para o modelo Lean, o ideal é encontrar o que o cliente deseja, e então criar ou entregar exatamente o que ele necessita, virtualmente no exato momento da solicitação.
Qualquer coisa que entre no caminho de rapidamente satisfazer uma necessidade do cliente é considerado desperdício!

Encontrando desperdício


Por Mary Poppendieck: Eliminate Waste

Os sete desperdícios do Desenvolvimento de Software



Trabalho Particialmente Finalizado
Você deve possuir uma vaga idéia de como o sistema funcionará. Pode até ter uma noção de requisitos de negócio e condições de sucesso para uma funcionalidade. Quem sabe até mesmo algum código produzido.
Entretando, equanto este código não estiver integrado a sua base de código, tiver sido validado e aceito por seu usuário, não há como prever o seu comportamento. Funcionalidades pela metade apenas atravancam o caminho para trabalhos que poderiam ser feitos. Tornando-se facilmente obsoleto, trabalho parcionalmente concluído é pior do que trabalho nenhum... Funcionalidades e códigos parcialmente finalizados ampliam a complexidade de seu sistema, e amplificam os custos de manutenção de sua aplicação.

Processos Extras
Você já se perguntou se todo o papel utilizado é realmente necessário? Algum procedimentos para desenvolvimento de software requerem papeis para serem assinados por usuários, fornecendo rastreamento e permitindo a aprovação para uma mudança. Já verificou se o cliente realmente acha estes procedimentos valiosos? O fato de um documento ser um artefato de software não o torna valioso. Se você tem que esperar que um documento seja produzido para que você inicie o seu trabalho, reavalie a real necessidade de tal documento, e porque não, proponha mudanças. Lembre-se: procedimentos podem e devem ser questionados!

Funcionalidades a mais
Pode parecer ótimo entregar ao cliente mais funcionalidades do que ele está esperando... pegá-lo de supresa, e supreendê-lo... este é o desperdício mais śerio. Mais funcionalidades significa: Mais código para ser mantido. Mais testes para serem realizados. Mais documentos de especificação para serem criados. Mais conteúdo para gerar documentação. Mais bugs para aparecerem no sistema... enfim: jogar dinheiro no lixo... ainda mais se você pensar que 80% do total de funcionalidades de um sistema simplesmente não são utilizadas.

Troca de tarefas
Organizar pessoas em múltiplos projetos é outra forma de desperdício. Por ser uma atividade essencialmente intelectual, é necessário, toda vez que ocorrer a troca entre tarefas de projetos diferentes, que o desenvolvedores foque-se em algo completamente novo. Contexto de projeto diferentes, realidades diferentes, procedimentos muitas vezes diferentes...
O tempo que ele levará para estar realmente produtivo em cada projeto reduzirá muito! Sem contar que, normalmente, ocorrerá uma guerra de interesses entre os projetos pela atenção do desenvolvedor...
Minha vó já dizia: fazer muitas coisas ao mesmo tempo é um pretexto para não finalizar nenhuma

Espera
O maior ponto de desperdício em desenvolvimento de softwar é esperar para que algo seja produzido. Esperas em iniciar projetos, realizar testes, aguardar o levantamento de requisitos detalhistas, desenvolver uma funcionalidade são consideradas desperdício.
Atrasos distanciam seu usuário de receber um produto que satisfaça suas necessidades. Em muitos casos, atrasos são apenas a ponta do iceberg para problemas muito maiores. Em ambientes e mercados muito competitivos, atrasos e esperas podem significar milhões de investimento perdidos.
Poucos consideram custos realicionados a participação do mercado como sendo influenciada por atrasos... mas os principais líderes do mercado atualmente foram os pioneiros em seus nichos...

Movimento
Desenvolvimento de software é uma atividade que demanda muita concentração, e interrupções podem ser desastrosas no trabalho realizado. Quanto tempo um desenvolvedor leva para encontrar uma informação? Questões sobre requisitos de negócio ou informações técnicas levam quanto tempo para serem respondidas?
Documentos que transitam entre setores também são disperdícios. Quanto mais pontos um documento passar para iniciar sua implementação, maior será o ruído causado pela interpretação de informações (efeito telefone sem fio)

Defeitos
Você sabe o quanto custo a correção de um problema em fase desenvolvimento? e na integração? UM ABSURDO!!
Defeitos no sistema não agregam valor, não satisfazem o cliente, e definitivamente não são baratos. Qualquer tipo de retrabalho causado por problemas de implementação de requisitos, interpretação de necessidades e correção de documentação devem ser severamente combatidos. Neste ponto os métodos ágeis diferem muito dos modelos mais tradicionais: Construa com qualidade, não tente aferir qualidade após o produto pronto. Crie uma sistema que evite que os erros ocorram, e não que verifique se eles estão presentes em seu sistema para depois corrigí-los.



Tentar eliminar alguns dos desperdícios existentes no desenvolvimento de software é o primeiro passo para melhorar a qualidade de seu sistema... Tente!

14 janeiro 2008

Release Planning e Interações para Gerentes

Mais um podcast de All Shalloway, falando sobre sua experiência apresentando um pouco de Agile para Gerentes - especialmente falando sobre Release Planning.

Fonte: http://www.netobjectives.com/blogs/agile-scrum-management-release-planning-iterations-sqe




File .mp3

05 dezembro 2007

Um pouco de Alan Shalloway



Allan Shalloway, da NetObjectives apresenta seu ponto de vista sobre os benefícios do Scrum:

Fonte: Praise for Scrum

A natureza iterativa do Scrum permite o aprendizado rápido. Sendo Scrum baseado num modelo iterativo, é normalmente necessário construir uma parte do sistema e inclusive entregá-la ao cliente para receber feedback e somente assim continuar. Esta natureza permite aprender rapidamente as necessidades do cliente tão bem quanto aprender de que forma otimizar o próprio processo de entregar valor agregado ao cliente.

A inclusão do cliente, assim mais valor pode ser entregue rapidamente. Focando-se na relação entre o cliente e a equipe, Scrum traz à tona um dos maiores desafios para a equipe: conseguir informações concretas sobre o que construir. Scrum provê uma serie de idéias para lidar com clientes sobre a ótica de produtos. Construindo software em partes com o contato direto com o cliente, as funcionalidades mais importantes podem ser entregues rapidamente.

Diminuição do risco de construir a coisa errada. Apresentando o mais rápido possível as funcionalidades implementadas ao cliente, a equipe pode diminuir significativamente as chances de construir ou interpretar errado requisitos. Isto é extremamente importante, sendo o maior risco para o desenvolvimento de software. Construir funcionalidades que não serão utilizadas é obviamente desperdício de recursos. Entretanto é muito pior do que se imagina. A complexidade extra, e não utilizadas, deste software pode causar ainda maiores custos de manutenção, que serão normalmente maiores que o custo de construir a funcionalidade.

A ênfase em na remoção de impedimentos. Sendo Scrum um ótimo processo para iniciar, seu foco em remover impedimentos leva a equipe à procura de continuamente melhorar seu desempenho. Isto não apenas possibilita à equipe gerar mais valor, é um beneficio para a propria criação do time. E uma ótima equipe produzirá muito mais valor com um processo capenga do que uma equipe mediana. Boas equipes com processos ótimos podem ser realmente maravilhosos.

Dá a oportunidade às pessoas perceberem que estão no controle de seu destino. Remover impedimentos da vida de alguém possue um efeito espiritual. Traz à tona a consciencia de que esta pessoa não é a vitma, mas o capitão de suas proprias decisões.

Facilmente implementado pela equipes. O fato de Scrum ser tão simples é impressionante. Com apenas um dia de treinamento já é possível iniciar a sua utilização. Vitórias rápidas são as melhores!

30 novembro 2007

Tornando-se um líder Ágil - parte 3




Entenda como funciona a Liderança sob a ótica do Lean thinking.
Palestra ministrada por Mary Poppendieck - excepcional. Um pouco demorada, mais muito produtiva.

Assista na íntegra (com os slides da apresentação)
http://www.infoq.com/presentations/poppendieck-agile-leadership



27 outubro 2007

Impressões - Semana Acadêmica do Senac



Saudações a todos!

Recorde para mim: 3 capitais brasileiras em menos de uma semana...
Informação off-topic: Dona Rita, minha mãe, defendeu o mestrado esta semana e está toda feliz pela nota 10 com louvor na PUC/SP. Isso ai! PARABÉNS MÃE!! Estou em São Paulo para comemorar junto com ela essa conquista!! (...)

Voltando.
Quinta feira apresentei duas palestras na semana acadêmica do Senac, como descrito no post anterior. Muito bom!! Para as duas primeiras palestras falando de Desenvolvimento Ágil que fiz... até que foi ótimo!

Bem, foi bastante diferente do que imaginei, mas gostei muito da experiência...
A primeira das apresentação foi para um grupo pequeno de alunos do curso de Análise de Sistemas, e confesso ter ficado um pouco receoso se o foco estaria realmente adequado para os participantes, mas no final correu tudo bem, espero que as pessoas tenham gostado.

A segunda apresentação, com 50 inscritos foi mais tranquila, me senti mais à vontade com as perguntas dos participantes, e o ritmo da apresentação foi mais orgânico. Tanto que consegui falar por mais de 2 horas... absurdo! E só duas pessoas dormiram!! Com certeza um recorde!

Questões importantes: precisamos exercitar mais nosso poder didático e explicar melhor conceitos, evitando que coisas saiam mal entendidas. Mais de uma pessoa me perguntou: "vem cá, como esse tal de XP consegue elimar toda a documentação? Isso funciona mesmo?"... vamos produtores de conhecimento, aos princípios!! Eles nos salvarão da mediocridade do mundo... Agilistas Uni-vos!

Fiquei muito feliz em saber que um grupo de desenvolvimento de um Hospital de Porto Alegre conseguiu utilizar eXtreme Programming em uma equipe php, influenciando os demais desenvolvedores a utilizar algumas práticas. Um comentário interessante que ouvi: "Uma coisa interessante que identificamos é a mudança de postura com os cliente: ao invés do papel de chato, sempre cobrando 'e ai, ta pronto já esse sistema?' que os cliente faziam, passaram a ser os próprios desenvolvedores a cobrar por atitudes mais colaborativas dos clientes: 'e ai, já testou a funcionalidade que lhe enviamos?'". Bom!! Muito bom!!

Abaixo segue uma parte da apresentação... apenas o início... agradeço ao Pelotas (vulgo professor Guilherme) por ter gravado essas partes no celular... tb não consegui editar o video para que ele ficasse na posição correta... hahahah eu sei, eu sei... está horrível, mas alguém sabe me dizer como deixá-lo correto???
PS: desculpem as tosses!! que coisa feia!



24 outubro 2007

Palestra - Semana Acadêmica Senac RS



Saudações a todos!
A convite de um grande Amigo (Guilherme Pelotas), hoje estou de viagem marcada a Porto Alegre apresentar a palestra: Desenvolvimento Ágil - O desafio da mudança no dia 25 (quinta-feira)

A apresentação será feita na Semana Acadêmica das Faculdades Senac.

Bem, minha intenção é apresentar alguns princípios por trás do desenvolvimento Ágil (seguindo o exemplo de Kelly Waters) e de que maneira eles se unem gerando softwares de qualidade e divulgando empresas como o Google (se é que existe alguma empresa como o google). De forma descontraída, quero passar o que acredito ser o mais importante no desenvolvimento de software.

Programação do evento:
http://www.senacrs.com.br/2007/personal/2007109/10361.pdf
Uma correção: Meu nome é Victor Hugo Germano =)

Segue o pdf da apresentação:
http://www.4shared.com/file/27325657/fa6c772e/Desenvolvimento_gil.html

Novamente, minha intenção é divulgar o desenvolvimento Ágil, por isso disponibilizei a apresentação em seu formato real... sinta-se livre para modificá-la, critiá-la e distribuí-la.... desde que mantenha as referências... (chame-me de lunático... mas eu sou completamente partidário da mentalidade Wikinomics) =)
Ainda estou verificando a questão de copyrigth das imagens... mas logo se resolverá.

[]s

09 outubro 2007

Lean Software Development

Saudações!!

Você ainda não ouviu falar de Lean Thinking? Então é melhor se atualizar...
=)

Fontes: Lean Institue Brasil, Poppendieck LLC
Video ao final do Texto

Lean Thinking

Introdução

"Lean Thinking" (ou "Mentalidade Enxuta") é um termo cunhado por James Womack e Daniel Jones para denominar uma filosofia de negócios baseada no Sistema Toyota de Produção que olha com detalhe para as atividades básicas envolvidas no negócio e identifica o que é o desperdício e o que é o valor a partir da ótica dos clientes e usuários.

As práticas envolvem a criação de fluxos contínuos e sistemas puxados baseados na demanda real dos clientes, a análise e melhoria do fluxo de valor das plantas e da cadeia completa, desde as matérias primas até os produtos acabados, e o desenvolvimento de produtos que efetivamente sejam soluções do ponto de vista do cliente. A adoção dessa filosofia tem trazido resultados extraordinários para as empresas que a praticam. Mas prepare-se para as dificuldades na implantação. Poucas empresas têm conseguido replicar totalmente o sucesso e a eficiência operacional da Toyota. Originalmente concebida por Taiichi Ohno e colaboradores, essencialmente como práticas de manufatura, tem sido gradualmente disseminadas em todas as áreas da empresa e também para empresas dos mais diferentes tipos e setores, tornando-se efetivamente uma filosofia e uma cultura empresarial.

Os resultados obtidos geralmente implicam em um aumento da capacidade de oferecer os produtos que os clientes querem, na hora que eles querem, nos preços que eles estão dispostos a pagar, com custos menores, qualidade superior, "lead times" curtos, garantindo assim uma maior rentabilidade ao negócio. Onde Aplicar Desenvolvido originalmente no ambiente de produção da indústria de manufatura, o lean thinking vem sendo aplicado, com grandes resultados em eliminação de desperdícios, nos mais diferentes ambientes das organizações, dentro do conceito de "Lean Enterprise" (administração, desenvolvimento de produto e produção), bem como em empresas de diversos setores, tais como: automobilístico e seus fornecedores, aeronáutico, eletrônico, serviços, construção, mineração, saúde, produção sob encomenda, etc.

Os princípios são listados abaixo:

Elimine o Desperdício (Eliminate Waste)

Os três maiores disperdícios em software development:

  • Funcionalidades Extras
    • É necessário um processo que permita criarmos apenas os 20% de funcionalidades que nos dará 80% de valor
  • Imobilidade
    • Se seus requisitos são imutáveis, você especifica muito cedo. Se possui ciclos de testes-correção, você testa muito tarde
  • Fronteiras bem definidas
    • Fronteiras organizacionais geralmente ampliam em cerca de 25% o custo, criando pontos que diminuem o tempo de resposta e interferem na comunicação

Crie Conhecimento (Create Knowledge )

Planejar é muito importante. Aprender é essencial.

  • Utilize o método científico
    • Ensine equipes a: estabelecer hipóteses, conduzir vários experimentos rápidos, crie uma documentação concisa e implemente a melhor alternativa
  • Padrões existem para serem desafiados e melhorados
    • Encorpore a melhor prática atual que todos seguem, enquanto ativamente encoraja a todos o desafio de mudar os padrões
  • Performance futura é guiada pelo Feedback
    • Uma organização não "advinha" sobre o futuro e cria um plano; ela desenvolve a capacidade de responder rapidamente ao futuro à medida que ele se desponta no horizonte

Produza com qualidade (Build Quality In)

Se rotineiramente você encontra defeitos nos sistemas em um processo de verificação, seu processo é defeituoso

  • Código à prova de erros com Desenvolvimento Orientado a Testes
    • Escreva especificações executáveis ao invés de requisitos
  • Pare de construir código legado
    • Código legado é um código que não possui testes de aceitação ou testes unitários automatizados
  • O Big Bang está obsoleto
    • Use Integração Contínua é auto sincronização

Crie comprometimento (Defer Commitment)

Elimine a idéia de que iniciar o desenvolvimento deve acontecer através de uma especificação completa

  • Quebre dependências
    • A Arquitetura de um sistema deve suportar a adição de qualquer nova funcionalidade a qualquer momento
  • Mantenha opções
    • Pense no código como um experimento - faça-o ser tolerante a mudanças
  • Adie decisões irreversíveis para o último momento
    • Aprenda o máximo possível até tomar uma decisão irreversível

Entregue rápido (Deliver Fast)

Listas e filas servem apenas para atrasar as coisas

  • Entregas Rápidas, Qualidade Total e Baixo Custo são completamente compatíveis
    • Empresas que competem com base na velocidade possuem uma grande vantagem em custo, entregam qualidade superior e são mais alinhadas às necessidades dos clientes
  • Teoria das Filas funciona para o desenvolvimento, não apenas servidores
    • Focar-se em utilização cria um problema de tráfego que reduz a própria utilização. Diminua o tempo entre ciclos com menos funcionalidades e menos itens em processo.
  • Limite o trabalho à sua capacidade
    • Estabeleça uma velocidade confiável e cíclica com o desenvolvimento iterativo. Agressivamente limite o número de listas e filas de espera à sua capacidade de entrega

Respeito as pessoas (Respect People)

Pessoas inteligentes e comprometidas provém a maior vantagem competiva da empresa

  • Equipes despontam através de Orgulho, Comprometimento, Confiança e Aplausos
    • O que nos trasforma em uma equipe? Membros estão mutualmente comprometidos a alcançar um objetivo comum
  • Forneca liderança efetiva
    • Equipes eficientes possuem líderes eficientes que conseguem obter o máximo da equipe
  • Respeito parceiros
    • Alianças em join ventures não devem nunca criar conflito de interesses.

Melhore o sistema (Improve the System)

Produtos brilhantes emergem da combinação única de Oportunidade e Tecnologia

  • Foque-se em Toda a Cadeia de Valor
    • Do conceito ao faturamento
    • Da requisição do cliente à instalação do software
  • Entregue um produto completo
    • Desenvolva um produto completo, não apenas software. Produtos completos são criados por equipes completas
  • Meça
    • Meça capacidade do processo através de ciclos de tempo. Mensure a performance do time através de entrega de valor de negócio. Mensure satisfação do cliente através da promoção de redes.







04 outubro 2007

Acertando do início!



Saudações!
Desculpem a demora... estou preparando uma apresentação para a semana acadêmica do senac-RS e ando meio ocupado para escrever... mas vamos lah!

Texto muito bom de Jean MacAuliffe da NetObjectives (sempre ouço o podcast deles...), que trata sobre qualidade de software baseada nos princípios do Lean Thinking e Desenvolvimento Ágil, e a imensa diferença entre nossa abordagem e a abordagem tradicional.

Resumão:

Test-Driven Development unido a Pair Programming, Code review e Shared code Responsablities são as principais práticas para que se possa criar um ambiente onde a qualidade é o principal do desenvolvimento do produto.
O princípio Build quality in do Lean Manufacturing pode ser realmente aplicado num ambiente de desenvolvimento de software...
Pense nisso...

Pessoalmente acredito que outras práticas não tão relacionadas a desenvolvimento podem ser muito importantes para este estado de qualidade total... inclusive já escrevi sobre elas aqui.


Arquivo: Get it Right from the Start

=)


17 setembro 2007

Atendendo a um mercado ágil



Saudações!
Na última edição da revista Época Negócios, observei uma frase bastante interessante atribuída a Kevin Kelly, fundador da revista Wired:
"Não estamos mais numa época de mudanças, mas numa mudança de épocas"

Evoluímos mais do que os modelos de desenvolvimento pudessem suportar. Atualmente necessidades de mercado fazem com que produtos novos sejam lançados a cada seis meses (Apple, Panasonic, Sony, Google, Peugeot, etc já seguem esse padrão), ou até menos. E como nós, no desenvolvimento de software, reagimos a isso? Como nos tornamos eficientes o suficiente para que, a cada ciclo curto de mudanças de mercado, possamos responder com alto valor de negócio a requisitos de sistema?
Desenvolvimento Ágil é a única solução? Resposta clara: não! Mas pode ser uma ótima saída ao engessamento que nossas empresas vem passando. Europa e EUA já fazem isso há algum tempo, quando cairemos na real?

Visando a melhoria contínua de processos, e tendo em mente que algumas práticas de Desenvolvimento Ágil são realmente importantes, algumas sugestões de melhorias. Vejam as práticas:

1) institucionalizar reuniões de feedback, sejam elas em término de uma iteração ou no término de um projeto.

2) melhorar stand-up meetings!
- feitas ao lado do quadro
- ampliar complexidade do quadro informativo
- foco na resolução do problema

3) Pair Programming com maior frequencia...

4) revisão de código (como alternativa e complemento ao uso do TDD/Pair programming)
- sessões rápidas (pouca quantidade de código)
- validação de padrões de código
- possíveis melhorias em algoritmos
- visando ampliar comunicação sobre design/arquitetura

5) iniciar testes automatizados... nem que sejam simplificados
- incentivar a utilizacao de ferramentas de teste
- buscar informações sobre o tema
- implantar TDD

6) formar a cultura em volta da qualidade de software("what does 'done' mean?")
- definicao clara do que é uma funcionalidade terminada, e que possa ser realmente questionada
- deixar os próprios funcionários gerarem conteúdo de valor para a organização
- documentos e mais documentos para leitura e formação
- wikis
- foruns
- listas de discussão

7) Tentar aplicar os principios de desenvolvimento(necessário cobrança/inspeção)
- principio DRY (dont repeat yourself)
- principio KISS (keep it sweet and simple)
- principio "Don´t live with Broken window"/"Stop the line"
- principio YAGNI (you ain´t gonna need it!)


Vou explicar a relação entre as práticas, mostrando como elas se encaixam para tornarem-se uma opção concreta de melhoria para a empresa.

É excepcionalmente importante colocar o feedback no topo da lista de práticas a serem adotadas. A informação gerada durante uma reunião de término de iteração pode ser definida como:
  • O que de "bom" fizemos nesta Iteração? (se tivéssemos que repetir a iteração, seria mantido igual)

  • O que poderia ter sido feito diferente? (se tivéssemos que repetir a iteração, esses itens deveriam ser feitos de outra forma)

  • Em que podemos melhorar? (Idéias concretas sobre como melhorar para o futuro)


Assim, pode-se identificar necessidades e ataca-las com maior conhecimento na próxima iteração. Mais do que isso, é a forma de cultivar a motivação da equipe dentro do projeto, já que suas sugestões de melhoria são realmente ouvidas e podem ser efetivamente aceitas. Até mesmo reuniões de término de projeto, podem dar luz a problemas que possam ter ocorrido durante seu trajeto. Soluções e acordos encontrados nessas reuniões podem servir de base para a melhoria contínua que os métodos Ágeis se propõe.
Este item está intrinsecamente ligado à idéia de formar uma cultura sobre qualidade de software, pois a equipe estará focada em verificar formas de melhorar o próprio trabalho, e aliar essa motivação à Informação é o caminho mais rápido para o desenvolvimento do grupo. Um canal que possa disponibilizar conteúdo relevante sobre práticas de desenvolvimento e qualidade de software pode servir de referência para que todos participem da mudança que a empresa se propõe. É necessário envolvimento real das pessoas para que a cultura se instale na empresa. Como conseguir isso? Responsabilidade! Todos devem tornarem-se responsáveis pela manutenção do modelo de desenvolvimento de software com qualidade. Essa cultura surge à partir da relação que todos tem com o trabalho. Um profissional saberá sempre como tornar seu trabalho mais produtivo. Se existe uma formam dele conhecer mais sobre como melhorar a própria produtividade, ele o fará. E ainda, se lhe for dada a oportunidade de decidir sobre como tornar seu trabalho mais produtivo, ele assumirá o risco.
Assim, também a melhoria do processo de Reuniões Diárias tenta fomentar a melhor circulação de informações entre a equipe. Deve-se criar um Ambiente informativo, onde o número de dados é o mais relevante e o necessário para a tomada de decisão. O aproveitamento da prática pode ser muito ampliado se ela possuir a intenção de alinhar todos da equipe e remover entraves ao desenvolvimento, além de ser o real status do projeto.

Ligado à melhoria do código produzido (entre outros benefícios), as demais práticas estão fortemente ligadas.
Pair programming e ciclos revisão de código são grandes aliados, complementando um ao outro. Essas práticas vão ajudar a divulgar padrões de codificação, formatação, convensões de código e auxiliam na definição de Modelos de Objetos e Arquitetura de software que o projeto pode assumir. São práticas muito ricas para o terminamento de novos desenvolvedores e para criar o que chamamos de Código Coletivo no projeto, pois qualquer um dos desenvolvedores poderá manter o código do sistema, já tudo está padronizado e que, muito provavelmente, algumas pessoas já tenham trabalhado com o código.
Pair programming é a prática mais complexa de se justificar para gerentes, e existe uma forma de tornar a transição menos dramática para todos: inicie ciclos de revisão de código em dupla. Pouco código por vez, apenas o mais crítico à aplicação. Com o tempo, torne uma rotina a resolução de problemas complexos do sistema utilizando uma dupla. O resultado é bastante motivador, e poderá ser assumido pelos desenvolvedores e gerência de maneira mais orgânica.

Simplicidade é a alma do negócio.
Testes de software, inicialmente com poucas pessoas, apenas para validar a utilização da prática no ambiente de produção, já são um motivo para que a codificação fique simplificada. Aliado à programação em dupla/revisão, é o que eu chamo de "Combo da Qualidade Ágil"...
Princípios de desenvolvimento (KISS, DRY, YAGNI,etc) não precisam ser obrigatórios, pois eles naturalmente ganharão notoriedade à medida que as outras práticas estiverem sendo implantadas: utilizar testes obriga a pensar de maneira desacoplada, tentando criar a maior independência possível entre funcionalidades, facilitando a reutilização de código. Por outro lado, como as implementações tem que ser simples e de fácil compreensão, a revisão de código possibilita que sejam feitos refactorings de código apoiados em testes para garantir que tudo continua fucionando após a mudança. Programar em dupla auxilia no que é chamado "pressão da dupla", em que o código produzido pela dupla tende a ser melhor, já que sempre existe uma pessoa ao lado para inspecionar informalmente o código produzido.

Mais uma vez: não estamos aqui brincando de fazer software! Apoiamos um modelo de desenvolvimento bem formulado e com base suficiente para suprir a necessidade do mercado: inovação, respostas rápidas às necessidades do mercado e crescimento sustentável do software.


Referências:


14 agosto 2007

Webinars - Lean, SCRUM, Desenvolvimento Ágil

Saudações!
Agradecendo a indicação do Rafael Mueller, seguem abaixo as apresentações que a NetObjectives disponibilizou sobre Lean, SCRUM e Desenvolvimento Ágil...
Vale muito a pena assistir...