Gestão Visual

Um imagem em uma cartolina, com alguns post-its em sua empresa pode ser mais eficiente do que qualquer software que gere “n’s” relatórios com gráficos complexos que nem todo mundo sabe interpretar.

mulher-post-it-33278

O termo “Gestão Visual” é um sistema com diferentes técnicas de planejamento e melhoria contínua, que nos permite com um simples olhar, saber a situação atual dos projetos apoiando a alta gestão e integrando de uma forma colaborativa e transparente. No Kaizen é uma parte fundamental do famoso sucesso do Sistema de Produção ‘Just in Time’ da Toyota.

A “Gestão Visual” , vem nos permitir saber como andam as coisas na empresa, sem precisar perguntar para alguém ou mesmo consultar um computador. A informação está à alguns metros de distância, podendo estar em um simples post-it.

Segue algumas ferramentas que irão nos ajudar:

- Canvas;

- Kanban;

- Roadmap;

- Gráficos estatísticos;

- Diagramas de fluxo (Fluxogramas, Organogramas, Mapas de Fluxo de Valor e Mapas de Processo);

- Etc.

É importante ressaltar que não basta colocar um quadro de tarefas, uma cartolina colorida com informações dos projetos nas paredes da empresa. É preciso sim, que a equipe tenha o entendimento de cada recurso visual e que as equipes em conjunto com a gestão interajam em um fluxo contínuo de aprendizado e melhoria.

12-canvas-parede

Canvas

No canvas você vai direcionar para o equipe a visão de negócio do seu projeto. Existem vários modelos de canvas e você pode criar o seu de acordo com a necessidade da empresa.

Kanban

Kanban

No kanban você terá o fluxo de trabalho em tarefas, tornando transparente para a equipe e para a empresa a situação atual do projeto. Para o kanban também existem variações.

Roadmap

Roadmap

Com o Roadmap é possível você comunicar e planejar a visão de futuro para o produto que está sendo desenvolvido, nele você tem a visão geral do projeto com seus marcos de entrega, podemos chamar de linha de vida do projeto. A tomada de decisão da equipe com a gestão deve ser baseada no roadmap, o que antes ficava apenas no antigo gantt chart e visível apenas para a gerencia. Hoje fica transparente para toda a empresa.

Burndown

Burndown

Burndown normalmente é usando no uso do SCRUM com Kanban, com ele é possível analisar o progresso da equipe. O gráfico representa a quantidade de trabalho que falta ser feito no eixo vertical (y) versus o tempo no eixo horizontal (x).

Aqui apresentado são só alguns exemplos, mas no mundo da Gestão Visual a sua criatividade é que manda. Quanto mais transparente for o seu e o trabalho da equipe para a empresa, pode ter certeza que o feedback será mais frenético. Os problemas serão mais visíveis e as tomadas de decisões em conjunto com essas ferramentas tornará os times e a empresa mais integrada.

Recomendo:

- Video: A importância da Gestão Visual(Rodrigo de Toledo e Daniel Teixeira) https://www.youtube.com/watch?v=2CqzbVMeJdw (Palestra A Importância da Gestão Visual e como incluir um deficiente visual na gestão visual feita no Agile Brazil 2012)

- Video: Inclusão do deficiente visual na gestão visual(Daniel Teixeira)   https://www.youtube.com/watch?v=3fp7V-e62R8 (O vídeo expõem um caso no TRE-RJ, onde durante a adoção de métodos ágeis encontraram um obstáculo diferente do que se costuma encontrar. Carlos é um deficiente visual e trabalha como desenvolvedor, e aqui está uma parte da história de como estão conseguindo modificar as noções de gestão visual.)

#tasafoemacao com Manoel Pimentel: ESCALANDO A GESTÃO ÁGIL COM SAFE (SCALED AGILE FRAMEWORK)

Galera,
 
Convidamos toda a Comunidade a estar presente em mais um #tasafoemacao com Manoel Pimentel:
Tema:ESCALANDO A GESTÃO ÁGIL COM SAFE (SCALED AGILE FRAMEWORK)“.
Data: 09 de outubro 2014
Hora: 19:00hs
Local: Auditório – CESUPA – Centro Universitário do Pará – Endereço: Av. Alcindo Cacela, nº 1523., Umarizal, Belém, Pará, Brasil
Garanta sua vaga fazendo sua inscrição no Palestras Coletivas:
Lotação: 100 pessoas.
Totalmente Gratuito.
 
Escalando a Gestão Ágil com SAFe(Scaled Agile Frameworks)
Ao longo dos anos, a adoção de métodos ágeis avançou de forma concreta dentro das organizações.  Cada vez mais as empresas estão usando Agile em mais times, mais projetos, mais produtos e, envolvendo diferentes áreas da organização.  Todo esse avanço gerou um importante amadurecimento na forma de adotar Ágil. Esse amadurecimento também é norteado pelo objetivo de fazer todo o ciclo de desenvolvimento ágil cada vez mais conectado com as visões e anseios estratégicos da organização.
 
Dessa forma, é importante entender que para fazer Agile rodar em grandes empresas, será preciso responder perguntas como:
  • Como rodar ágil em contextos envolvendo vários times (ágeis e não-ágeis)?
  • Como sincronizar o trabalho desses times?
  • Como coordenar o resultado do trabalho de times distribuídos geograficamente?
  • Como priorizar demandas em produtos robustos e dinâmicos?
  • Como ser ágil e estar em conformidade com modelos de governança?
Por todo esse cenário, é vital lançar um olhar além e estender o raio de soluções a serem combinadas para fazer uma adoção ágil em larga escala.  Para fazer uso dessa visão pragmática, é importante entender:  a essência do pensamento Lean, os princípios do Product Development Flow, como organizar de maneira ágil um programa organizacional e, como usar de maneira sincronizada e cadenciado os benefícios do Scrum e do XP (Extreme Programming). Para encapsular essa abordagem, uma solução que tem sido praticada por grandes empresas é o SAFe (Scaled Agile Framework(SAFe).  SAFe É um modelo baseado em Scrum, XP, Lean e muita experiência de campo, para a implementação de práticas ágeis em grande escala. Ele reconhece o que tipicamente tem funcionado bem no trabalho de times ágeis, na forma de fazer gestão de programa e na maneira ágil tratar um portifólio de demandas organizacionais.  
 
Essa palestra visa apresentar uma visão inicial dessas soluções, explicar como o SAFe organiza esse trabalho em grande escala e principalmente, promover um espaço para um rico debate sobre como usar essa visão para resolver problemas reais das organizações.
 
Palestrante:
Manoel Pimentel Medeiros – É Agile Coach/Trainer na Adaptworks Treinamentos e Presidente da Agile Alliance Brazil. Trabalha há mais de 18 anos na área de TI, onde possui uma profunda experiência em ajudar, como coach ou trainner, a transição/experimentação Ágil (Scrum, XP, FDD, Lean, SAFe) em grandes e complexas organizações (por exemplo: Sicoob, Bancoob, Stefanini, Oi, GVT, XP, Petrobras, ITA, Itaú, Localiza). Manoel é um dos pioneiros no movimento Ágil no Brasil. Ajudou na tradução oficial do Manifesto Ágil para o Português. É membro ativo da organização do Agile Brazil (inclusive sendo chairman da edição 2013).  Ele também é o fundador da Revisa e Blog Visão Ágil. Já escreveu para portais internacionais como InfoQ, AgileJournal, ScrumAlliance, AgileAlliance e revistas como SQL Magazine, JavaMagazine, Mundo J e outras.  Revisou e Escreveu o prefácio do Livro Agile Project Management (Editora AltaBooks) em Português e do Livro  Scrum – Gestão Ágil para Projetos de Sucesso (Editora Casa do Código). Também é um co-autores do livro Métodos Ágeis para o Desenvolvimento de Software (Editora Bookman). É o mais ativo licensed trainer de Management 3.0 no Brasil, tendo inclusive, contribuído para formação e licenciamento de outros grandes facilitadores do cenário nacional. Também é detentor das certificações SPC (Scaled Agile Academy), CAC (Alpha Coach – WorthEthic), CSM, CSPO e  CSP (ScrumAlliance).

 

Nos vemos lá! ;)

#tasafoEmbarcAÇÃO no Barco Hacker!

O Ta safo! recebeu o convite e irá embarcar em mais uma expedição de um projeto sensacional, o Barco Hacker! Iniciativa tocada pela galera da Casa da Cultura Digital de Belém.

É juntar a fome com a vontade de comer, queríamos muito realizar um lance desses. A programação está só o creme e será uma excelente oportunidade de conversar com uma galera de diferentes segmentos e falar um pouco de nossa experiência de alguns anos pelo Tá safo!, através de um debate sobre: “Os desafios do empreendedorismo em comunidades”.

O evento será realizado no dia 19 de setembro a partir das 18hs com a saída do barco do Píer do Hotel Good Mar, Rua Professor Nelson Ribeiro, 132, Bairro do Telégrafo.

A programação completa, inscrições e mais informações estão no link https://doity.com.br/barcohacker. Até lá, marujos e marujas!

PS.: Quem não sabe nadar, não precisa levar bóia de braço. Terá colete salva-vidas no barco : P

E obrigado Breno Peck pela foto do barco no veropa.

Tá safo! no Agilidade@Recife 2014

AR2014-ChamadaMail

Tenho a satisfação de participar da organização, e levar junto a bandeira do Tá safo!, do evento que a cada ano leva para Recife palestras e workshops de qualidade sobre a temática da gestão e desenvolvimento ágil de software. Também terei a oportunidade de palestrar mais uma vez, agora para falar um pouco sobre Técnicas e ferramentas para manter a sanidade em uma startup. Que venha mais um Agilidade@Recife! Segue o anúncio do evento:

No próximo dia 02 de outubro, das 8h às 18h, no Auditório do Banco do Brasil (Av. Rio Branco, s/n), vai acontecer o Agilidade@Recife. O evento, que conta com o apoio do Softex Recife e do Porto Digital, é um conjunto de palestras e workshops com o objetivo de criar um ambiente colaborativo para que a comunidade de software da região compartilhe e agregue conhecimento de valor durante todo o dia de encontro, sobre temas relacionados aos métodos ágeis de desenvolvimento de software.

Nesta sétima edição do evento, o Agilidade@Recife pretende reunir novamente desenvolvedores, líderes, gerentes, executivos, pesquisadores, estudantes e outros interessados na adoção de métodos ágeis no desenvolvimento e gestão de produtos de software. Serão 6 palestras, 2 sessões práticas e um momento para open spaces (dinâmica onde os próprios participantes discutem temas de interesse comum).

A programação do evento conta com palestrantes conhecidos nacionalmente quando o assunto é agilidade, como Alisson Vale, Alexandre Magno, Marcos Garrido, Juliano Ribeiro e Dairton Bassi, entre outros. Empresas como Globo.com, Instituto Nokia de Tecnologia, Liferay do Brasil e TV Globo também estarão marcando presença no evento, narrando suas experiências na área.

As inscrições estão abertas e devem ser realizadas através do acesso ao link: http://www.eventick.com.br/agilidaderecife2014. Para mais informações acesse o site do evento: http://agilidaderecife.com.br/ ou envie um e-mail para agilidaderecife@gmail.com.

Mocks e Stubs com Rspec

mock-vs-stubs-clerb-presentation-1-728

Mocks e stubs são conceitos, muitas vezes de difícil compreensão, principalmente para desenvolvedores iniciantes em testes automatizados. Eu mesmo levei um tempinho para compreendê-los e nem sei se entendi muito bem. Por trás disso existe uma nomenclatura um tanto confusa e que não ajuda muito na compreensão dos conceitos. Vamos analisar como o Rspec trabalha com eles utilizando a biblioteca rspec-mocks.

Muitas vezes quando estamos escrevendo nossos testes, precisamos utilizar de objetos falsos. Em determinados cenários, o objeto real pode não estar disponível ou é necessário utilizar algum recurso externo que pode deixar o teste lento. Algumas vezes não precisamos testar o estado do objeto mas sim seu comportamento. Chamamos esses objetos falsos de Test Doubles ou Dublês de teste. Mocks e stubs são dois dos tipos especializados de doubles e são os mais utilizados.

Stubs

Simulam implementações dos objetos reais através de métodos que retornam valores pré-determinados. São métodos pré-configurados com as informações necessárias para a execução dos testes. Abaixo temos um exemplo de declaração de um test double.

  double = double('user', name: 'Tyrion Lanister')

O primeiro parâmetro é uma descrição do dublê que é usada na documentação e nas mensagens de falha. O segundo é o método stub setado com um valor qualquer. Vamos a um exemplo melhor. Queremos testar o método calculate_total_price da classe Order.


class Order
  attr_reader :total

  def calculate_total_price itens
    @total = 0
    itens.each { |item| @total += item.price }
  end

end

Podemos testar esse método sem instanciar o objeto real Item, através de stubs.


describe Order, "#calculate_total_price" do

  let(:itens) { [double(price: 10.0), double(price: 45.5)] }

  it "calculates the total price" do
    order = Order.new
    order.calculate_total_price(itens)

    expect(order.total).to eq(55.5)
  end

end

Na linha 3 setamos um array de doubles ao invés de uma array de objetos da classe Item. O teste irá passar. Isso é muito útil em testes  de unidade,, pois não precisamos acessar o banco de dados para pegar os dados do objeto Item que poderia ser um modelo do Active Record.

Mocks

São doubles pré-programados que irão criar expectativas que deverão ser satisfeitas pelos testes. Podemos usá-los quando queremos testar a chamada de uma api externa, por exemplo. Vamos dar uma olhada no exemplo abaixo.


class Westeros

  def geolocate(place)
    Geocoder.coordinates(place)
  end

end

O método geolocate da classe Westeros tem uma chamada da bilblioteca geocoder que retorna as coordenadas geográficas de um dado endereço. Precisamos testar se o método coordinates de Geocoder irá mesmo retornar as coordenadas? Acho que não. Os desenvolvedores da gem já fizeram isso. Precisamos mesmo é garantir que o método geolocate de Westeros irá chamar coordinates de Geocoder com o parâmetro correto. Para isso vamos usar um mock.


describe Westeros, "#geolocate" do

  it "retuns coordinates" do
    place = 'Ponta Tempestade, Westeros'
    westeros = Westeros.new

    expect(Geocoder).to receive(:coordinates).with(place)
    westeros.geolocate(place)
  end

end

Na linha 7 definimos as expectativas. Geocoder deve executar o método coordinates com place como argumento. O teste passa. Dessa forma testamos a interface de geocoder e não seu funcionamento interno. Um detalhe a parte é a dsl do rspec que deixa a leitura muito simples e agradável proporcionando um modo bastante elegante de se escrever testes.

conclusão

O rspec possui muitas outras inúmeras funcionalidades no que diz respeito a test doubles e testes regulares. A prática e a experiência irão melhorar ainda mais o entendimento dos conceitos de mocks e stubs, assim como os conceitos de testes automatizados. Existem uma infinidade de artigos sobre o assunto na internet. Vale a pena dar uma pesquisada no assunto.

Referências

https://github.com/rspec/rspec-mocks

http://www.infoq.com/br/articles/mocks-Arent-Stubs

Iniciando com Elasticsearch

elasticsearch

Elasticsearch é um mecanismo de busca open source, desenvolvido ‘em cima’ do Apache Lucene, uma engine de pesquisa full-text. Podemos dizer que o Elasticsearch abstrai a api do Lucene, que apresenta uma certa complexidade e curva de aprendizado alta. Mas o Elasticsearch não é somente uma engine de pesquisa full-text:

  • disponibiliza dados em tempo real
  • pode ser distribuído e configurado para apresentar alta disponibilidade
  • é orientado a documentos
  • disponibiliza uma api restFul

O Elasticsearch armazena dados em forma de documentos. Ele disponibiliza os documentos no formato JSON, que é suportado pela maioria das linguagens de programação modernas e também é o formato usado pelo movimento NoSQL.

Em Elasticsearch, um documento pertence a um Tipo e esses tipos estão localizados dentro de um Index. Podemos dizer, fazendo uma analogia com banco de dados relacionais, que os Indices são os banco de dados, os Tipos são as Tabelas, documentos são os registros das tabelas e os campos são as colunas das tabelas.


{

  "email": "john@smith.com",

  "first_name": "John",

  "last_name":  "Smith",

  "info": {

    "bio": "Eco-warrior and defender of the weak",

    "age": 25,

    "interests": [ "dolphins", "whales" ]

  },

  "join_date": "2014/05/01"

}

A palavra index pode ter diferentes significados dependendo do contexto. Indexes, ou Indíces são como banco de dados, como explicado anteriormente. Indexar um documento é armazená-lo em um Index, para que ele possa ser consultado posteriormente. O Elasticsearch utiliza uma técnica chamada índice invertido que permite com que os usuários executem procuras rápidas por palavras-chave e localizem os documentos que correspondem a uma determinada consulta.

Existe também o conceito de node (nó) que é uma instância do Elasticsearch em execução. Um cluster é um grupo de nós com o mesmo cluster.name que trabalham juntos e compartilham dados para prover escalabilidade e alta disponibilidade.

Instalação

Para instalar o Elasticsearch é necessário a última versão do java estar instalada na máquina. Você pode instalar através do site www.java.com. E fazer download do Elasticserch em elasticsearch.org/download. Em produção você pode instalar usando os pacotes Debian ou RPM na página de download ou usar Puppet ou Chef.

Após baixar o pacote zipado e desempacotá-lo, você poderá executá-lo em um terminal:


./bin/elasticsearch

Adicionando o parametro -d você poderá executálo em background.

Já sabemos que o Elasticsearch disponibiliza uma api restFul. Logo podemos fazer um teste executado o seguinte comando:


curl 'http://localhost:9200/?pretty'

Que deverá retornar:


{

  "status": 200,

  "name": "Shrunken Bones",

  "version": {

    "number": "1.4.0",

    "lucene_version": "4.10"

  },

  "tagline": "You Know, for Search"

}

Significa que seu cluster está em execução.

Tentando entender a bagaça

Vamos analisar um exemplo simples utilizando a modelagem do twitter:

  • Indexar um documento por usuário que contem informações de um único usuário do twitter
  • cada documento será do Tipo user
  • esse tipo estará dentro de um Index twitter
  • esse Index estará dentro de um cluster Elasticsearch


Primeiramente, iremos criar um usuário do twitter:


curl -XPUT 'http://localhost:9200/twitter/user/tasafo' -d '{ "name" : "TáSafo" }'

O comando acima deverá retornar:


{"_index":"twitter","_type":"user","_id":"tasafo","_version":1,"created":true}

Para recuperar os dados salvos anteriormente, poderemos executar o seguinte comando:


curl 'http://localhost:9200/twitter/user/tasafo'

Lembrando:

  • twitter é o index
  • user é o tipo
  • tasafo é o id que identifica o documento

Agora iremos criar um tipo tweet que faz referência a uma mensagem que o usuário twitou:


curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '
{
  "user": "tasafo",
  "postDate": "Sat, 09 Aug 2014 19:50:57 -0300",
  "message": "Testando Elasticsearch. Safo até agora!"
}'

Vamos verificar os dados que foram adicionados:


curl -XGET 'http://localhost:9200/twitter/tweet/1?pretty=true">http://localhost:9200/twitter/tweet/1?pretty=true'

Mais uma twitada:


curl -XPUT 'http://localhost:9200/twitter/tweet/2' -d '
{
  "user": "tasafo",
  "postDate": "Sat, 09 Aug 2014 19:52:57 -0300",
  "message": "Testando Elasticsearch. Essa parada é muito fácil!"
}'

Agora vamos encontrar todos os twitts de tasafo:


curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:tasafo&pretty=true">http://localhost:9200/twitter/tweet/_search?q=user:tasafo&pretty=true'

O comando irá retornar o seguinte documento:


{

  "took" : 3,

  "timed_out" : false,

  "_shards" : {

    "total" : 5,

    "successful" : 5,

    "failed" : 0

  },

  "hits" : {

    "total" : 2,

    "max_score" : 0.30685282,

    "hits" : [ {

      "_index" : "twitter",

      "_type" : "tweet",

      "_id" : "2",

      "_score" : 0.30685282,

      "_source":{"user":"tasafo", "postDate":"Sat, 09 Aug 2014 19:51:57 -0300 ",      "message":"Testando Elasticsearch. Essa parada é muito fácil!"}

    }, {

      "_index" : "twitter",

      "_type" : "tweet",

      "_id" : "1",

      "_score" : 0.30685282,

      "_source":{"user":"tasafo", "postDate":"Sat, 09 Aug 2014 19:51:57 -0300 ", "message":"Testando Elasticsearch. Safo até agora!"}

    } ]

  }

}

Para queries mais complexas, podemos usar JSON ao invés de query string, utilizando a Query DSL:


curl -XGET 'http://localhost:9200/twitter/tweet/_search?pretty=true' -d '
{
  "query" : {
    "match" : { "user": "tasafo" }
  }
}'

Agora vamos testar a pesquisa full-text. Para isso usaremos a query dsl com o campo message:


curl -XGET 'http://localhost:9200/twitter/tweet/_search?pretty=true' -d '
{
  "query" : {
    "match" : {
      "message": "testando safo"
    }
  }
}'

Por padrão, o Elasticsearch ordena o resultado por sua relevância. O comando irá retornar todos os resultados que contenham a palavra testando e ou safo no campo message.

Conclusão

Esse foi um tutorial simples para se iniciar os estudos de Elasticsearch. É claro que ele possui inúmeras outras features, como sugestão, geolocalização, analytics e muitas outras. Nenhuma configuração hard é necessária para começar e já existem apis em várias linguagens. Em outros artigos podemos verificar o funcionamento dessas apis.