24 dezembro 2009

Os Sociopatas, os Sem-Noção e os Perdedores

Um artigo publicado a alguns meses atrás chamado The Gervais Principle provocou uma ampla discussão sobre como realmente funciona a estrutura e a saúde de qualquer organização humana.

O artigo, escrito por Venkatesh Rao, usa como ponto de partida os dilemas passados pelos personagens do The Office, e usa diversas situações retratados nos episódios para explicar os conceitos sob a ótica interpretada por Venkatesh.

Gervais é um dos criadores da série The Office, e o princípio criado por Venkatesh e nomeado como Princípio de Gervais diz basicamente que:
Sociopatas, por seus próprios interesses, deliberadamente promove Perdedores de desempenho superior para gerência média, conduz Perdedores de desenpenho inferior para papéis de Sociopatas, e deixa os Perdedores de desempenho mediano se virarem sozinhos.
A terminologia Sociopatas, Perdedores e Sem-Noção é uma semântica nova e controversa de Venkatesh, mas não foi criação dele. Ele usou uma classificação criada no Gaping Void que ele acredita refletir os conceitos apresentados:



Agora, com a definição dos termos apresentados, releia o Princípio Gervais acima e veja se isso se aplica com a sua experiência na sua empresa. :-)

O texto é um pouco prolixo e muito cínico e franco, o que fabricou críticas acaloradas por causa da classificação pejorativa e pelo rotulamento das pessoas, e também pela forma franca que expõe o interesse explícito do interesse de manipulação humana dos Sociopatas independente do julgamento de valor da intenção desta manipulação.

A exposição dos Sociopatas não é diferente da forma que Nicolau Maquiavel apresentou O Príncipe, só que quem leu O Príncipe normalmente considera este comportamento distante e apenas aplicável a quem realmente fosse um rei ou um príncipe. A leitura inocente de Maquiavel é comportamento clássico de um Sem-Noção que acredita obter receitas de lidar com seus Sociopatas. Os Perdedores vão achar o livro apenas chato... :-)

Os Perdedores são aqueles na base da pirâmide, que tem noção clara que estão fazendo uma escolha perdedora, entregando grande parte do seu esforço para lucro direto dos Sociopatas. Só que todo mundo começa a vida por aí, e muitos terminam a vida nesta posição, o que não é nenhum demérito, esta é uma posição de bastante liberdade para aprendizado e de liberar tempo para desenvolver interesses paralelos ao longo da vida.

A camada do meio, chamada Sem-Noção, é a mais controversa por ter pessoas na sociedade que trabalham duro e que ganham merecidamente salários altos. São formados por profissionais que desempenham por muitos anos muito acima do que as empresas esperam e que mantém um certo ar de humanidade ao tentar traduzir os comportamentos francamente desumanos dos comportamentos dos sociopatas em interpretações mais humanas para seus Perdedores. Ou seja, o típico comportamento da gerência média.


O artigo segue discutindo o desenvolvimento das camadas ao longo do ciclo de vida da empresa, e desenvolve um insight muito interessante: quando os Sem-Noção tomam conta da empresa esvaziando o espaço dos Sociopatas através da burocracia, ou ainda reduzindo os Perdedores para inchar sua influência trazendo mais Sem-Noção para perto deles, isto são sinais claros que a empresa está caminhando para implosão.


Venkatesh escreveu em seguida um artigo explorando um pouco mais a forma que a comunicação ocorre entre estes atores organizacionais: Posturetalk, Powertalk, Babytalk e Gametalk (traduzido para algo como discurso postural, e discurso de poder, conversa infantil, e comunicação como um jogo).

É muito interessante verificar que, de acordo com o tipo de conversa que ocorre entre as pessoas, fica trivial verificar qual posição cada pessoa trabalha na organização. Não vou entrar em mais detalhes aqui para não fazer este meu artigo ficar muito grande, então leiam os artigos originais descobrir mais sobre estas linguagens.

Se você achar interessante este assunto, não esqueça de contribuir pagando um café para o Venkatesh através de um link em seu blog. Ele merece nosso suporte por ter trazido este assunto a luz e conseguir através da controvérsia fazer todos nós pensarmos sobre o nosso papel em nossas vidas.

18 dezembro 2009

Os WorkShops sobre a portaria 1510


Os WorkShops foram um sucesso. Conseguimos reunir um grupo muito bom de pessoas e as discussões foram sempre de muito alto nível.

Várias preocupações muito relevantes foram discutidas. O impacto da separação do controle de acesso do controle de ponto, a necessidade de troca dos equipamentos, o funcionário que executa trabalho externo e a grande questão de gerar os comprovantes em papel para os funcionários foram os itens que provocaram maior repercussão e incertezas.

De nosso lado, tivemos a preocupação de passar a nossa noção de como esta mudança impactará na gestão de RH das empresas, em especial a gestão dos documentos eletrônicos, e também como o mercado de soluções deve estar se organizando durante este processo de transição.


O resultado foi muito positivo e só temos a agradecer às pessoas que compareceram e aos nossos parceiros que viabilizaram que este evento acontecesse.

O ano que vem o assunto deve ficar ainda mais quente, já que a partir de agosto a portaria entra em vigor por completo. Devido a isso, já até tivemos alguns convites para voltarmos a discutir o assunto nos próximos meses.

Estaremos atentos e a disposição para ajudar e participar neste processo de mudança. A gente entende que a nossa grande missão é poder fazer a diferença para nossos clientes e para a sociedade.

12 dezembro 2009

Resolvendo Sudoku em Python

Este post do Peter Norvig me deixou agoniado para estudar as técnicas de solução do Sudoku. Achei a solução dele bem bacana, quase programando Lisp em Python usando os mecanismos de List Comprehension e recursividade.

Tentei gerar uma versão um pouco mais simples removendo a recursividade e usando técnica de passagem múltiplas.

Primeiro uma inicialização de estrutura de dados auxiliares:
rows = 'ABCDEFGHI'
cols = '123456789'
squares = [r+c for r in rows for c in cols]
vectors = ([[r+c for c in cols] for r in rows] +
           [[r+c for r in rows] for c in cols] +
           [[r+c for r in srows for c in scols]
               for srows in ('ABC','DEF','GHI')
               for scols in ('123','456','789')])
peers = dict((s, set(s2 for vector in vectors if s in vector for s2 in vector))
        for s in squares)
digits = list('123456789')

Squares contém um array com todos os nomes das caixinhas do tabuleiro do Sudoku (A1, A2, ...., A9, B1, B2, ...). Vectors contém os vetores dos nomes das caixinhas das linhas, colunas e dos quadrados menores do tabuleiro, aonde cada vetor tem que conter os números de 1 a 9 conforme a regra do Sudoku.

O dicionário peers é a estrutura mais mágica, ela contém o conjunto dos nomes das caixinhas do tabuleiro que fazem parte da linha, coluna ou quadrado menor de cada caixinha. Com ela consigo rapidamente verificar quais números estão já sendo usados nos vetores.
def parse_grid(grid):
    "Given a string of 81 digits (or . or 0 or -), return a dict of {cell:values}"
    grid = [c for c in grid if c in '0,-123456789']
    return dict((squares[p], grid[p]) for p in range(len(squares)))

def printboard(values):
    width = max(len(values[s]) for s in squares)
    sep = '+'.join(['-'*(2+width)*3]*3)
    form = '|'.join([(' %%%ds ' % width*3)]*3)
    for r in rows:
        print form % tuple([values[r+c] for c in cols])
        if r in 'CF': print sep
    print

parsegrid e printboard são funções auxiliares: parsegrid recebe uma string com números de configuração inicial do tabuleiro aonde a sequência na string descreve a posição no tabuleiro, 0 indicando posição vazia e 1-9 indicando o valor inicial. printboard obviamente imprime o que está no tabuleiro passado como um dicionário de parâmetro.
def possibilities(values):
    values = values.copy()
    while True:
        changed = False
        for s in squares:
            if not values[s] in digits:
                values[s] = ''.join(set(digits).difference(set(values[s2] for s2 in peers[s])))
                if values[s] == '': return False
        for vector in vectors:
            for digit in digits:
                ocor = [s for s in vector if digit in list(values[s])]
                if len(ocor) == 0: return False
                if len(ocor) == 1 and len(values[ocor[0]]) > 1:
                    values[ocor[0]] = digit
                    changed = True
        if not changed: break
    return values

Esta função possibilities recebe um dicionário de parâmetro e retorna uma cópia com os espaços em aberto preenchidos com as possibilidades para cada posição no tabuleiro. É basicamente uma versão multi-passagem do algoritmo recursivo do Peter Norvig.

Primeiro a função varre o tabuleiro procurando as posições do tabuleiro em aberto e preenche com uma string das possibilidades de acordo com os vetores envolvidos na posição. Em vários casos apenas uma possibilidade é possível, o que já determina o valor da posição só nesta passada.

Em seguida todos os vetores são analisados para verificar possibilidades únicas para os números de 1 a 9. Funciona assim: digamos que na linha A (A1-A9) as posições A1 a A8 contenham os números de 1 a 8, e a posição A9 contenha as possibilidades 7, 8 e 9, é evidente que o valor de A9 é o valor 9.

Estes dois algoritmos são executados várias vezes até que nenhuma alteração não seja mais possível, o que em muitos casos já soluciona o Sudoku.

Os casos aonde o Sudoku não é solucionado apenas através das restrições impostas nos vetores são considerados Sudokus avançados, pois envolvem teste simultâneo de alternativas para sua solução.

Para isso, a força bruta parece ser a solução mais simples:
def solve(values):
    values = possibilities(values)
    if not values: return False
    for s in squares:
        if len(values[s]) > 1:
            for p in values[s]:
                values[s] = p
                res = solve(values)
                if res: return res
            return False
    return values

Esta função solve aplica o possibilities, procura o primeiro caso de uma caixa com múltiplas possibilidades e varre suas alternativas recursivamente tentando solucionar com o próprio solve.

Agora vamos tentar solucionar o Sudoku mais difícil que existe segundo o próprio post que usei como referência:
grid = """
100007090
030020008
009600500
005300900
010080002
600004000
300000010
040000007
007000300
"""
grid = parse_grid(grid)
printboard(grid)
printboard(possibilities(grid))
printboard(solve(grid))

O que dá como resposta:
 1  0  0 | 0  0  7 | 0  9  0
 0  3  0 | 0  2  0 | 0  0  8
 0  0  9 | 6  0  0 | 5  0  0
---------+---------+---------
 0  0  5 | 3  0  0 | 9  0  0
 0  1  0 | 0  8  0 | 0  0  2
 6  0  0 | 0  0  4 | 0  0  0
---------+---------+---------
 3  0  0 | 0  0  0 | 0  1  0
 0  4  0 | 0  0  0 | 0  0  7
 0  0  7 | 0  0  0 | 3  0  0

      1    8256    8246 |    854     354       7 |    246       9     346
    547       3      46 |   1954       2     195 |   1476     476       8
   8247     827       9 |      6     134     183 |      5    3247     134
------------------------+------------------------+------------------------
   8247     827       5 |      3     176     126 |      9    8476     146
    947       1      34 |    957       8     956 |    476   35476       2
      6    9827     832 |  19257    1957       4 |    187    8357     135
------------------------+------------------------+------------------------
      3   98256     826 | 254798   95476   98256 |   8246       1    9546
   9825       4       1 |   9825    9356  325698 |    826    8256       7
   9825   98256       7 | 125498   19546  125698 |      3   82546    9546

 1  6  2 | 8  5  7 | 4  9  3
 5  3  4 | 1  2  9 | 6  7  8
 7  8  9 | 6  4  3 | 5  2  1
---------+---------+---------
 4  7  5 | 3  1  2 | 9  8  6
 9  1  3 | 5  8  6 | 7  4  2
 6  2  8 | 7  9  4 | 1  3  5
---------+---------+---------
 3  5  6 | 4  7  8 | 2  1  9
 2  4  1 | 9  3  5 | 8  6  7
 8  9  7 | 2  6  1 | 3  5  4

07 dezembro 2009

Divisão do tempo numa empresa recém criada

Dividir o trabalho entre ser empreendedor e executar as atividades de desenvolvimento de uma empresa é bastante complicado.

Desenvolvimento é uma atividade de longo prazo, que envolve concentração e investimento expressivos de tempo. A criação de um produto não é uma atividade repetitiva, e sim imprevisível e com vários caminhos para um mesmo objetivo.

As atividades mais importantes de um empreendedor são envolver as pessoas e fabricar o ambiente para que a evolução da empresa aconteça, através de motivação e remoção de problemas que obstruem o progresso. Estas atividades são atividades de curto prazo, aonde o envolvimento acontece quase no mesmo momento em que se torna necessário.

Isto quer dizer que, no momento que uma empresa conta com algo como 2 a 3 pessoas adicionais aos empreendedores, os empreendedores precisam tomar o cuidado de dividir o seu tempo criteriosamente para que o resultado final somado seja o melhor possível.

Esta divisão do tempo é responsabilidade direta dos empreendedores, e os mesmos precisam descobrir estratégias para conseguir um bom resultado. Uma estratégia comum é dividir as responsabilidades entre os empreendedores, de forma que um se envolve mais no lado empreendedor, motivacional e desbloqueador de problemas enquanto outro envolve mais na atividade fim.

A alternativa é desenvolver estratégias de divisão de tempo, algo como o uso do turno da manhã para ser empreendedor e o turno da tarde para exercer a atividade fim. Até Paul Graham escreveu sobre a dificuldade desta divisão de tempo e sugeriu estratégias quando discutiu o impacto das reuniões em start-ups.

Independente da maneira que se lida com este dilema, fica claro que os empreendedores perdem parte do seu tempo para viabilizar o uso do tempo de outros, criando uma redução prática do resultado que seria esperado pela adição de mais um colaborador.


Tem algum web designer ou fuçador de php que gostaria de dar uma mão para a gente? Aqui na Ahgora cada vez tem mais coisas para aprender e fazer. Só tem uma coisa, tem que estar a fim de sair da casinha, abandonar bancos relacionais para aprender a usar SimpleDB e S3, e ajudar a descobrir maneiras de comunicação inovadoras pela Web, seja no HTML, design, Twitter, ou blogs. Garanto que vai ser uma escola e tanto trabalhar numa start-up como a nossa.