Tecnologia / Gestão /
Como implantar um processo de desenvolvimento onde não há processo de desenvolvimento

Cléber

![birmingham-02.jpg](/files/192) Photo by [Birmingham Museums Trust](https://unsplash.com/@birminghammuseumstrust) on [Unsplash](https://unsplash.com/s/photos/assembly-line). --- O artigo imediatamente anterior trata sobre implantar uma cultura de testes onde não há cultura de testes. Todavia considera-se, lá, que haja **algum** processo de desenvolvimento já estabelecido, coisa que pode levar o leitor a questionar: *mas e se nem **processo** temos?*. # Processo ## A teoria do software Um processo de desenvolvimento de software começa justamente na parte mais importante de todas, que é o **desenvolvimento das teorias**. Você pode ler mais a respeito nesse artigo interessantíssimo do **Peter Naur**: *[Programming as Theory Building](http://pages.cs.wisc.edu/~remzi/Naur.pdf)*. O contexto deste, evidentemente, precisa de um pouco de atualização e ouso dizer que planejo escrever um artigo tentando trazer uma luz mais atual à coisa toda, embora ainda baseado na ideia central que o autor sugere, que é a seguinte: escrever software é muito mais do que editar texto e a vida ou morte de um software se dá de acordo com a vida e morte da teoria por trás da construção do texto. Naur argumenta que o que torna os desenvolvedores capazes de manipular o texto de um programa de maneira a adequá-lo a novas necessidades não é um conjunto de regras escritas, a qualidade do texto (código) em si ou mesmo a documentação, mas sim a familiaridade destes desenvolvedores com a teoria por trás do software, do entendimento do "mundo" em torno do mesmo e o conjunto de coisas que são tão específicas em sua linha de raciocínio que tentar "documentá-las" seria mais ou menos como tentar documentar qual é o gosto de um vinho: por melhor que seja a descrição, ainda ficará extremamente aquém da realidade em si. E a consequencia prática disso é justamente o contrário do que uma mente mais afobada pode estar concluindo, que talvez fosse o caso de desistirmos de documentar: a primeira pergunta que eu, particularmente faria, para uma equipe precisando de ajuda no estabelecimento de um processo de desenvolvimento de software seria: "***onde está o conhecimento de vocês?***", porque o fato de que é impossível transferir todo o conhecimento que está na cabeça dos desenvolvedores (ou seja, a teoria do software em si) para o "papel" indica justamente que **precisamos facilitar ao máximo a passagem deste conhecimento** e, para isso, devemos fazer uso das ferramentas mais adequadas. Pense comigo: a empresa conseguiu contratar **vinte** novos desenvolvedores da noite para o dia. Isso deveria ser bom, certo? Mas a maioria das equipes de desenvolvimento consideraria isso um pesadelo. Por quê? Porque o processo de passagem da teoria é completamente desorganizado e depende quase sempre exclusivamente da transmissão oral, ou seja, do ensino direto. E havendo tantos detalhes a serem repassados, é frustrante ocupar tempo demais com aqueles que são **os mais triviais**. **Estes** devem estar no papel. Quanto menos pudermos depender da experiência de transmissão direta, experimental, e quanto mais as trivialidades e a ideia geral da coisa puder ser transmitida de maneira "automatizada" (que se resume em "*senta aí e lê isso*"), melhor. ### Onde está vosso conhecimento? Minha recomendação? **Que a equipe mantenha uma wiki**. Nela deve ser documentado o mundo em que o software habita: as necessidades do negócio, as peculiaridades dos clientes, a forma usual de definição de prazos e, especialmente, os motivos pelos quais as decisões foram tomadas durante o desenvolvimento do software de maneira que hoje a equipe tenha **este** software e não nenhum de todos os outros possíveis e imagináveis. A equipe **precisa** se esforçar para manter o máximo da teoria do software no papel. 100% é impossível, mas quanto maior for a taxa conseguida, mais fácil será o treinamento de novos membros e, especialmente, menos frustrante para todos. *[Você já conhece a WiKey? Ela foi criada justamente para isso.](https://wikey.cleber.solutions/)* ## Ferramentas Se me pergunto se há equipes de desenvolvimento que **não usam** um SCM/CVS acabo sempre respondendo-me que, sim, há... Confesso que tenho aprendido coisas muito interessantes estudando diversos outros SCMs como Fossil, Bazar e até mesmo DARCS, mas minha recomendação para equipes que atuam na indústria ainda é que usem **git**, que tornou-se o padrão e que facilitará sua vida na hora de contratar e treinar novos membros. Eu poderia divagar aqui, agora, sobre ferramentas de CI, CD, configuração, infraestrutura, etc, mas se é o caso de que a equipe mal usa git, talvez ainda não seja a hora para isso (ademais, aí já seria um outro artigo). De qualquer forma, ## Testes Escrevi sobre isso no artigo anterior. :) ## Acesso e controle Pode parecer um tópico estranho, mas controlar o acesso à equipe é parte fundamental no estabelecimento de um processo sadio. Sabe aquele situação em que o desenvolvedor está constantemente sujeito a vir alguém de outra área cutucar o ombro dele pedindo que corrija algum "*bug urgente*" ou que termine logo alguma implementação que está prevista para a semana que vem mas que o cliente está no telefone pedindo para agora e, sabe-se lá por que, alguém disse que ficaria pronta amanhã? Pois é. Isso é caos e confusão. A equipe de desenvolvimento pode continuar sendo "prestativa" e disposta a ajudar sempre que possível, mas a **forma** de fazê-lo não pode ser desse jeito todo atabalhoado. Essa confusão toda geralmente é resultado da falta de controle das tarefas e o resultado imediato é sempre **frustração, confusão e desentendimento**. Explico: quando o programador não tem controle sobre o que está fazendo agora, também não tem a menor ideia do que fez ontem e tampouco de tudo o que produziu na semana passada. Some a isso a situação caótica do entorno e logo você terá discussões envolvendo "vocês não entregam nada" da parte de quem cobra e "nós trabalhamos feito uns condenados" da parte de quem *leva a cobrada*. Essa aparente disparidade entre "não entregar" mas "trabalhar muitão" não parece ser possível, certo? Como pode a equipe se matar de trabalhar e ainda assim "não entregar nada"? Acontece que a equipe provavelmente **está** entregando bastante coisa, mas a falta de *contabilidade* faz com que as impressões imediatas e emocionadas tomem conta do panorama e eclipsem a realidade que termina habitando somente a falha memória dos envolvidos. Por isso mesmo trouxe estes dois pontos simultâneamente: **não tem como** tentar limitar o acesso aos membros da equipe (geralmente estabelece-se um *proxy*, provavelmente o CTO ou o líder técnico) se no fim do dia a impressão que a equipe passa é sempre a de que ninguém está realmente fazendo nada. Lembra da *frustração, confusão e desentendimento*? Bem, queremos **eliminar** isso, não somente mover para algum outro lugar. ### Acesso Requisições à equipe **jamais** podem se dar diretamente a qualquer membro da mesma. É necessário haver algum representante que controle o andamento do trabalho e que seja capaz de prover um mínimo de retorno bem embasado a respeito de prazos, por exemplo. Mas para isso ser possível, é necessário que este representante tenha **substrato** para poder embasar suas respostas. ### Controle **No que você está trabalhando nesse exato momento?** Se essa resposta não vem fácil, é sinal que algo está errado. Por que, afinal, um desenvolvedor estaria em horário de trabalho sem ter noção do que estaria fazendo? Não é como se programadores fossem profissionais baratos a ponto de permitirmos que fiquem "moscando" por aí, certo? É claro, isso é diferente de imaginar que o desenvolvedor estará 100% do tempo batendo no teclado empolgada e apressadamente. Desenvolver software é desenvolver a teoria do software, afinal, e "codar" acaba sendo o último passo do processo. Mas mesmo nos momentos mais *hammock-driven*, saber qual é o objetivo imediato é muito importante, pelo menos para os membros da equipe cuja função principal seja **explicitamente** escrever código. Mas como tornar esse conhecimento algo cotidiano? # Metodologias ágeis Muita besteira tem sido dita a respeito de "metodologias ágeis". Se você ainda está em dúvida a respeito do que seria o resumo da coisa toda, já te adianto: **metodologias ágeis são meramente sobre abraçar a realidade**. Precisamos abraçar a realidade de que mandamos muito mal em **planejamento de médio e longo prazo**, então talvez seja melhor dividirmos os problemas em partes menores para conseguir previsões mais realistas. Precisamos abraçar a realidade de que mandamos muito mal em **entender o que diabos o cliente realmente quer**, então talvez seja melhor irmos entregando funcionalidades com maior frequencia e de maneira incremental, de forma que jogar alguma dessar partes fora não seja um grande desperdício de recursos (pelo contrário: fazendo do jeito certo, é até uma economia). Precisamos abraçar a realidade de que mandamos muito mal em **controlar nosso próprio trabalho**, então talvez seja melhor fazermos planejamentos curtos e com tarefas extremamente claras e que, de preferência, possam ser feitas em um dia. ## Mas nem tanto Precisamos abraçar a realidade de que mandamos muito mal em **documentar as coisas**, então talvez seja melhor desenvolvemos técnicas para documentar melhor. Precisamos abraçar a realidade de que mandamos muito mal em **manter a documentação atualizada**, então talvez seja melhor desenvolvemors técnicas para conseguir manter a documentação atualizada. As pessoas naturalmente tendem aos extremos, e diversas vezes ouvi "mas somos uma startup" como mera **desculpa** para ninguém documentar nada. O famigerado "manifesto aǵil" fala sobre *Working software over comprehensive documentation*, mas também admite que *there is value in the items on the right*. **Há valor, sim, em documentar**. Como disse anteriormente, é um passo crucial para tirar uma boa quantidade de trabalho de treinamento das costas dos desenvolvedores, além de servir de referência útil caso, por algum motivo, estes desenvolvedores não estejam mais disponíveis para ajudar. Em **2001**, quando o manifesto foi escrito, os autores referiam-se a um outro tipo de mentalidade com relação a "*comprehensive documentation*" (termo que não deve ser traduzido como "documentação compreensível", mas como "documentação exaustiva ou completa"). Nós não podemos cometer o erro crasso e anacrônico de tentar torcer esta referência para o que **nós** hoje entendemos por "documentação exaustiva". Sugiro novamente a leitura do artigo do Peter Naur. A teoria do software é importante, e digo que há muito valor e proveito em pelo menos **tentar** transcrever o máximo disso. Ademais, tal documentação geralmente é feita *a posteriori*, ou seja, depois que o *working software* já é, bem, *working software*. ## Cerimônias ### Grooming Você não é obrigado a fazer o que os *Sacerdotes Do deus SCRUM* mandam. Na verdade, você não é obrigado a nada. O que é importante que aconteça é que em algum momento a equipe de desenvolvimento se reuna com a equipe de negócios (caso **sejam** equipes distintas, claro) e escolha-se algumas das tarefas que se sabe precisam ser feitas e, de maneira conjunta, vão **destrinchando-as** de maneira que (1) todos entendam o que precisa ser feito e qual valor é entregue para o usuário e (2) seja possível quebrar essas tarefas em tarefas menores, de preferência reduzindo o escopo da entrega para que seja possível entregar algo **avaliável** pelo usuário com o mínimo de esforço **de maneira razoável**. Há uma porção de pessoas inteligentes que recomendam passar longe do que chamam de "minimalismo exagerado". Novamente, as pessoas tendem a exageros, e com a ideia do "MVP" não é diferente. **Nem sempre** é razoável entregar algo útil e usável sendo apenas "o mínimo". Pode ser que seja necessário algum esforço extra. Junto a "desenvolvimento" e negócio anda, obviamente, uma certa questão "política" que muitas vezes pode envolver, por exemplo, provar para o cliente que é possível desenvolver algo específico ou a equipe toda simplesmente pode querer **apostar** em determinada funcionalidade baseado no que quer que seja. É bom ficar apostando? Eu, particularmente, sou avesso. **Mas você não é obrigado a nada**. Se todos os adultos inteligentes, responsáveis e cientes das eventuais consequencias resolveram que **vão** apostar em algo... bom... quem sou eu para tentar dissuadi-los, certo? Talvez esse tipo de coisa seja vista como uma forma de dissolver as "regras" em algo como "*é proibido dançar agarrado, mas se quiser pode*", mas considero irreal e até arrogante acreditar que eu, aqui da minha torre de marfim, distante da realidade alheia, posso dar um conselho definitivo e final a respeito do que quer que seja. Mas o resumo, afinal, é o seguinte: 1. determine um tamanho de "sprint" e 2. procure definir um conjunto razoável de tarefas que pretende entregar no final desse próximo ciclo #### Mas não pire! Dividir o trabalho em ciclos de prazo limitado serve para abordar o problema do planejamento de maneira **iterativa**, ou seja, para que vá-se melhorando a cada ciclo. Isso tem uma consequencia simples: o primeiro provavelmente será péssimo, mesmo. Muitas equipes, afoitas que estão para tentar acertar de primeira e, muitas vezes, mostrar para a diretoria que a "escolha da metodologia foi acertada", acabam tornando as primeiras reuniões de *grooming* um pesadelo terrível: elas são longas, elas adentram nos detalhes de maneira insatisfatória e há discussões intermináveis sobre coisas que bem poderiam ser definidas em qualquer outro momento. **A primeira iteração é ruim, mesmo**. A ideia é que a próxima será um pouco melhor. Por isso minha sugestão é ser estrito com relação ao *time box* da reunião: não deixe passar de **1 hora** para cada 1 semana de ciclo. (E outra recomendação minha é nunca ter ciclos maiores que 2 semanas.) Então, em resumo, faça o melhor possível, mas não exagere. E tenha ciência plena de que no final dos primeiros ciclos muita coisa ficará faltando. **Haverá oportunidade de melhorar isso**, e a melhoria em si **não é** um trabalho a ser feito de antemão. ### Daily Fazendo a reunião de grooming, todos saberão qual é o conjunto de coisas que pretendem fazer durante o ciclo. Agora é hora de cada desenvolvedor conseguir saber o que fará **hoje**. E, sabendo o que faz a cada dia, é fácil saber o que fez ontem e anteontem, também. Chamo a atenção para o sujeito da ideia toda: o desenvolvedor. A *daily* é uma reunião que serve para cada um, não "para a diretoria". Se a diretoria quisesse saber o que está sendo feito *on a daily basis*, não estaríamos sem processo algum, certo? E se ela **quer** saber disso, então estamos diante de um caso claro de *micromanagement* e encorajo a todos a irem embora o mais rápido possível. Novamente: você não é obrigado a nada. Mas a minha experiência pessoal é a de que, realmente, limitar essas reuniões a **15 minutos** tem sido o ideal. Reunião, afinal, **é o trabalho que mais me cansa** e não faz sentido começar o dia com muito tempo de reunião. Queremos ajudar, afinal, não atrapalhar. "*Mas... mas... e se minha equipe tem 30 desenvolvedores?*". Para isso minha resposta é "**não, não existe equipe de 30 desenvolvedores**. Equipes tem no máximo 12 pessoas e mesmo estas geralmente estão realmente dividias em outras duas ou três. Metodologias ágeis, lembre-se, **são sobre aceitar a realidade**. E a realidade é que não tem como 30 programadores estarem trabalhando numa mesma coisa. Se você **acha** que isso está acontecendo, eu **acho** que você é bem louco. (Mas, novamente, quem sou eu?...) Digo isso porque **a daily é da equipe**. Não é do departamento, tampouco da diretoria. Não permita que *managers* participem desta reunião ativamente. De preferência, nem como ouvintes. Isso tira autonomia da equipe. Ademais, descubra qual é, afinal, o tamanho **real** de cada equipe e já faça as divisões necessárias, seja isso temporário ou não. ### Retrospectiva Todo esse primeiro ciclo foi uma droga, certo? Certo. Todos estão meio perdidos e muitos duvidam que a coisa toda vai funcionar. Tudo certo. É assim mesmo. Tudo está de acordo com os planos, mesmo sem você perceber (sinto-me meio Palpatine falando isso). Agora chegou a hora de identificar o que deu errado e terminar com uma lista de como melhorar. As tarefas eram muito grandes? Vamos aprender a dividir melhor. Não ficaram claras? Vamos adotar alguma técnica que ajude nisso. Subestimamos o trabalho e não conseguimos concluir? Vamos tentar estimar melhor. Faltou trabalho no fim do ciclo e ficamos puxando coisas do *backlog* sem muita ordem? Então vamos deixar já uma fila razoavelmente ordenada. E por aí vai. Importante lembrar que não conseguir concluir todas as tarefas propostas não deve ser motivo de frustração, apesar de sempre ser. É assim que a coisa funciona, mesmo, e é um consolo saber que pelo menos agora é possível identificar claramente o que foi feito e o que ficou faltando. A reunião de retrospectiva é mais importante do que a de *grooming* e, portanto, minha recomendação é que seja dedicado a ela **2 horas** para cada 1 semana de ciclo. Se seu ciclo é de 2 semanas, o *time box* da retrospectiva é de 4 horas. E o conselho permanece: não pire. O que importa é conseguir identificar **como melhorar**. E não se confunda: não é para listar o que saiu errado. Isso tem pouco proveito prático. Faça uma lista de pontos de **ação**. ## Métricas A única métrica que acredito ser **realmente relevante** é a porcentagem do tempo que é gasta com **desvios**. Um desvio acontece quando o programador precisa parar de fazer o que foi definido na reunião de *grooming* para fazer alguma outra coisa, **qualquer que seja**: corrigir bugs, participar de reuniões, treinar funcionários novos, etc. Exceto coisas pessoais, como visitar o médico. **Isso** não é "desvio". Desvio é quando a empresa desvia o funcionário do que foi proposto inicialmente. E essa métrica é relevante porque, no fim do ciclo, ajuda a entende por que talvez a equipe não conseguiu entregar tudo o que planejava e serve de bom argumento para a equipe demandar mudanças no próprio processo. "*Gastamos metade do nosso tempo corrigindo bugs que poderiam ser evitados com testes automatizados*", por exemplo, é um fato que traz à tona uma necessidade clara e um ponto de ação objetivo (que é aumentar a cobertura de testes, no caso). ### E o que dizer para a diretoria? **Nada. Apenas entregue**. Que a equipe busque adquirir ritmo para que se consiga **mostrar** muito mais do que falar, mas absolutamente não recomendo que qualquer "métrica" vaze para fora da equipe, por "melhor" que seja. Repito: números não tem significado absoluto, mas na falta de visão mais clara, eles acabam servindo de confortável **muleta** para a diretoria tirar as conclusões mais bizarras possíveis. Não me entenda mal: não estou defendendo **não ter** métrica alguma. **Tenha** os números, mas não permita que eles trafeguem pra lá e pra cá **sem o devido contexto**. Acompanhados eles são ótimos, sozinhos são um perigo. Ademais, resultado concreto mesmo provavelmente só aparecerá no segundo mês. Não adianta nada usar N ferramentas e seguir M cerimônias se a **mentalidade** das pessoas à volta também não mudar. O objetivo, no fim, é **diminuir o caos e a incerteza**, e a primeira certeza que se tem é que as engrenagens que por tanto tempo estavam simplesmente paradas vão demorar, sim, algum tempo para rodarem com suavidade e devidamente lubrificadas. # Resumo Há uma infinidade de detalhes que apenas um trabalho sério de consultoria poderia trazer à tona, mas a visão geral é mais ou menos essa. Considerei neste artigo equipes sempre maiores do que 3 pessoas. Se a equipe **é** formada por 2 ou 3 pessoas, a dinâmica pode ser um pouco diferente e certas "concessões" ao padrão apresentado **podem** ser benéficas a curto e médio prazo (coisa que em determinados nichos pode significar a sobrevivência ou morte da empresa). E, acima de tudo, meu conselho é sempre **abraçar a realidade**, por mais humilhante que possa parecer. Ficar fingindo que um plano de 2 anos será seguido sem surpresas ou que o programador consegue pegar uma tarefa "monolítica" de 1 semana e depois integrar tudo sem maiores problemas e no prazo é uma espécie de atitude esquizofrênica que não ajuda as entregas fluirem e não diminui a frustração da equipe no geral. Imaginar que é o controle estrito da diretoria e não a autonomia responsável da equipe que trará os melhores resultados também.

Curti

27 visitantes curtiram esse Item.

Anterior: Como implantar uma cultura de testes onde não há testes