O artigo Software Engineering at Google, feito por Fergus Henderson apresenta as práticas de engenharia de software adotadas pelo Google, ele apresenta o conhecimento que a empresa obteve após seus erros e acertos durante muitos anos de mercado e diversos produtos desenvolvidos. O artigo separa as práticas em três grupos, desenvolvimento de software, gerenciamento de projeto e gerenciamento de pessoas.
Desenvolvimento de software
Repositórios de código fonte:
- A maior parte dos códigos fonte dos produtos e ferramentas do google ficam em um único repositório, com exceção do chrome, android e códigos com grande valor ou que necessitam de segurança, além disso, todos os engenheiros têm permissão para corrigir problemas que encontrar e saber resolver.
- O desenvolvimento é feito a partir da branch principal do projeto, tirando a necessidade de fazer merges e facilitando a implantação.
- Qualquer alteração no código passa por testes automatizados, que notificam o responsável e o revisor das alterações para qualquer problema encontrado nos testes.
- Alguns diretórios nos repositórios possuem um arquivo que indica quem são os responsáveis pelos códigos daquele diretório, qualquer engenheiro pode fazer alterações, porém, apenas os responsáveis podem aceitar, visto que quem fez os códigos entende mais sobre o mesmo.
Build dos projetos:
O Google possui uma ferramenta chamada Blaze que consegue compilar e fazer testes de qualquer repositório de projetos do Google com apenas alguns comandos, facilitando a configuração dos ambientes de todos os projetos. Além disso, por se tratar de um sistema distribuído, essa ferramenta consegue compilar e rodar testes de forma mais rápida por usar múltiplas máquinas para realizar essas operações, outra característica interessante é que o Blaze consegue deixar as compilações em cache, otimizando ainda mais o tempo de build dos projetos. o vídeo abaixo explica o funcionamento do Blaze, também conhecido como Bazel.
Revisão de código:
- O Google possui ferramentas para auxiliar na revisão do código, elas notificam um revisor quando uma solicitação de revisão é criada e o autor do código dos pontos levantados e testes.
- Toda alteração na branch principal deve ser revisada por pelo menos um engenheiro, e, caso o autor das alterações não é o criador do código, um dos criadores deve revisar.
- O Google tem uma ferramenta que sugere possíveis revisores de código de acordo com diversos fatores.
- Discussões a respeito de revisões são enviadas automaticamente por email para os envolvidos, além disso, em caso de bugs, as alterações que geraram esses bugs são enviadas para os autores, para eles se atentarem aos erros feitos.
- Existe uma branch feita exclusivamente para experimentos, mesmo que a branch principal seja a branch recomendada para desenvolvimento, onde não é necessária a revisão de código.
- É recomendado que as alterações sejam feitas em pequenas partes, facilitando a revisão, visto que grandes alterações requerem mais tempo de revisão
Testes:
- Testes unitários são utilizados e devem ser acompanhados de qualquer mudança no código, qualquer alteração que vá para o ambiente de produção deve ter testes, além disso, novas funcionalidades devem ter seus testes desenvolvidos.
- Mocking é utilizado nos testes quando necessário trabalhar com bibliotecas e dependências.
- Testes de regressão e integração também são utilizados
- O Google possui ferramentas que verificam a cobertura dos testes, quais linhas do código desenvolvido são checadas pelos testes.
- Métricas devem ser geradas a partir dos testes e verificadas antes que as alterações sejam implantadas.
Detecção de Bugs:
O Google utiliza uma ferramenta chamada Buganizer para detectar problemas, bugs e reclamações de clientes. Após detectados, esses problemas são categorizados e posteriormente designados para algum engenheiro resolver. Alguns times possuem engenheiros responsáveis por solucionar esses bugs e outros solucionam eles durante reuniões. A categorização dos bugs é constantemente utilizada para ajudar na organização para a posterior solução.
Linguagens de Programação:
- No Google são utilizadas 5 linguagens de programação, sem considerar as linguagens especializadas para situações específicas ,são elas o Java, C++, Python, Go, Javascript
- Existe um guia para que todo o código desenvolvido siga um mesmo padrão de escrita
- Existe um curso para ensinar os engenheiros a escreverem códigos de fácil leitura e entendimento.
- O google utiliza protocol buffers para fazer a comunicação entre diversos objetos de diferentes linguagens de programação, visto que os projetos são muito diversificados.
Debugging em produção:
Os servidores do Google estão integrados com bibliotecas de monitoramento, em caso de encontro de problemas, são gerados logs. Além disso, existem interfaces de monitoramento online para requisições e respostas e outras métricas.
Lançamentos:
- Os lançamentos são geralmente semanais, quinzenais ou diários
- Existem times que possuem engenheiros responsáveis por fazer apenas os lançamentos, porém, qualquer engenheiro pode fazer lançamentos
- O google automatiza os lançamentos, tirando a necessidade dos engenheiros fazerem tarefas relacionadas ao mesmo
- As alterações dos lançamentos passam por testes e só podem ir para ambiente de produção após esses testes serem bem sucedidos
- Antes de ir para todos os servidores, as alterações passam por um servidor de staging, onde as alterações são testadas geralmente por desenvolvedores, após isso, as alterações entram em alguns servidores que recebem requisições de usuários, finalmente, após essa etapa, as alterações entram em ambiente de produção
Aprovação de Lançamentos
Antes de um lançamento entrar em produção, mesmo depois de pronto, ele deve ser aprovado por pessoas fora do time de engenharia, que vão analisar se as alterações cumprem uma vasta gama de requisitos. Pessoas de certa importância são notificadas das alterações que entraram em produção. O Google possui ferramentas que ajudam na aprovação dos lançamentos.
Post-mortem:
Quando ocorre qualquer interrupção em sistemas em produção, os responsáveis devem escrever um documento que descreve o incidente, a causa, o que solucionou e o que não solucionou. O documento visa entender o problema e como evitar ele no futuro.
Reescrita frequente:
A maioria dos software do Google é reescrito depois de alguns anos, visto que os requisitos, as tecnologias mudam constantemente, assim revelando a necessidade de reescrever o código, além disso, isso ajuda a dar autoria de código a novos engenheiros, que tendem a trabalhar melhor em códigos que eles criaram.
Gerenciamento de projeto
20% do tempo:
Os engenheiros podem utilizar até 20% do tempo deles em qualquer projeto do Google que eles tenham interesse, sem precisar da aprovação dos seus supervisores ou gerentes. Isso ajuda a melhorar a motivação dos engenheiros, o que melhora ainda mais a performance deles nos outros projetos.
OKR`s:
Objectives key results é a forma com a qual o Google cria suas metas para os projetos, todo time deve documentar seus objetivos de forma que seja possível ver o progresso. Esses objetivos são tri mensais ou anuais e são medidos de 0 a 1. Geralmente a boa média de conclusão é de 65% e quando os times atingem a média ou mais eles são encorajados a aumentar os objetivos, caso contrário, são aconselhados a pegar objetivos de forma consciente.
Reorganizações:
Quando projetos são cancelados, os envolvidos do time do projeto são realocados para outros projetos, isso ocorre com frequência visto que os requisitos e tecnologia estão sempre mudando, em algumas situações, os envolvidos podem escolher para que time e posição eles serão realocados.
Gerenciamento de pessoas
Papéis:
O Google divide as carreiras de engenharia de software em desenvolvimento e gerenciamento
- Engineering Manager: gerenciam outros engenheiros
- Software Engineer: são os desenvolvedores de software
- Research Scientist: são engenheiros de software mais voltados para a academia e para a área de pesquisa
- Site Reliability Engineer: são os engenheiros de software voltados para a área de devops
- Product Manager: gerenciamento de produtos
- Program Manager / Technical Program Manager: gerenciam projetos, processos e operações
Estrutura
O Google é bastante famoso devido às estruturas físicas da empresa em diversos locais do mundo, geralmente um ambiente que é visto como divertido pelas pessoas e com uma grande quantidade de benefícios para os empregados.

Treinamento
Todos os novos funcionários passam por diversos treinamentos, engenheiros de software e pesquisadores começam estudando tecnologias e fazendo exercícios






















