\section{Processo e organização do desenvolvimento} \label{sec:process} A nossa equipe de desenvolvimento era composta por profissionais com diferentes níveis de experiência e habilidades, sendo a maioria deles estudantes de graduação de engenharia de software (a partir do 4º semestre de curso). Uma vez que os alunos não podiam dedicar muitas horas por semana ao projeto, eles sempre tiveram a flexibilidade para negociar seus horários de trabalho durante o semestre, a fim de não prejudicar a sua formação. Sua rotina de trabalho diária no projeto incluiu programação, testes e tarefas de DevOps (contabilizando 16 horas-semanais). O desenvolvimento do projeto SPB exigiu experiência avançada, que os alunos de graduação geralmente ainda não têm. Por essa razão, alguns desenvolvedores sênior se juntaram ao projeto para ajudar com as questões mais difíceis, além de transferir conhecimento aos alunos. Sua principal tarefa era fornecer soluções para problemas complexos. Como esses profissionais são muito hábeis e o projeto não poderia financiar um trabalho de tempo integral, eles trabalharam parcialmente no projeto (20 horas-semanais). Além disso, eles viviam em estados diferentes espalhados pelo Brasil, ou até em outros países, o que levou muito da comunicação a ser on-line. Em resumo, nosso processo de trabalho foi baseado em práticas de desenvolvimento de software livre e colaborativo. O processo de desenvolvimento foi definido com base na adaptação de diferentes práticas ágeis e de software livre, destacando o alto grau de automação resultante das práticas de DevOps. Assim, o processo de trabalho foi executado de forma cadenciada e contínua. Finalmente, o último grupo de participantes desse projeto foi composto por servidores públicos do MP. Todas as decisões do projeto, validações e definições de escopo foram feitas com eles. Dessa forma, desenvolvemos produtos de software de forma incremental, com lançamentos alinhados aos objetivos estratégicos do negócio. O projeto tinha muitos perfis diferentes de \textit{stakeholders} que tinham de ser organizados e sincronizados. \subsection{Organização da equipe} Aproximadamente 70\% das equipes de desenvolvimento foram compostas por estudantes de engenharia de software da UnB e que trabalharam fisicamente no mesmo laboratório. Cada aluno tinha seu próprio horário baseado em suas aulas, o que complicava a implementação da programação em pares. Os desenvolvedores sênior tentavam sincronizar sua agenda com os alunos em sua sub-equipe. Para lidar com esse ambiente, tivemos algumas regras básicas que guiaram a organização do projeto: \begin{enumerate} \item As aulas têm alta prioridade para estudantes de graduação; \item Trabalhe em pares sempre que possível (local com os demais estudantes ou remotamente com um sênior). \item Deve haver uma manhã ou uma tarde por semana quando \emph{todos} deverem estar juntos fisicamente no laboratório (exceto, é claro, os membros da equipe remota, mas que estarão on-line). \item A cada 2 ou 3 meses, os desenvolvedores sêniores (residentes no Brasil) trabalharia presencialmente ao lado dos alunos por uma semana. \end{enumerate} Com as regras acima, dividimos todo o projeto em quatro equipes diferentes: Colab, Noosfero, Design e DevOps. Cada equipe tinha um líder (\textit{coach}) responsável por reduzir o problema de comunicação com as outras equipes e ajudar os membros a se organizarem da melhor maneira para todos (sempre respeitando seu tempo de trabalho). O \textit{coach} sempre foi um dos alunos que trabalhava como desenvolvedor na equipe com o dever extra de registar as tarefas atuais desenvolvidas na iteração (\textit{sprint}) e com a responsabilidade de conversar com outras equipes. É importante salientar sobre a alta rotatividade da equipe e do \textit{coach}, pois durante o projeto muitos alunos mudaram de equipe para tentar ter diferentes experiências em diversas áreas/tecnologias, além daqueles alunos que naturalmente foram se formando. Uma característica das equipes foi a presença de (pelo menos) um sênior por equipe. Isso era essencial, porque as decisões difíceis e os problemas complexos, geralmente, foram resolvidos ao consultá-los. Essa dinâmica incentivou os demais alunos a terem o mesmo compartamento do \textit{coach} mesmo sem serem. Por fim, os desenvolvedores sêniores trabalharam diretamente com os alunos, e isso foi importante para dar ao graduando a oportunidade de interagir com profissionais experientes em sua área, além de manter o conhecimento no projeto compartilhado entre as equipes. Por fim, tivemos ainda dois últimos elementos da organização da equipe que foram essenciais para a harmonia do projeto: o \textit{meta-coach} e os professores. O primeiro era um engenheiro de software recentemente graduado, egresso, e que queria continuar trabalhando no projeto; esses últimos eram professores que orquestraram todas as interações entre todos os membros do projeto, inclusive do MP. O \textit{meta-coach} normalmente trabalhava em uma equipe específica e tinha a tarefa extra de conhecer o estado atual de todas as equipes. Os professores e \textit{meta-coach} trabalharam juntos para reduzir o problema de comunicação entre todas as equipes (o que tornou-se mais complexo conforme a evolução do volume de trabalho). Por último, todas as tarefas burocráticas, como a elaboração de relatórios sobre o progresso do projeto para o Ministério, foi tratada pelos professores, mas com o envolvimento de toda a equipe. \subsection{Comunicação e gestão das tarefas} Nossa equipe tinha muitas pessoas trabalhando em conjunto, e a maioria dos sêniores trabalhavam remotamente. Além disso, tentamos manter nosso trabalho completamente transparente para o governo brasileiro e os cidadãos interessados em seguir o projeto. Para lidar com esses casos, usamos um conjunto de ferramentas de comunicação e outras para gerenciar o projeto. Quando um aluno tinha que trabalhar em par com um sênior, normalmente, eles usavam o hangout do Google para a comunicação e eles compartilhavam uma sessão de terminal GNU/Linux com o tmate, o que lhes permitia compartilhar o mesmo editor, com ambos digitando e vendo a tela. Para perguntas e discussão rápida, usamos o IRC. Para a notificação geral, usamos as listas de discussão. Para a gestão do projeto utilizávamos o próprio Portal SPB; Primeiro para validá-lo por nós mesmos, e também porque ele tinha as ferramentas necessárias para o nosso projeto. Basicamente, criamos uma página Wiki, no Gitlab integrado ao SPB, com um mapeamento entre as visões estratégica, tática e operacional. Do ponto de vista prático, um ``milestone'' no GitLab era uma ``História de Usuário" (funcionalidade) e um ou mais ``issues'' no GitLab eram as tarefas para o desenvolvimento da funcionalidade em questão. Com essa abordagem, conseguimos dois objetivos importantes: manter toda a gestão o mais próximo possível do código-fonte e acompanhar cada funcionalidade desenvolvida durante o projeto (uma vez que nós mesmo nos tornamos usuários reais da plataforma). \subsection{Acompanhamento e gerenciamento de projeto de alto nível} O governo brasileiro costuma trabalhar com o desenvolvimento de software de uma forma mais tradicional, diferentemente de nós que utilizamos métodos ágeis e software livre. Essa dissonância nos causou um ruído de comunicação com o MP. Foi especialmente difícil convencê-los a aceitar a ideia de escopo aberto e desenvolvimento ágil. Entretanto, depois de meses de trabalho e na medida em que os resultados foram se concretizando, em especial a entrega e implantação frequente de \textit{releases}, a resistência foi gradualmente diminuindo. Definimos níveis de granularidade das reuniões para evitar gerar demasiada sobrecarga para os membros das equipes, em especial para os alunos. Tínhamos reuniões de caráter estratégico, com periodicidade mensal, e reuniões planejamento e revisão de sprints a cada 15 dias. Na reunião estratégica, geralmente, eram definidas as prioridades estratégicas do MP, e com isso o conjunto de funcionalidades importantes para atender àquelas prioridades estratégicas. Normalmente, os professores, os \textit{coaches} de cada equipe, os \textit{meta-coaches} e alguns analistas do MP participavam dessa reunião. Em geral, discutíamos o que a equipe já produziu desde nossa última reunião e priorizámos as funcionalidades para a próxima versão. Observe que apenas parte da equipe participava dessas reuniões estratégicas, mas todos os estudantes interessados estavam convidados a participar (pois muitos estudantes quiseram passar por essa experiência durante o projeto). Depois dos encontros estratégicos com os principais atores envolvidos do MP, tínhamos um turno de planejamento com todas as equipes juntas. Nessa parte, cada equipe trabalhava junto para converter a representação dos requisitos em ``épicos da \textit{release}'' em desenvolvimento, em requisitos menores (histórias de usuário). Cada \textit{coach} era responsável pela condução do planejamento, e depois a equipe toda a registrava na página wiki do projeto (wiki fornecido pelo Gitlab do SPB). Baseado nos ``épicos'', a cada 15 dias a equipe gerava um o planejamento da iteração/ciclo de desenvolvimento (com os pequenos passos dos problemas mapeados). Para manter o MP sempre atualizado, convidávamos-os a trabalhar conosco para validar as funcionalidades em desenvolvimento. Para isso, tínhamos uma reunião a cada 15 dia. E para manter nosso fluxo de gestão de tarefas, usando a própria plataforma do SPB, especialmente o Gitlab, tínhamos: \begin{enumerate} \item uma organização com muitos repositórios para cada ferramenta integrada e sub-sistema; \item cada \textit{milestone} foi usado para registrar uma história de usuário; \item cada \textit{release} teve uma página na wiki com a compilação da reunião estratégica e o mapeamento das funcionalidades planejadas; \item para cada \textit{milestone} (história de usuário) tem um conjunto de \textit{issues} (tarefas) específicas, que também são mapeadas na wiki da \textit{release}, indicando qual dupla de desenvolvedores está trabalhando na \textit{issue} em questão. \end{enumerate} Em suma, esse fluxo de trabalho proporcionou a nós e aos envolvidos do MP uma rastreabilidade completa do alinhamento estratégico do negócio, a uma visão de alto nível de cada funcionalidade (requisito/épico), a uma visão de grão menor dos requisitos(história de usuário) até o código-fonte.