Manual do CTO de Startup
(github.com/ZachGoldberg)Manual do CTO de Startup
Habilidades essenciais e boas práticas para equipes de engenharia de alta performance
Introdução
- Aprender sempre: o autor tinha, desde criança, uma paixão por computadores e programação de software, e por meio disso percebeu a importância do aprendizado contínuo. Para ter sucesso como líder técnico, é importante aprender e evoluir constantemente.
- O dilema do líder técnico em startups: a maioria das startups tem um cofundador técnico, e essas pessoas escrevem a base de código inicial e contratam os primeiros engenheiros. No entanto, à medida que a equipe cresce, o líder técnico precisa migrar para um papel de gestão, e nesse processo pode faltar experiência em liderança.
Sobre o autor
- O autor acumulou experiência em várias startups e vem atuando como líder técnico. Por meio de experiências em diferentes startups, passou a compreender as diversas habilidades e os desafios necessários para a liderança técnica.
Como usar este livro
- Este livro é uma referência para líderes que gerenciam equipes de engenharia de software e aborda diversos temas em capítulos independentes. Cada capítulo apresenta o tema, oferece uma visão geral e traz boas práticas.
Processos de negócios
- Explica processos de negócios para oferecer um ponto de partida para a resolução de problemas. É necessário ajustar e escalar os processos de acordo com o tamanho da equipe e da empresa.
Pessoas e cultura
Princípios básicos de gestão
- A regra de ouro da gestão: o desempenho da equipe é o critério pelo qual o desempenho do gestor é medido. É preciso dar suporte para que os membros da equipe possam entregar o seu melhor.
- Árvore de competências profissionais: para a liderança técnica, é preciso investir não apenas em habilidades técnicas, mas também em habilidades de gestão.
Melhoria contínua
- Kaizen: tanto a equipe quanto cada indivíduo devem buscar melhoria contínua. Erros devem ser encarados como oportunidades de melhoria.
Coaching
- O gestor deve atuar como um coach que ajuda os membros da equipe a darem o seu melhor.
Encontrando um mentor de gestão
- É importante encontrar um mentor de gestão para a transição para a liderança. Com o mentor certo, é possível aprimorar as habilidades de liderança.
Reuniões 1:1
- Reuniões 1:1 são uma oportunidade de construir relacionamento com os membros da equipe, entender seus pontos fortes e fracos e ajudá-los a dar o seu melhor.
Reuniões skip-level
- É possível coletar diferentes perspectivas reunindo-se regularmente com os subordinados diretos dos gestores, e com isso melhorar o negócio.
Coaching para gestores
- O desempenho dos gerentes intermediários é importante para o desempenho da organização. É preciso desenvolver gestores por meio de capacitação e suporte contínuos.
Reuniões 1:1 com engenheiros
- Reuniões 1:1 com engenheiros são uma oportunidade de ouvir os problemas que eles enfrentam e ajudá-los a encontrar soluções. É preciso deixar claro o objetivo da reunião e conduzir uma conversa produtiva.
1 comentários
Comentários no Hacker News
Quando vejo um documento desses, costumo ir primeiro para a parte que conheço a fundo para verificar o que foi dito. Aqui dizem que normalmente leva de 6 a 12 meses para preparar e executar auditorias PCI DSS ou SOC 2, então você não deveria tentar obter a certificação na última hora, mas para startups eu quase daria o conselho oposto
Em especial, a comprovação SOC 2 é fácil de obter, e gastar dinheiro de forma proativa antes mesmo de um pedido de compra estar em jogo é desperdício. Claro, coisas como configurar single sign-on ou proteger branches do Git, que depois servem de base para a comprovação, é bom fazer cedo, mas isso já está mais para práticas básicas recomendadas que você deveria adotar de qualquer forma, mesmo sem planejar obter SOC 2. Se um cliente grande não exigir, não vejo necessidade de fazer SOC 2. Seria bom que alguém revisasse as outras partes deste documento também
Com uma réplica de leitura para BI e uma ferramenta de visualização decente, isso aguenta bem por bastante tempo, até antes de gastar valores de 5 ou 6 dígitos em algo como Snowflake
Dependendo da situação de caixa, o custo de usar um serviço automatizado de checklist de conformidade SOC 2 como o Secureframe pode ficar na casa de alguns milhares de dólares, e isso não só força a adoção de boas práticas, como também organiza tudo do jeito específico exigido pelo SOC 2, facilitando a auditoria. Comparado ao tempo de desenvolvimento e gestão de projeto necessário para colocar no caminho do SOC 2 uma organização já profundamente marcada por processos fora de conformidade, não é um investimento grande
Essa ideia de que é fácil conseguir a comprovação SOC 2 também é o completo oposto do que ouvi de outras pessoas sobre esse tema. Sempre ouvi que é muito difícil e demorado, então queria entender o que estou deixando passar. Se realmente for algo fácil, adoraria estar errado
Vejo com frequência a ideia de que, ao virar VP ou CTO, você para de programar. Eu entendo que habilidade de gestão não é a mesma coisa que habilidade de programação, mas é difícil entender por que as pessoas largam o teclado e desperdiçam seu primeiro superpoder
Dá para continuar sendo um CTO técnico do começo ao fim. Trate a equipe e a empresa como um serviço que precisa de contribuição ativa, manutenção e suporte on-call, e ao mesmo tempo continue construindo, colocando a mão na massa sozinho e junto com o time
O problema de verdade é assumir cedo demais na carreira um cargo em que não há tempo para programar. Tipo aceitar um papel de arquiteto em que você só desenha caixas no quadro e vai de reunião em reunião, ou uma função que na prática é gerencial, mas vem com o rótulo de “tech lead”. Você se acostuma a não escrever código e, anos depois, quando precisa buscar outro emprego, vai para entrevistas de programação encarando o fato de ter passado uma parte considerável da carreira sem programar. Para muita gente, o ritmo não volta rápido
Era muito melhor usar meu tempo resolvendo problemas que as outras pessoas não conseguiam resolver. Às vezes eu pegava uma mudança bem simples para passar pelo nosso processo com as próprias mãos e ver onde dava para melhorar. Continuei programando à noite e nos fins de semana, mas não é a mesma sensação, e com o tempo você inevitavelmente enferruja um pouco. Ainda assim, durante um período sabático, foi realmente muito prazeroso passar o dia inteiro programando com a mão na massa
Dá para fazer reviews ou participar de reuniões de design, mas, se pegar trabalho central, no fim surgem problemas
O código que um VP/CTO pode escrever também pode ser escrito por outra pessoa do time, e talvez até melhor. Já os outros trabalhos que mencionei provavelmente são aqueles em que o VP/CTO é a melhor pessoa da empresa para atuar. Deixar de lado, em grande parte, o trabalho técnico prático para focar no que é mais importante para o time e a empresa é uma decisão bem razoável
A ideia de continuar programando é boa, mas normalmente não é por isso que pagam você. Eu me considero um desenvolvedor muito forte, mas dá para contratar alguém assim por menos do que o salário de um CTO. Fazer um CTO mais caro executar esse trabalho é ineficiente. Para constar, alguns anos depois voltei a ser contribuidor individual, e pretendo seguir assim pelo resto da carreira
Eu diria que chat síncrono não existe
Se precisa ser síncrono, não deveria ser feito numa janela de chat. Pelo menos não, a menos que tenha havido um acordo do tipo “vamos focar em um chat em tempo real por alguns minutos”. Se for remoto, ligue; se for presencial, converse cara a cara. Não se deve jogar uma mensagem no chat esperando resposta imediata
Fiquei curioso para saber se houve algum caso em que o modelo de “dois times” não gerou ressentimento. Também não sei se houve situações em que as pessoas não quisessem naturalmente migrar para o time do futuro
No papel parece uma boa ideia, mas é difícil acreditar que funcione bem na prática. O caso mais próximo que já vi foi um time de biblioteca que criava serviços como design system e componentes para que outros times usassem
Desde que mantivessem essa responsabilidade em ordem, podiam usar o tempo restante livremente em qualquer coisa que considerassem valiosa para a empresa. Era um acordo muito bom. As outras pessoas eram gratas porque aquele time pequeno assumia o trabalho sujo, e o time de manutenção gostava porque no tempo livre podia consertar coisas incômodas de longa data ou fazer pesquisa. Esqueci os detalhes, mas lembro que saíram melhorias bem legais e resultados interessantes de pesquisa. Também ajudou o fato de que as pessoas desse time eram muito competentes e autônomas, mas isso também custava mais caro
Já passei por alguns lugares onde times totalmente separados funcionavam bem. Em jogos, dá para pensar em time de engine e time de jogo. Em um dos meus cargos antigos, mesmo dentro do time de jogo, eu assumia funcionalidades que levavam de 6 a 12 semanas, lançava, e depois cuidava de manutenção, atualizações e dívida técnica. O foco principal era o que tinha acabado de ser lançado, mas também havia tempo para voltar a trabalhos anteriores, e outros times seguiam o mesmo ciclo e entravam em onboarding de novas funcionalidades 6 a 8 semanas depois, repetindo esse padrão
Não tratávamos isso como times fixos, mas como um fluxo de trabalho em que as pessoas alternavam a cada sprint, ou seja, a cada duas semanas. Funcionou bem por cerca de 3 meses, mas depois deixou de fazer sentido e, nessa época, a organização cresceu e reestruturamos os times em torno de capacidades de negócio ou domínios
Materiais assim não servem para serem usados como bíblia, e sim porque dão uma visão ampla das responsabilidades e preocupações
A menos que você tenha tido um grande mentor ou trabalhado sob alguém realmente excepcional, quando chega a esse cargo ninguém senta ao seu lado para te dar uma lista do que precisa observar. Em cada seção, isso ajuda porque leva você a perguntar: “qual é a nossa resposta?”, “concordamos com isso?”, “nosso processo é melhor?”, “o que deixei passar?”
Impressionante ver essa separação em dois times tão explicitamente. É uma forma fantástica de fazer você continuar lançando coisas até o custo de colocar algo minimamente aceitável em produção ficar alto demais
Quando você rompe o ciclo de feedback de volta para as pessoas que construíram o software originalmente, essas pessoas ficam um pouco mais felizes por um tempo e outras ficam um pouco mais infelizes. Aí o time de funcionalidades passa a não querer mais ser interrompido nunca, e o time de clientes deixa de receber recursos para consertar qualquer coisa de verdade
Pior ainda: o time de funcionalidades não aprende nada além de como empurrar coisas para fora. O motivo de tudo ficar mais lento e mais caro com o tempo é que você removeu a única função de adaptação adequada para desenvolver bom software: o processo de reintegrar feedback negativo à fonte do desenvolvimento. Se fosse um verdadeiro manual de liderança para CTOs, deveria dizer claramente: “é sua responsabilidade ajudar os desenvolvedores a melhorarem mesmo enquanto entregam em produção, e eles nem sempre vão gostar disso”
Isso também cria conflitos de merge entre um time de funcionalidades impulsionado por vendas e um time de manutenção impulsionado por atendimento ao cliente. Se o “time de clientes” é descrito como uma etapa da qual depois se sai, então é óbvio qual dos dois vai ganhar a disputa por prioridade. E a frase “mais um caminho para engenheiros individuais, especialmente juniores, aprenderem e crescerem” no fim soa como “os sêniors não querem limpar a bagunça, então jogam isso para os juniores”
Esse tipo de time tende a atrair pessoas que desprezam o trabalho de entregar funcionalidades e corrigir bugs e querem abstrair demais os problemas. Em vez de corrigir bugs, vão criando abstrações cada vez mais complexas com a promessa de impedir que bugs existam desde o começo, e o resultado é previsível
Clientes, especialmente os não técnicos, normalmente não têm uma visão de produto coerente e muitas vezes só querem a correção imediata do problema atual, independentemente de qualquer outro plano. Às vezes o feedback entra em conflito porque os próprios clientes não se comunicam entre si. Se você joga esse peso para os desenvolvedores, além da capacidade técnica de conhecer e manter bem a base de código eles ainda precisam administrar toda a comunicação, e todos os desenvolvedores precisariam compartilhar a mesma visão coerente para tomar decisões cuidadosas. Num cenário atual em que desenvolvedores também gerenciam infraestrutura, isso na prática vira uma pessoa fazendo dois ou três trabalhos
As pessoas pareciam gostar muito mais desse modelo. Não ficavam esgotadas de sempre corrigir bugs, e também evitávamos essa ruptura do feedback que você descreveu tão bem
Neste ponto, já fiz tantas entrevistas que perdi a conta, então acho um pouco difícil concordar. Uma dificuldade é que, na etapa de inscrição, há ou pode haver candidatos demais, e nessa fase normalmente é a equipe de recrutamento que interage com os candidatos
Incluir perguntas como no exemplo é ok, mas, para filtrar candidatos não qualificados, são necessárias perguntas que não sejam de sim/não nem de escala. Eu prefiro perguntas bem simples com resposta clara. Há surpreendentemente muitas pessoas que dizem estar “muito confortáveis” com JavaScript e ainda assim não sabem o que é
===. Então faço uma pergunta como “qual é o operador de igualdade estrita em JavaScript”. Qualquer programador JavaScript deveria saber, mas só essa pergunta já elimina 50% do grupo de candidatos e economiza um tempo enorme da organizaçãoFala-se muito em adequação cultural, mas boa parte disso parece trazer à tona camadas ocultas de discriminação que fazem mal à empresa. Abertura cultural é um fator de sucesso, e discriminação, na minha visão, empurra na direção oposta
Quando vejo a frase “os melhores líderes acompanham a taxa de sucesso, não têm medo de admitir erros de contratação, contratam devagar e demitem rápido”, dá vontade de postar a imagem que o JWZ (Jamie Zawinski) mostra quando detecta o cabeçalho referrer apontando para este site. Basta procurar no Google o que Jamie Zawinski disse sobre a Y Combinator. Ele também é a pessoa que recebeu crédito pela decisão da Netscape de liberar o Netscape Navigator como open source e por grande parte do trabalho que levou ao motor de renderização daquele navegador. É por isso que existe o Firefox
Em um dos meus primeiros empregos, tentaram proibir completamente qualquer coisa que pudesse ser chamada de adequação cultural nos critérios de contratação. Como resultado, algumas pessoas odiaram a empresa assim que entraram e saíram em poucas semanas ou meses. Um candidato enfatizava planejamento e previsibilidade e reclamava que as empresas anteriores se moviam rápido demais. Nós éramos uma startup e, como era de se esperar, ele odiou a empresa. Mas não podíamos expressar essa preocupação no processo de decisão de contratação. Considerava-se que isso era “adequação cultural” e que poderia levar à discriminação. Depois que coisas parecidas aconteceram mais algumas vezes, essa política desapareceu em silêncio, e passamos a poder avaliar novamente a compatibilidade com a cultura de engenharia
“Adequação cultural” é, em geral, uma troca: abre mão de parte da diversidade de pensamento em troca de eficiência de comunicação e alta confiança. Como as pessoas já sabem como devem agir e o que esperar umas das outras, não é preciso criar muitas diretrizes, mas isso também as torna mais vulneráveis ao pensamento de grupo e a vieses cognitivos relacionados. É algo como: “há todas as cores do arco-íris neste navio, mas até o nosso Klingon acha que os Klingons são maus”
Não tenho certeza se o conselho de “criar uma biblioteca de vídeos explicativos” é bom. Pode fazer sentido para coisas específicas, como UI ou animação
Mas, no geral, ler texto é mais eficiente do que assistir a vídeo. Quando se está com pressa, também é muito mais fácil ir para as partes importantes em um texto do que em um vídeo