mais lidos
Life at Nu
Conheça a sede do Nubank em Pinheiros, São Paulo/Brasil jan 11
Design
A nova aparência do Nubank: conheça nossa nova logo maio 17
Culture & Values
Como os valores e a cultura da Nu moldam os produtos que criamos ago 7
Carreiras
Reunimos grandes mentes de diversas origens que permitem a discussão e o debate e melhoram a resolução de problemas.
Saiba mais sobre nossas carreiras



Contribuição: Arthur Kamienski, Caique Lima, Sarah Malaman, Vitor Pinheiro
Introdução
Os profissionais de Ciência de Dados (DS) e Aprendizado de Máquina (ML) usam muitas ferramentas, embora isso nem sempre seja imediatamente óbvio. Sempre que importamos uma biblioteca para um notebook do Python ou executamos comandos como grep, find e sed em sistemas UNIX e similares, estamos aproveitando uma ferramenta que outra pessoa programou.
Mas também podemos programar as nossas próprias ferramentas. As ferramentas geralmente surgem quando alguém detecta uma funcionalidade repetida em vários produtos e projetos. O instinto natural do programador é extrair o comportamento comum para um local separado, a fim de evitar a duplicação e facilitar futuras mudanças. E é assim que nasce uma biblioteca de software.
O uso de ferramentas como bibliotecas (mas também de aplicações baseadas em interface de usuário, plataformas e aplicações de linha de comando) em toda a organização é algo comum nas empresas de tecnologia modernas. Essa estratégia é geralmente chamada de inner-sourcing. Embora ela ofereça vantagens consideráveis, também traz desafios que devem ser cuidadosamente analisados.
Neste artigo, listaremos as lições que aprendemos ao longo dos anos, usando ferramentas internas no Nubank. Essas lições não são apenas sobre pontos técnicos, mas também questões subjetivas que devem ser consideradas para garantir o sucesso dessas ferramentas, tratando-as como produtos internos.
Esse artigo foi escrito para equipes que criam e mantêm as ferramentas internas usadas por outras equipes, especialmente aquelas feitas para os casos de uso de DS e ML.
Vamos começar resumindo os porquês do desenvolvimento de ferramentas internas, com uma breve explicação sobre os tipos principais, e então listaremos as lições que consideramos mais importantes, sem ordem específica.
Conheça nossas oportunidades
Por que criar ferramentas internas?
Nós criamos ferramentas porque elas nos tornam mais eficazes e eficientes. Isso é verdadeiro no nível individual e organizacional, pois há muitos fenômenos emergentes e não-lineares que só ocorrem quando alcançamos uma certa escala.
As ferramentas promovem a padronização
As ferramentas aumentam o impacto das soluções locais
As ferramentas codificam o conhecimento tácito
As ferramentas reduzem o risco e os erros
As ferramentas reduzem o TTM
Tipos de ferramentas internas
As ferramentas de software são só mais código. Mas se olharmos mais de perto, existem tipos diferentes de ferramentas em relação à interface que elas oferecem aos usuários e os recursos que elas fornecem. Cada um deles tem um papel separado na organização de tecnologia.
Uma distinção importante é entre as ferramentas táticas e estratégicas: aquelas que são usadas por no máximo uma ou duas equipes e aquelas que podem ser compartilhadas com toda a empresa, possivelmente se tornando um ativo importante para a companhia.
Temos os seguintes tipos principais: Aplicativos baseados em interface gráficae linha de comando, bibliotecas e plataformas.
É fácil ver a diferença entre aplicativos baseados em interface gráficae interface de linha de comando, mas isso não é verdade em relação a bibliotecas e plataformas: uma diferença importante é que as plataformas geralmente exigem que o usuário faça uso integral dela. Normalmente, não é possível escolher quais partes da plataforma você deseja usar. Ou você a usa toda, ou não usa. Compare isso com as bibliotecas: você pode usar várias bibliotecas ao mesmo tempo, combinando-as de várias formas, mas depois de escolher uma plataforma, você tem que continuar com ela.
Outra diferença é que as plataformas geralmente são rígidas. Decisões de design claras são feitas e você precisa aceitá-las, se escolher usar a plataforma. Por esse motivo, as plataformas são ótimas para impor a padronização e as diretrizes da organização que devem ser seguidas por todas as equipes.
Agora que concluímos a introdução, vamos passar ao artigo em si.
As ferramentas internas são produtos e devem ser gerenciadas como tal
As ferramentas internas são produtos e devem ser gerenciadas como tal. É necessário pensar nos usuários internos como clientes, o que às vezes é difícil, devido à proximidade e à informalidade das operações do dia a dia.
Seria ideal ter gerentes de produto dedicados, para entender e interagir com os usuários e definir prioridades conforme as necessidades deles. Se isso não for possível, deve haver pelo menos algumas pessoas com habilidades de gerenciamento de produto na equipe.
O mínimo que você precisa para gerenciar um produto interno é um plano de desenvolvimento claro, feedback estruturado dos usuários e um bom canal de suporte.
Exemplos e uma boa documentação ajudam a reduzir a necessidade de suporte 1:1. Além disso, certifique-se de que os usuários saibam como pesquisar no Slack para encontrar respostas a perguntas frequentes.
A divulgação é essencial
Geralmente, as pessoas não querem aprender a usar mais uma ferramenta, ainda mais se as vantagens não forem imediatamente claras. Devemos praticar ativamente a divulgação, promovendo a ferramenta para os usuários em potencial.
Em algumas instâncias, a adoção de uma ferramenta pode ser obrigatória por meio de abordagens impostas pela empresa, como incorporá-la aos objetivos e resultados-chave (OKRs) ou outras estruturas de definição de metas corporativas. Nesses cenários, provavelmente a divulgação não é muito necessária. Mas esse não é o nosso foco: preferimos criar ferramentas que os usuários queiram usar, porque entendem o valor delas, e não porque são forçados a isso.
Do ponto de vista dos clientes, usar uma nova ferramenta significa ter que aprender a usá-la e, talvez, mudar algum aspecto de seu trabalho.
Isso pode ser uma barreira importante, porque as pessoas geralmente resistem à mudança, ainda mais quando isso envolve modificar um fluxo de trabalho que já conhecem bem e estão acostumadas. Vários fatores são importantes aqui: as percepções sobre a segurança no trabalho, questões de ego e ideias de perda de influência. As pessoas não gostam de abandonar algo que passaram 2 anos aprendendo, ainda mais se acharem que isso lhes traz status na empresa.
Na nossa experiência, é melhor demonstrar valor primeiro. Se você fizer isso corretamente, a decisão de adotar a sua ferramenta será óbvia e fácil. Eis como:
Logging, instrumentação e feedback de usuários
Ao criar ferramentas internas, existe um risco real de supor que sabemos do que os nossos usuários precisam e como eles usam nossas ferramentas.
Em vez disso, use dados. Sem dados, o gerenciamento de produto é reduzido à tomada de decisões baseadas em palpites, o que a transforma em um exercício puramente político, em que a opinião da pessoa com maior remuneração vence.
Coletar informações permite que a equipe de manutenção compreenda como os usuários utilizam a ferramenta. Isso ajuda a medir a satisfação do cliente e a detectar áreas de foco para melhorias, tornando a manutenção mais eficaz.
Nós vemos duas formas principais de coletar informações: implícita e explícita, respectivamente por meio de instrumentação do sistema e pesquisas. Cada uma delas fornece insights a partir de um ângulo diferente e ambas têm vantagens e desvantagens.
Colete dados implicitamente por meio de logs e instrumentação. Toda linguagem de programação suporta o registro em log, que pode ser visualizado em ferramentas como Splunk ou Grafana. A maior vantagem do feedback implícito é que ele é impossível de falsificar – mas dá trabalho para configurar.
Aqui estão alguns exemplos de informações que podem ser obtidas com logs:
Por outro lado, as pesquisas com usuários são boas para obter feedback de forma explícita, desde que os usuários se sintam confortáveis com isso. O maior risco é que os clientes internos evitem dar um feedback honesto negativo, por medo de retaliação e da política de escritório. Para evitar isso, as pesquisas com usuário devem ser anônimas.
Ao escolher pesquisas como Formulários do Google, considere o tempo dos seus clientes: Inclua o máximo possível em um formulário curto. As pessoas têm coisas melhores para fazer do que responder a uma pesquisa de 20 páginas sobre o seu produto.
Dê preferência a perguntas com respostas classificadas numericamente (como a escala de Likert) para permitir comparações ao longo do tempo e que sejam tão específicas quanto possível: “Em uma escala de 1 a 5, quanto você diria que a ferramenta X aumentou sua produtividade ao realizar a tarefa Y?”
Por fim, lembre-se de incluir uma ou duas perguntas abertas para receber opiniões gerais e conselhos dos usuários.
Os exemplos são o melhor tipo de documentação
Ter uma documentação é um requisito comum das ferramentas internas, especialmente quando você precisa atender usuários não técnicos.
Porém, custa muito caro criar e manter uma boa documentação. Acrescentar recursos às ferramentas sempre terá prioridade sobre a atualização dos documentos. Então, a ferramenta evolui e a evolução fica defasada.
É comum que a documentação fique ultrapassada com o tempo e sofra uma morte lenta, eventualmente chegando ao ponto em que ninguém mais confia nela. Às vezes, ela se torna abertamente enganosa: instruções que não fazem mais sentido, referências a recursos que foram alterados, etc.
Além disso, ninguém quer ler a documentação. Os usuários querem resolver as coisas o mais rápido possível. Geralmente, a forma mais rápida é ver exemplos e tentar descobrir como adaptá-los para o seu próprio caso de uso. Facilite a vida deles com um conjunto de exemplos canônicos como parte da documentação oficial.
Além dos benefícios acima, um bom conjunto de exemplos também ajuda a reduzir o esforço do suporte. Isso evita que as equipes de suporte tenham que lidar com perguntas que poderiam ser respondidas indicando um exemplo.
Os exemplos também podem servir como testes de integração para as ferramentas, garantindo que os exemplos sejam sempre validados com as novas versões, como parte do seu fluxo de CI/CD. Agora, a sua documentação é testável, o que é o melhor de dois mundos, impedindo que ela fique desatualizada.
Por fim, os exemplos ajudam a impedir a propagação de “más práticas” entre a base de usuários. É surpreendente quantos usuários copiam e colam o código de outras pessoas para tentar fazer as coisas funcionarem.
Os exemplos são o melhor tipo de documentação, especialmente para ferramentas internas que serão usadas por pessoal técnico, como profissionais de dados. Eles são mais fáceis de criar, validar e manter do que o texto escrito. Eles estão mais próximos da origem (o código-fonte) e são consumidos mais rapidamente. Os exemplos só ficam abaixo do próprio código.
Manter a consistência
Quando alguém usa uma ferramenta, ele precisa criar um modelo mental de como ela funciona. Um único exemplo é a configuração dos pedais em carros manuais.
As marcas de carro variam muito em relação às cores e tamanhos, e até o lado onde fica o volante, mas são consistentes em relação à configuração dos pedais: depois que você criou um modelo mental de como usá-los, você pode confiar no modelo independentemente do carro que estiver dirigindo.
Agora, imagine se cada marca de carro tivesse uma configuração de pedais diferente. Ao dirigir um novo carro, você não saberia o que esperar e precisaria criar um novo modelo mental, reaprendendo a dirigir.
As ferramentas internas como bibliotecas e plataformas também são assim. Quanto mais consistente for uma ferramenta, usando os mesmos padrões, nomenclatura, estrutura e convenções em todas as partes, mais rápido os usuários poderão criar um modelo mental, e mais intuitiva a ferramenta será.
Isso ajuda a impedir erros, reduz a necessidade de suporte e, mais importante, reduz a carga cognitiva da sua ferramenta. Usar uma ferramenta consistente significa que depois de aprender a realizar uma tarefa específica, você terá aprendido todas elas, como acontece com os carros e a configuração dos pedais.
Todos nós conhecemos ferramentas que parecem fáceis e intuitivas, e aquelas que nunca nos lembramos de como usar (e precisamos procurar exemplos no Google constantemente). Pandas e Matplotlib são bons exemplos: embora sejam bibliotecas muito boas, há alguma inconsistência nos nomes, na ordem dos argumentos e na semântica das funções.
Uma boa regra para seguir é o princípio da menor surpresa, onde você, o mantenedor da ferramenta, sempre escolhe estruturar as coisas de uma forma que pareça mais natural ou menos surpreendente para o usuário.
A maior vantagem da consistência é reduzir a carga mental dos usuários, mas descobrimos que isso ajuda até na capacidade de descoberta: os usuários são capazes de explorar melhor as suas ferramentas se as coisas tiverem nomes e estruturas consistentes.
Aqui estão algumas dicas práticas sobre como alcançar a consistência nas ferramentas internas:
Cuidado com as dependências
Conforme as pessoas começam a usar as ferramentas que você cria, elas inevitavelmente começarão a depender dessas ferramentas para fazer o trabalho. Se a ferramenta mudar de formas inesperadas, isso afetará os usuários e os impedirá de trabalhar.
Na verdade, isso é um problema positivo, pois significa que as pessoas estão extraindo valor suficiente das suas ferramentas para integrá-las em seus fluxos de trabalho. As únicas ferramentas sem problemas de dependência são aquelas que ninguém usa.
Mas as dependências são um problema porque limitam a capacidade de mudar e melhorar as ferramentas: as atualizações podem atrapalhar os fluxos de trabalho que dependem atualmente das ferramentas.
Como qualquer software, as ferramentas internas precisam mudar e evoluir, conforme mais recursos são adicionados. Porém, quanto mais forte o acoplamento que o usuário fizer entre a sua ferramentas e os fluxos de trabalho, mais difícil será adicionar recursos e fazer as alterações necessárias para combater a entropia e a obsolescência do software.
Você precisa limitar o acoplamento entre os usuários e as ferramentas, para que quando chegar o momento de adicionar recursos e refatorar, seja possível fazer isso com segurança.
Mais especificamente:
A Lei de Hyrum é uma interpretação extrema do problema da dependência. Ela define que os clientes dependerão não só da API pública exposta pela sua ferramenta, mas também de qualquer comportamento observável que possa ser inferido ou visto de fora.
Inicialmente, a lei era sobre dependências entre módulos de software, mas a analogia ainda é válida. É impossível garantir que nunca haverá mudanças disruptivas quando você atualiza as suas ferramentas. Ainda assim, há muitas coisas que nós, mantenedores da ferramenta, podemos fazer para reduzir os riscos, mantendo as APIs estáveis e garantindo que a ferramenta seja atualizada sempre que necessário.
O raciocínio 80/20
As boas ferramentas não tentam incluir o mundo todo. Elas têm um equilíbrio entre quanta liberdade e quantos limites vão expor aos usuários: se os limites forem poucos demais, as ferramentas serão muito desestruturadas e difíceis de usar. Se forem em excesso, os casos de uso avançados ficarão de fora.
Você deve se concentrar em garantir que os 80% de tarefas comuns apenas funcionem de forma natural, intuitiva e eficiente. Mas você também deve deixar espaço para os casos de uso avançados: os 20% restantes. Isso significa suportar algum nível de personalização a fim de atender usuários avançados, que às vezes têm casos de uso complexos e incomuns que você nunca chegou a considerar.
Com uma boa ferramenta, os 80% dos casos de uso são facilitados, enquanto os 20% restantes tornam-se possíveis.
Os usuários sempre darão um jeito de fazer o trabalho. Se não puderem adaptar a sua ferramenta para o caso de uso deles, eles não vão usá-la. Ponto final. Como mantenedor, é sua responsabilidade criar uma ferramenta que apenas funcione para os casos de uso mais simples, mas que possa ser personalizada para os mais avançados.
As ferramentas de aquisição interna têm o código aberto dentro da empresa. Portanto, a primeira forma de incentivar a personalização é seguir boas práticas de ES e criar código limpo, para que os próprios usuários possam entendê-lo e contribuir com Pull Requests (PRs) para a base de código.
Para nós, três estratégias foram especialmente úteis:
A orientação a objetos permite a sobrescrita fácil da funcionalidade padrão
A programação orientada a objetos não é adequada para todos os casos de uso, mas funciona bem quando você quer expor componentes que podem ser ampliados pelos usuários, se necessário. Isso é ainda mais fácil em linguagens dinâmicas, como o Python (a língua franca do mundo de CD/AM), em que você pode estender as classes centrais e sobrescrever (override) o comportamento padrão durante o tempo de execução apenas adicionando métodos.
Isso já se mostrou útil em muitas ocasiões. Muitos usuários avançados sabem programar, então eles hackeiam uma forma de conseguir o que quiserem, criando subclasses levemente modificadas em seu próprio código.
Padrões sensatos
A maioria das ferramentas possui opções de configuração. Pode ser um arquivo “config”, uma tela de opções em um aplicativo ou algo assim. As opções de configuração permitem a personalização pelo usuário, então você precisa delas. Mas não é desejável que os usuários precisem configurar opções para cada uma das tarefas.
As opções de configuração devem ter padrões sensatos que atendam à maioria dos casos, mas também devem permitir a personalização quando isso for apropriado. Decidir quais valores padrão devem ser usados exige que você compreenda o usuário médio e como ele usa a sua ferramenta. Descubra isso entrevistando-os e estudando as necessidades deles.
Facilidade de uso antes da elegância do código, sempre
Quando você tiver que escolher entre a facilidade de uso e a elegância do código interno, escolha a facilidade de uso, mesmo se isso causar uma dívida técnica.
É mais difícil se recuperar da perda de usuários do que da perda temporária de qualidade no código, que deve ser fácil de corrigir se você isolar o código adaptador das regras de negócios centrais, como sugerimos na seção Cuidado com as Dependências desse blog post.
Conclusão
Há muitas formas de evitar, ou ao menos minimizar, os problemas ao criar e manter ferramentas internas, especialmente para usuários técnicos como Cientistas de Dados e Engenheiros de Aprendizado de Máquina.
Se tivéssemos que fazer o menor resumo dessas lições, diríamos:
Conheça nossas oportunidades