OKRs – Objectives and Key Results

Tive meu primeiro contato com OKRs no ultimo trimestre do ano passado e a experiência foi muito valiosa apesar de não ter conseguido atingir nenhum dos objetivos definidos rsrsrs… (vou escrever depois detalhes da primeira rodada de OKRs e lições aprendidas) mas por enquanto vamos entender o que são estes tais de OKRs.

OKRs é uma metodologia para se estabelecer metas e que tem se espalhado entre diversas empresas do vale do silício como Google, Zynga, Skype, Facebook e algumas outras do top 10 de inovação, a metodologia vem se espalhando justamente por ter ajudado a estas empresas crescerem como capim.

OKR significa Objectives and Key Results e são estruturados da seguinte maneira.
Os Objectives (O) são qualitativos e inspiracionais na maioria das vezes não são mais de três objetivos, já os Key Results (KR) devem ser quantitativos. Os OKRs são usados ​​para focar um grupo ou indivíduo em torno de um objetivo ousado. O objetivo estabelece uma meta para um determinado período de tempo, normalmente um trimestre. Os Key Results devem ajudar a dizer se os objetivos serão realmente alcançados.

Vale ressaltar que os objetivos só podem ser alcançados se a empresa tenha uma missão e visão bem definida e difundida entre todos os colaboradores.

bruno_gambier_okrs

Objectives:

Qualitativos e Inspiracionais:

Os objetivos devem desafiar a pessoa e fazer com que ela levante da cama motivada e com emoção para superar este desafio, um bom indicador se o objetivo está bem definido seria: Você teria orgulho de falar para o CEO ou para toda a empresa que seu objetivo é este? Ele te deixa motivado para sair da sua casa e vir trabalhar?

Esta ligado ao tempo:

Um objetivo deve ser alcançado em até 3 meses, caso o contrário ele é a sua estratégia ou uma parte da sua missão e não um objetivo.

Independência e autonomia:

O objetivo deve ser possível de ser atingido sem depender de outros times, não podemos chegar no final do trimestre e dizer que não foi possível atingi-lo por causa do comercial, marketing ou produto.

Exemplos Objetivos bons:

  • Alcançar o mercado de varejo.
  • Re-tomar a posição de produto mais inovador
  • Lançar o MVP do produto X

Exemplos de Objetivos ruins:

  • Aumentar em 30% a receita
    Diminuir os chamados de suporte em 10%
  • Key Results

Os Key Results deve ajudá-lo a atingir o objetivo, não deve ser nada inspiracional e sim totalmente quantitativo quase que uma métrica. Uma boa dica de criar bons key results é se perguntar: Como podemos saber que este objetivo será alcançado? Normalmente não criamos mais de 3 key results mas isso pode variar de acordo com o objetivo traçado.

KRs devem ser difíceis mas não impossíveis:
Em uma reunião discutindo se conseguiríamos ou não atingir os nossos KRs depois de uma calorosa discussão a pergunta que nos ajudou a nos sentirmos desafiados e “comprar a briga” foi:

Estes KRs são impossíveis? Se não são impossíveis então são viáveis, então esta bem ousado e desafiador do jeito que deve ser um KR.

Lembre-se: Se você atingir 70% de um KR isso é um sucesso!!!

Exemplo:

Objetivo: Colocar o cliente no core do nosso negócio

  • KR1 :Aumentar o NPS em 30%
  • KR2 :Diminuir o número de contatos de suporte em 50%
  • KR3 :Entregar 50% das features com maior votação que estão em nosso backlog

Running os OKRs e prepare-se para:

Ter disciplina:
Para que a adoção dos OKR tenha sucesso é preciso muita disciplina, primeiramente para entender o conceito e não distorce-lo durante o caminho e mais ainda para mantermos os compromissos de followup em dia e não nos deixar nos desviar do caminho, como rotina de acompanhamento e alinhamento dos OKRs eu segui um exemplo de Monday commitments e Friday wins difundido pela Cristina Wodtek que vou detalhar em outro post.

Falhar e falhar grande:

Como os OKRs é uma ferramenta para ajudar no crescimento de uma empresa, os KRs serão mesmo difíceis e sempre vamos falhar, mas principalmente no início até pegar o ritmo e traquejo, você vai falhar e falhar graaande (Feedback da minha primeira rodada de OKRs).

Maturidade de objetividade:
Muitos times não estão acostumados a caminhar sob um backgroud de objetivos bem definidos, muitas vezes atacam o que aparece na frente, alguns objetivos são iniciados e depois abandonados até mesmo por mudanças de prioridades que ocorrem durante o caminho entre outros fatores.
Uma das necessidades da disciplina é a necessidade de também termos um alinhamento muito bem claro entre as metas estratégicas da empresa com a meta que o time tem para este trimeste, isso exige no inicio da adoção dos OKRs muita comunicação entre a liderança e o time e também dentro do próprio time, eles não estão acostumados a se perguntar se os próprios objetivos estão mesmo sendo alcançados e o que fazer quando as coisas não estão indo como deveria.

Por isso é preciso:

Um investimento maior de comunicação e discussão sobre o OKRs no inicio da adoção
Maturidade do time para conseguir participar do processo de definição dos OKRs e também em como lidar com os problemas que estão nos dificultando de seguir o caminho.
Por isso uma comunicação objetiva puxando sempre o time para o propósito final e saber quando parar e aprofundar os detalhes e motivações nos momentos certos é uma chave fundamental para o sucesso dos OKRs.

Os OKRs é uma ferramenta já testada de sucesso de empresas do vale do silício, sendo assim não desanime com as dificuldades iniciais que você irá encontrar.

Vejam aqui 2 vídeos fantásticos sobre OKRs:  How Google sets goals: OKRs e OKRs in action

How Google sets goals: OKRs

OKRs in action

Referências:
http://www.eleganthack.com/

https://blog.weekdone.com/introducing-okr-weekdone-objectives-key-results/

Payments Engineering Meetup

Em junho deste ano ocorreu o primeiro meetup sobre billing & payments onde participaram várias pessoas interessadas nos novos desafios de engenharia de sistemas que são trazidos pelas mudanças que estão ocorrendo no mercado de pagamentos.

Payments Engineering Meetup

Captura de Tela 2014-10-17 às 00.05.08

Payments Engineering Meetup

Payments Engineering Meetup

Várias empresas do vale do silício apresentaram seus cases com produtos bem diferentes um do outro.

Achei o conteúdo muito bom e queria compartilha aqui no blog  com vocês.

O conteúdo foi criado pelo time abaixo:

  • Mathieu Chauvin – Engineering Manager for Payments @ Netflix
  • Taylor Wicksell – Sr. Software Engineer for Billing @ Netflix
  • Jean-Denis Greze – Engineer @ Dropbox
  • Alec Holmes – Software Engineer @ Square
  • Emmanuel Cron – Software Engineer III, Google Wallet @ Google
  • Paul Huang – Engineering Manager @ Survey Monkey
  • Anthony Zacharakis – Lead Engineer @ Lumos Labs
  • Shengyong Li / Feifeng Yang – Dir. Engineering Commerce / Tech Lead Payment @ Electronic Arts

The total number of locks exceeds the lock table size

Pessoal,  eu estava aqui hoje efetuando uma query bem nervosa no meu banco de dados e tive com retorno o erro: The total number of locks exceeds the lock table size

Então segue abaixo a solução:

Erro: The total number of locks exceeds the lock table size

Motivo: Este erro ocorre porque quando o mysql percebe que o resultado de uma consulta é muito grande ele efetua uma cópia destes dados para uma tabela temporária (tmp table) que fica armazenada em um buffer mas este buffer tem um tamanho limitado (padrão de instalação do mysql é 80MB) e se o resultado for maior que o buffer o corre o erro.

Solução: Alterar a variável do mysql innodb_buffer_pool_size para um espaço maior, no meu caso coloquei 500MB

innodb buffer bruno gambier

Como: 1) Antes de tudo acesse o console do mysql e execute o comando: show variables; e veja que o valor da variável innodb_buffer_pool_size ele deverá estar com 50MB.

2) Vamos alterar a variável innodb_buffer_pool_size para 500MB, acesso o arquivo /etc/mysql/my.cnf que deveria estar em acrescente a linha innodb_buffer_pool_size=500MB depois disso re-inicie o mysql

3) Depois de re-iniciar o mysql execute novamente o show variables; no console so mysql e confirme a alteração da variável.

Pronto, agora execute sua query novamente.

Abs[],

Bruno Gambier

The Economist – Brazil Takes Off

O Brasil é capa da revista de economia “The Economist” e o título é Brasil Takes Off.
O artigo fala muito superficialmente sobre o olé que o Brasil deu na crise internacional.

Leia aqui o artigo completo.

Nunca tinha visto um artigo que faz tantas referências a nossa história econômica e exibindo tantos gráficos do nosso desempenho.

Fica aqui minha pergunta: “O que foi que o Lula falou na ultima reunião com empresário na Europa?”.

Esta história esta parecendo com caviar “Nunca vi nem comi, eu só ouço falar”.
brazil_takes_of

Integração Apache com Tomcat e balanceamento de carga com JkMount

A integração do Apache com o TOMCAT é feita para que as páginas estáticas sejam executadas pelo Apache e as em JSP pelo contêiner TOMCAT, além do direcionamento das aplicações via APACHE, sendo o WebServer de acesso para as aplicações que estão no TOMCAT. As páginas ESTÁTICAS serão executadas pelo APACHE (ganho de performance) e as páginas dinâmicas (JSP) executadas pelo contêiner TOMCAT. A integração permite “esconder” as portas do TOMCAT, já que sua aplicação será chamada por uma URL na porta 80 e o APACHE sim, irá pegar sua aplicação no TOMCAT e mostrar. Possibilidade de se realizar LOADBALANCER entre dois ou mais TOMCATs usando o APACHE como o WebServer que irá gerenciar essa carga e dividirá ela. Quando o servidor é instalado, a configuração inicial do Tomcat contém um conector que recebe pedidos de HTTP utilizando AJP (Apache Jserv Protocol). Embora o Tomcat seja capaz de recebe pedidos de HTTP diretamente da rede, esse conector permite que o Tomcat receba pedidos de software em uma camada inferior. Por exemplo, o Tomcat pode receber pedidos de servidores da Web (como o Apache HTTP Server), servidores proxy e sistemas de balanceamento de carga que suportem os protocolos AJP.

Exemplo:
Integração Apache Tomcat com JkMount

Instalação

Para que o Apache consiga efetuar o balanceamento de carga entre ele e camada inferior de servidores (Tomcat) ele precisa ter o módulo JkMount (mod_jk) instalado pois ele é o responsável pela comunicação entre o Apache e o Tomcat. Este módulo pode ser obtido aquie os seus arquivos devem ser descompactados na pasta de módulos do
Apache:

/etc/httpd/modules

JkMount

Configuração

Para que o Apache utilize o módulo JkMout isso deve-se:

Localização do módulo

Localização do módulo: Criar o arquivo /etc/httpd/conf/jk.conf indicando onde está instalado o módulo JkMount, veja abaixo o conteúdo do arquivo:

 LoadModule jk_module /usr/lib64/httpd/modules/mod_jk.so

Definição dos Workers

Definição dos Workers: Criar o arquivo /etc/httpd/conf/jkworkers.properties

O arquivo abaixo cria 7 workers que são os servidores que o Apache irá balancear.

  • 4 servidores Tomcats, descrevendo a porta padrão, nome do localhost e qual o tipo de conexão (no nosso caso utilizamos o conector AJP para criar um proxy do Tomcat)
  • 2 balanceadores: loadbalancer efetua o balanceamento entre os servidores Tomcat 1 e 2 e loadbalancer2 efetua o balanceamento entre os servidores Tomcat 3 e 4.
  • 1 worker.status que é responsável de retornar o status de cada worker.
 #
 # workers.properties
 #
 #
 # In Unix, we use forward slashes:
 ps=/
 #
 # list the workers by name
 #
 worker.list=tomcat1, tomcat2, tomcat3, tomcat4, loadbalancer, loadbalancer2, status
 #
 # ------------------------
 # First tomcat server
 # ------------------------
 worker.tomcat1.port=8009
 worker.tomcat1.host=localhost
 worker.tomcat1.type=ajp13
 #
 # Specify the size of the open connection cache.
 #worker.tomcat1.cachesize
 #
 #
 # Specifies the load balance factor when used with
 # a load balancing worker.
 # Note:
 #  ----> lbfactor must be > 0
 #  ----> Low lbfactor means less work done by the worker.
 worker.tomcat1.lbfactor=100
 #
 # ------------------------
 # Second tomcat server
 # ------------------------
 worker.tomcat2.port=9009
 worker.tomcat2.host=localhost
 worker.tomcat2.type=ajp13
 #
 # Specify the size of the open connection cache.
 #worker.tomcat2.cachesize
 #
 #
 # Specifies the load balance factor when used with
 # a load balancing worker.
 # Note:
 #  ----> lbfactor must be > 0
 #  ----> Low lbfactor means less work done by the worker.
 worker.tomcat2.lbfactor=100
 #
 # ------------------------
 # Third tomcat server
 # ------------------------
 worker.tomcat3.port=10009
 worker.tomcat3.host=localhost
 worker.tomcat3.type=ajp13
 #
 # Specify the size of the open connection cache.
 #worker.tomcat3.cachesize
 #
 #
 # Specifies the load balance factor when used with
 # a load balancing worker.
 # Note:
 #  ----> lbfactor must be > 0
 #  ----> Low lbfactor means less work done by the worker.
 worker.tomcat3.lbfactor=100
 #
 worker.tomcat4.port=11009
 worker.tomcat4.host=localhost
 worker.tomcat4.type=ajp13
 worker.tomcat4.lbfactor=100
 #
 #
 # ------------------------
 # Load Balancer worker
 # ------------------------
 #
 #
 # The loadbalancer (type lb) worker performs weighted round-robin
 # load balancing with sticky sessions.
 # Note:
 #  ----> If a worker dies, the load balancer will check its state
 #        once in a while. Until then all work is redirected to peer
 #        worker.
 worker.loadbalancer.type=lb
 worker.loadbalancer.balanced_workers=tomcat1, tomcat2
 #
 worker.loadbalancer2.type=lb
 worker.loadbalancer2.balanced_workers=tomcat3 ,tomcat4
 #
 #
 # ------------------------
 # Status worker
 # ------------------------
 worker.status.type=status
 #
 #
 # END workers.properties
 #

Regras de Balanceamento

Regras de Balanceamento: No arquivo /etc/httpd/conf/httpd.conf devem ser inseridas as regras de balanceamento que deverão ser aplicadas pelo Apache, segue as regras criadas para o MoIP:

NameVirtualHost [ip localhost]
<VirtualHost ip localhost:80>
#
#JkMount /ig/* loadbalancer2
#
JkMount /*.jsp loadbalancer
#JkMount /*.do loadbalancer
JkMount /admin* loadbalancer
JkMount /manager* loadbalancer
JkMount /web-console* loadbalancer
JkMount /* loadbalancer
#
JkMount /jkstatus status
#
JkUnMount  /mail* loadbalancer
JkUnMount  /cgi-bin/* loadbalancer
JkUnMount  /openwebmail/* loadbalancer

ScriptAlias /cgi-bin/awstats /var/www/cgi-bin/awstats
Alias /awstats /var/www/html/awstats
ServerName   exemplo.com.br
DocumentRoot /var/www/vhosts/
SuexecUserGroup apache apache
ServerAlias "www.exemplo.com.br"
ServerAlias "www.exemplo_url2.com.br"
ServerAdmin "webmaster@exemplo.com.br"
ErrorDocument "503" "Por favor, tente mais tarde. O sistema esta temporariamente fora do ar.
CustomLog "/etc/httpd/logs/exemplo-access_log" "combined"
ErrorLog "/etc/httpd/logs/exemplo-error_log"
SSLCertificateChainFile  /etc/httpd/conf/ssl.crt/verisign.site.pro.intermediate.crt
Redirect /exemplo http://blog.exemplo.com.br
Redirect /forum http://forum.exemplo.com.br
<Directory /var/www/vhosts/exemplo.com.br>
Options Includes FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost ip localhost:443>
#
JkMount /*.jsp loadbalancer
#JkMount /*.do loadbalancer
JkMount /admin* loadbalancer
JkMount /manager* loadbalancer
JkMount /web-console* loadlancer
JkMount /* loadbalancer
#
JkMount /jkstatus status
#
JkUnMount  /mail* loadbalancer
JkUnMount  /cgi-bin/* loadbalancer
JkUnMount  /openwebmail/* loadbalancer
#
#
ScriptAlias /cgi-bin/awstats /var/www/cgi-bin/awstats
Alias /awstats /var/www/html/awstats
ServerName exemplo.com.br
DocumentRoot /var/www/vhosts/exemplo.com.br
SuexecUserGroup apache apache
ServerAlias "www.exemplo.com.br"
ServerAlias "www.exemplo_url2.com.br"
ServerAdmin "webmaster@exemplo.com.br"
ErrorDocument "503" "Por favor, tente mais tarde. O sistema esta temporariamente fora do ar.
CustomLog "/etc/httpd/logs/exemplo-access_log" "combined"
ErrorLog "/etc/httpd/logs/exemplo-error_log"
SSLCertificateFile /etc/httpd/conf/ssl.crt/exemplo.com.br.hspc.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/exemplo.com.br.hspc.key
SSLEngine on
SSLCertificateChainFile  /etc/httpd/conf/ssl.crt/verisign.site.pro.intermediate.crt
Redirect /moipideias http://blog.exemplo.com.br
Redirect /forum http://forum.exemplo.com.br
< Directory /var/www/vhosts/exemplo.com.br>
Options Includes FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>

Carregar o Módulo

Carregar o Módulo: Criar o arquivo /etc/httpd/conf.d/tomcat.conf que o Apache irá utilizar para carregar o módulo JkMount, workers e regras.

<IfModule mod_jk.c>
    JkWorkersFile /etc/httpd/conf/jkworkers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel error
    #
    JkMount /*.jsp loadbalancer
    #
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    JkRequestLogFormat "%w %V %T"
</IfModule>

JasperException: Attribute value is quoted with which must be escaped when used within the value

Muitos desenvolvedores ao tentar efetuar o deploy de aplicações web em tomcat’s a partir da versão 5.5.27 estão tendo uma dor de cabeça terrível com um erro que não ocorria nas versões anteriores,  erro é:

JasperException: Attribute value is quoted with which must be escaped when used within the value “o atributo da página onde está dando o erro ”  is quoted with ” which must be escaped when used within the value>org.apache.jasper.JasperException:  “endereço da página com a linha onde está ocorrendo o erro”

Este erro ocorre com estas versões do apache com páginas onde o JSP não segue a nova especificação do JSP 2.0

“According to JSP 2.0 specification (chapter 1.7 page 72,73)”

A especificação diz que o atributo value das tags não podem mais ser definidas com “(aspas) dentro de ” (aspas) e por isso o erro JasperException ocorre.

Em resumo a nova especificação diz que esta declaração deve ser feita de outra maneira conforme o exemplo abaixo:

This code is illegal:
<mytags:tag value="<%= "hi!" %>" />

Instead the correct sentence would be:
<mytags:tag value='<%= "hi!" %>' />
<mytags:tag value="<%= \"hi!\" %>" />
<mytags:tag value='<%= \"name\" %>' />

Questão: Mas e agora? Terei que mudar todas as minhas tags que estão utilizando esta sintaxe?

Resposta: Não.

Como: Desativar nas configurações do tomcat a validação desta sintaxe, conforme o exemplo abaixo.

Para contornar o erro JasperException discutido nesta sessão basta acrescentar a linha abaixo no arquivo catalina.properties.

org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false

Referência: http://tomcat.apache.org/tomcat-5.5-doc/config/systemprops.html



13 Minutos De Um DBA

Você é o dono de todas as informações

ANTES QUE ELES CRESÇAM

Logo seu anjinho vira um moção. Leia agora.

Think Different

Making Lives More Wonderful

Matthew Skelton

Founder at Conflux - navigate fast flow