Engenharia de Configuração de Software
Autor: Bruno Eugenio | Publicado: 2010-10-16T08:22:00-07:00

Pessoas, tudo bem?
Hoje eu "puxei da gaveta" um texto que já estava pronto tem algum tempo sobre engenharia de configuração. Desde quando ingressei na não tão famosa vida de "CM" (Configuration Manager) que eu preparei um texto para explicar um pouco mais dessa disciplina de engenharia de software que, com a adoção cada vez maior dos modelos de exelência de softwares (CMMi, MPS.Br), vem ganhando destaque no mercado de TI.&nbsp;

Então, para começar segue uma definição de Roger Pressman (2001):
“É a disciplina da Engenharia de Software responsável pelo gerenciamento da mudança em todo ciclo de vida do software.”&nbsp;Ao ler a definição fica a dúvida no ar: Mudança? Sim, softwares são produzidos com uma gama enorme de pessoas e em um ambiente cada vez mais descentralizado e com séries de desenvolvimento em paralelo com mudanças sendo impostas pelo consumidor ha todo tempo e sempre visando escalabilidade dos sistemas produzidos. É nesse contexto que as mudanças durante a produção e modificação dos softwares precisam ser controladas para se ter um maior rendimento das mesmas, conseguir visualizar claramente tais mudanças e também a visualização do ciclo de vida do sistema. Sendo assim, os engenheiros de configuração são os responsáveis pela harmonia entre o desenvolvimento, mudanças e paralelismo nas linhas de produção nas fábricas de software, com o dever de dar visibilidade clara dos artefatos que estão sendo gerados durante o ciclo de vida do sistema a ser produzido.
Visando o controle das mudanças, é essencial que os Engenheiro de Configuração busquem respostas para manter o ambiente de desenvolvimento conversando em uma "linguagem" comum para evitar alguns problemas comuns em times que não trabalham seguindo essa disciplina:Falta de comunicação
Sobreposição de alterações
Falta de visibilidade das alterações
Alto índice de retrabalho&nbsp;&nbsp;
&nbsp;E acredite: Esses quatro pontos citados são apenas a porta de entrada para muitos problemas dentro do time de desenvolvimento... É comum você ouvir estórias de pessoas que trabalham em times de médio/grande porte sem um sistema controlado dizendo que teve que refazer uma modificação por que o colega do lado simplesmente apagou todo o trabalho do dia dele ao terminar sua alteração em tal linha de código. Retrabalho significa stress, mais horas trabalhadas, menos lucro e aumento das chances de tal alteração dar "zebra". Em resumo, A idéia é controlar o que vem sendo feito dentro dos times, utilizando ferramentas de apoio ao controle de versão e visualização de alterações para evitar retrabalho, stress e prejuizo.&nbsp;Outro ponto importante na Engenharia de Configuração é a visualização das modificações e do ciclo de vida do sistema. para isso o SCM (Software Configuration Manager) trabalha respondendo algumas questões:Em que versão se encontra meu sistema?
Foi auditado?
Quem são os responsáveis?
É estável?
Pode parecer fácil responder a tudo isso mas, imagine você trabalhando em um sistema com 3 equipes de desenvolvimento, separadas geograficamente e com cada uma dependendo do trabalho da outra? Claro que essa é uma situação extrema, mas em pequenos times também é complicado visualizar claramente o ciclo de vida, versões do sistema e afins. É um trabalho árduo que requer paciência e habilidade para verificar junto as equipes de desenvolvimento como anda a situação de desenvolvimento, possíveis falhas e impedimentos e apoio aos times.&nbsp;
Os modelos de qualidade de Software atuais e o SCM
Com a adoção cada vez maior dos modelos de qualidade de software, o papel do SCM ganhou destaque uma vez que são exigidas das empresas que desejam tirar certificações desse tipo (ISO, CMMi e o nacional MPS.Br) habilidades da engenharia de configuração em suas fábricas.&nbsp;No caso do mais adotado dos modelos, o CMMi (Capability Maturity Model Integration) incentiva e mostra boas práticas para o uso do SCM a partir do nível 2 do processo (Gerenciado) pregando que são necessárias as visualiações, auditorias e gerenciamento em todos os passos do desenvolvimento do sistema dentro da fábrica. O CMMi não define como vai ser feito, e sim boas práticas para que seja feito o processo em questão, deixando os CMs livres para escolher como vão evidenciar os itens exigidos dentro do modelo.RUP, SCRUM e SCMQuando o assunto é metodologia de desenvolvimento de software, o SCM sempre é lembrado como um processo dentro da metodoliga RUP e o seu famoso "gráfico das baleias"Gráfico das disciplinas do RUP (Rational Unified Process) 
Veja que o esforço mostra que a preocupação do RUP com o SCM começa já na fase inicial do projeto, passando a ser mais intensa na fase de construção do mesmo, pois onde são gerados 80% dos problemas referentes a conflitos, versões e afins e vai até o sistema está rodando no ambiente de produção do cliente.&nbsp;
Já o Agile (em especial o SCRUM, que eu conheço mais) não tem uma preocupação clara com o SCM, mas isso não impede que o Scrum Master possa colocar em seu time um modelo para configuração e mudança, uma vez que sempre no final dos Sprints são gerados itens funcionais é até interessante gerar pontos de controle em cima dessas entregas para o cliente. Não é por que tem o nome de CAOS que vai ficar tudo sem controle nenhum, não é? Os engenheiros atuais devem entender um pouco do Scrum e adotar de acordo com cada projeto a melhor prática para aplicar a gerencia de configuração em seus sprints.
Sim, mas o que fazem mesmo esses SCMs?Muita coisa como deu para notar no texto! Mas é normal do SCM também entender bastante de ferramentas para controle de versão, customização de sistemas para adequação em projetos, linguagens diversas (e estranhas) de programação, automatização de tarefas rotineiras dentro da fábrica, Scripts variados em BASH e BAT, criação de Builds com ferramentas de apoio, geração de executaveis, entrega dos produtos ao cliente, instalações nos ambientes do cliente, configuração de servidores... E se a empresa for adotar o CMMi por exemplo, o CM é responsável por auditar processos, gerar Baselines da produção, liberar os Releases funcionais do sistema para o cliente e gerar evidencias dos mesmos! É uma atividade que exige dinamismo e acima de tudo, atenção. 
Ferramentas e material de apoio:São muitas, mas temos alguns clássicos indispensáveis para a execução das atividades de SCM:Mantis: ferramenta de controle de bugs em PHP mas altamente difundida e customizada para controle de atividades de projeto.&nbsp;Redmine: É um gerenciador de atividades, em Ruby on Rails, que controla atividades, tempo, gera gráficos...SUBVERSION: Subversion (ou SVN para os intimos) é a ferramenta mais utilizada para controle de versões de artefatos de projeto atualmente nas empresas, vem substituindo o CVS (Control Version System)&nbsp; e existem vários clientes para manipular o subversion como o Tortoise SVN, Ank SVN e Rapid SVN.&nbsp;Hudson: Ferramenta de integração contínua para Java. Bastante útilAnt: O nosso querido compilador de pacotes Java, faz maravilhas, traz relatórios e gera builds do sistema. Scripts BASH: o velho e bom UNIX nos brinda com o BASH (Born Again SHell) que nada mais é do que uma linguagem de programação que nos permite gerenciar o comportamento e automatizar tarefas no Unix. Sem esses scripts boa parte do trabalho dos CMs no mundo seria braçal.&nbsp; 
Com isso tudo, a principal vantagem que se ganha ao utilizar práticas do SCM em seus projetos é a garantia que o seu sistema está, no mínimo, bem versionado e estavel. Esse é o principal mote dos CMs pelo mundo.&nbsp;Até mais!!
Ps: dúvidas, sugestões e afins são sempre bem aceitos.