{"id":7003,"date":"2017-12-08T12:32:41","date_gmt":"2017-12-08T14:32:41","guid":{"rendered":"http:\/\/blog.plataformatec.com.br\/?p=7003"},"modified":"2017-12-08T14:02:49","modified_gmt":"2017-12-08T16:02:49","slug":"estoques-no-desenvolvimento-de-software","status":"publish","type":"post","link":"http:\/\/blog.plataformatec.com.br\/2017\/12\/estoques-no-desenvolvimento-de-software\/","title":{"rendered":"Estoques no desenvolvimento de software"},"content":{"rendered":"
Sempre ouvi e li que os grandes vil\u00f5es da produtividade de um sistema s\u00e3o os delays<\/em> ocasionados pelo tempo de espera em filas. Tenho certeza que voc\u00ea tamb\u00e9m j\u00e1 ouviu ou leu algo sobre isso. Da mesma forma, os estoques representam uma das maiores causas de desperd\u00edcio, especialmente para a manufatura.<\/p>\n Mas, pensando em desenvolvimento de software, ser\u00e1 que as filas e estoques de demandas (qualquer item de trabalho de uma equipe de software, como hist\u00f3rias de usu\u00e1rios, bugs, etc…) se comportam da mesma maneira e trazem as mesmas consequ\u00eancias em todos os est\u00e1gios do fluxo de desenvolvimento? Ser\u00e3o essas consequ\u00eancias sempre negativas?<\/p>\n Para respondermos essas quest\u00f5es, consideremos uma equipe que trabalha com o workflow<\/em> composto pelas seguintes etapas:<\/p>\n Da lista acima, conseguimos identificar algumas etapas de filas, onde seria poss\u00edvel acumular estoques de demandas aguardando as pr\u00f3ximas etapas. S\u00e3o elas: Backlog<\/em>, Ready to Dev<\/em>, Ready to Test<\/em> e Ready to Deploy<\/em>.<\/p>\n Como ser\u00e1 que os estoques se comportam em cada uma dessas etapas?<\/p>\n Cen\u00e1rio: como j\u00e1 tinha uma ideia do que seria trabalhado pelos pr\u00f3ximos meses, o PO da equipe decidiu escrever uma grande quantidade de hist\u00f3rias de usu\u00e1rio.<\/em><\/p>\n Para este cen\u00e1rio, h\u00e1 um risco consider\u00e1vel de desperd\u00edcio do esfor\u00e7o do PO e at\u00e9 das hist\u00f3rias de usu\u00e1rio escritas, uma vez que que podem ocorrer mudan\u00e7as na estrat\u00e9gia do produto. Por exemplo, um concorrente lan\u00e7ou uma nova feature que n\u00e3o estava mapeada e decidiu-se implement\u00e1-la tamb\u00e9m. Novas hist\u00f3rias precisar\u00e3o ser escritas e outras possivelmente ser\u00e3o fechadas como obsoletas.<\/p>\n Cen\u00e1rio: o PO da equipe sair\u00e1 de f\u00e9rias nos pr\u00f3ximos dias e n\u00e3o haver\u00e1 um substituto. Nos \u00faltimos dias de trabalho antes do descanso, o PO e a equipe se esfor\u00e7aram para refinar uma grande quantidade de hist\u00f3rias de usu\u00e1rio para que a equipe trabalhasse durante o per\u00edodo.<\/em><\/p>\n Neste caso, h\u00e1 um risco maior de que os acordos entre PO e equipe, discutidos durante os refinamentos, sejam esquecidos com o passar do tempo (\u00e9 sempre melhor que esses acordos estejam frescos na cabe\u00e7a da equipe).<\/p>\n Por\u00e9m, trata-se de uma op\u00e7\u00e3o bastante interessante para que a equipe n\u00e3o sofra de starvation<\/em> durante a aus\u00eancia do PO. Al\u00e9m de ser uma op\u00e7\u00e3o melhor do que deixar as hist\u00f3rias de usu\u00e1rios na etapa anterior (Backlog<\/em>), o que poderia elevar o risco de desalinhamento entre o que era planejeado e o que ser\u00e1 desenvolvido.<\/p>\n No geral, \u00e9 importante ter bem claro quem pode tomar as decis\u00f5es do produto em caso de aus\u00eancia do PO, pois, mesmo com a ado\u00e7\u00e3o dessa estrat\u00e9gia de estoque, d\u00favidas e incertezas certamente surgir\u00e3o na sequ\u00eancia do processo. Em muitos casos, essa responsabilidade acaba ficando com algu\u00e9m da equipe de design, um facilitador do processo ou mesmo com a pr\u00f3pria equipe de desenvolvimento, que pode tomar as decis\u00f5es em conjunto.<\/p>\n Cen\u00e1rio: o respons\u00e1vel pelo QA da equipe ficar\u00e1 ausente por algumas semanas para realiza\u00e7\u00e3o de uma cirurgia. A equipe optou por continuar o desenvolvimento das hist\u00f3rias de usu\u00e1rio e deix\u00e1-las acumulando em ‘Ready to Test’ at\u00e9 o retorno do QA.<\/em><\/p>\n Para esta abordagem, como as funcionalidades n\u00e3o ser\u00e3o testadas at\u00e9 o retorno do respons\u00e1vel pelo QA, o ciclo de feedback ser\u00e1 mais longo. Isso trar\u00e1 desvantagens como:<\/p>\n As imagens a seguir apresentam a distribui\u00e7\u00e3o do lead time<\/em> das demandas da equipe imediatamente antes e ap\u00f3s as f\u00e9rias do profissional de QA (para entender melhor os gr\u00e1ficos, recomendo o blogpost do Raphael Albino “M\u00e9tricas \u00c1geis: o que Lead Time fala sobre seu projeto”<\/a>). Na primeira delas, antes do in\u00edcio das f\u00e9rias do profissional, \u00e9 poss\u00edvel ver que h\u00e1 pouca variabilidade no lead time<\/em> das entregas e pouco WIP.<\/p>\n <\/p>\n J\u00e1 ap\u00f3s as f\u00e9rias, \u00e9 poss\u00edvel perceber uma tend\u00eancia de aumento no lead time<\/em> (m\u00e9dia projetada j\u00e1 bastante acima do percentil 95%), o que deve contribuir para uma redu\u00e7\u00e3o na previsibilidade das entregas. Al\u00e9m disso, \u00e9 poss\u00edvel ver que a quantidade de trabalho em progresso tamb\u00e9m teve um aumento consider\u00e1vel:<\/p>\n <\/p>\n J\u00e1 vimos os poss\u00edveis impactos dessa estrat\u00e9gia, mas o que podemos fazer em uma situa\u00e7\u00e3o como esta? Supondo que n\u00e3o haja outro profissional de QA dispon\u00edvel para a equipe, algu\u00e9m do time pode assumir essa atividade ou, o que temos feito com sucesso em alguns contextos, a equipe como um todo pode se dividir para realizar os testes: sempre que algu\u00e9m mover uma demanda para QA, antes de iniciar uma nova, pode verificar se h\u00e1 alguma pendente de testes e j\u00e1 pux\u00e1-la. A \u00fanica sugest\u00e3o \u00e9 para que uma demanda n\u00e3o seja testada pela mesma pessoa que a desenvolveu.<\/p>\n Cen\u00e1rio: por op\u00e7\u00e3o do PO, decidiu-se que todas as hist\u00f3rias mapeadas inicialmente precisariam estar prontas para que as novas features fossem para produ\u00e7\u00e3o.<\/em><\/p>\n Neste caso, o maior impacto do ponto de vista do processo \u00e9 que ser\u00e1 preciso garantir que essas hist\u00f3rias praticamente prontas n\u00e3o criem um empecilho para que outras linhas de desenvolvimento integrem c\u00f3digo em produ\u00e7\u00e3o. De maneira geral, a sugest\u00e3o \u00e9 integrar c\u00f3digo pronto em produ\u00e7\u00e3o sempre que poss\u00edvel (h\u00e1 t\u00e9cnicas para se fazer isso sem necessariamente liberar as funcionalidades para os usu\u00e1rios, como a t\u00e9cnica de Feature Toggle<\/em>). Al\u00e9m de desbloquear futuros deploys que precisem “passar na frente” (como bug fixes<\/em>, por exemplo), essa estrat\u00e9gia ainda permitir\u00e1 que os deploys sejam mais tranquilos e sem grandes riscos.<\/p>\n Do ponto de vista de produto, e considerando o Cost of Delay conforme nos apresentou o Lucas Colucci em seu blog post “Quanto a empresa perde financeiramente quando o projeto atrasa?”<\/a> sobre o assunto, \u00e9 sempre interessante disponibilizar as novas features para o cliente, mesmo que todas as features planejadas no escopo de um projeto n\u00e3o tenham sido finalizadas.<\/p>\n Um outro cen\u00e1rio muito comum, especialmente em equipes maiores, \u00e9 o da exist\u00eancia de janelas e filas para deploy. Geralmente, essa estrat\u00e9gia \u00e9 adotada quando: Essa burocracia para o deploy (hor\u00e1rios pr\u00e9-definidos, dias da semana permitidos, comit\u00eas para decidir o que vai e o que n\u00e3o vai pro ar…) contribuir\u00e1 para atrasar a entrada das novas funcionalidades em produ\u00e7\u00e3o. Para reverter esse cen\u00e1rio, o ideal \u00e9 investir em cobertura de testes e em automa\u00e7\u00f5es em geral (tanto da execu\u00e7\u00e3o dos testes, quanto de deploy\/rollback), o que far\u00e1 com que o processo de colocar c\u00f3digo novo no ar se torne mais simples e indolor<\/em>, tanto para quem faz o deploy quanto para quem usa o produto.<\/p>\n Em geral, as filas e estoques no desenvolvimento de software, especialmente em contextos \u00e1geis, trazem como consequ\u00eancia aumento no risco de desperd\u00edcio de esfor\u00e7o e de oportunidades de neg\u00f3cio representadas pelas demandas em estoque, principalmente as que j\u00e1 est\u00e3o mais pr\u00f3ximas de serem finalizadas e que poderiam gerar receitas para a empresa ou melhorias para os usu\u00e1rios.<\/p>\n Por\u00e9m, como vimos acima, h\u00e1 tamb\u00e9m outras consequ\u00eancias que variam conforme o est\u00e1gio do fluxo de desenvolvimento em que a demanda est\u00e1, podendo impactar na qualidade do c\u00f3digo e aumentar o n\u00famero de bugs, ou at\u00e9 evitar uma poss\u00edvel situa\u00e7\u00e3o de starvation<\/em> da equipe.<\/p>\n E voc\u00ea? Quais situa\u00e7\u00f5es j\u00e1 enfrentou com estoques e filas em suas equipes? Deixe seus relatos e coment\u00e1rios abaixo!<\/p>\n Sempre ouvi e li que os grandes vil\u00f5es da produtividade de um sistema s\u00e3o os delays ocasionados pelo tempo de espera em filas. Tenho certeza que voc\u00ea tamb\u00e9m j\u00e1 ouviu ou leu algo sobre isso. Da mesma forma, os estoques representam uma das maiores causas de desperd\u00edcio, especialmente para a manufatura. Mas, pensando em desenvolvimento … \u00bb<\/a><\/p>\n","protected":false},"author":62,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3],"tags":[123,254,257,261,264,258],"aioseo_notices":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/7003"}],"collection":[{"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/users\/62"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/comments?post=7003"}],"version-history":[{"count":9,"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/7003\/revisions"}],"predecessor-version":[{"id":7016,"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/7003\/revisions\/7016"}],"wp:attachment":[{"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/media?parent=7003"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/categories?post=7003"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/tags?post=7003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}\n
Estoque em Backlog<\/em>?<\/h3>\n
Estoque em Ready to Dev<\/em>?<\/h3>\n
Estoque em Ready to Test<\/em>?<\/h3>\n
\n
Estoque em Ready to Deploy<\/em>?<\/h3>\n
\n1. o ferramental de deploy\/rollback exige tempo e trabalho manual (frequentemente, com recursos compartilhados por v\u00e1rias equipes),
\n2. quando h\u00e1 falta de confian\u00e7a quanto \u00e0 qualidade do que est\u00e1 sendo colocado no ar (algu\u00e9m se perguntaria: ser\u00e1 que o c\u00f3digo est\u00e1 adicionando bugs?<\/em>)
\n3. ou quando h\u00e1 muitas equipes trabalhando em um mesmo produto.<\/p>\nConclus\u00e3o<\/h2>\n
\n5 Estrat\u00e9gias para otimizar o fluxo de desenvolvimento de software<\/span>
\nBAIXAR E-BOOK<\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"