métricas, como medir a qualidade e a facilidade de alguém alterar seu código

Boa noite,

Visito o GUJ a muito tempo como uma forma de consulta, mas esse é o meu primeiro post, então perdão se eu disser algo muito estupido :oops:

O caso é o seguinte, estou estudando métricas no desenvolvimento de software. E para mim ficou claro que devemos utiliza-lás ao máximo principalmente nos requisitos não funcionais…

Mas pensando na vida e nos código que crio surgiu a seguinte dúvida:

Eu desenvolvo sempre buscando seguir práticas e padrões, isso com o objetivo de tornar o meu código mais fácil de ser mantido.
Mas como medir se o que eu estou fazendo é realmente efetivo para tornar a “manutenabilidade” do meu sistema melhor?

Indo além… é claro que para um determinado sistema ou trecho de código você encontre pessoas que estejam mais habituadas com um “padrão” e por isso achem mais fácil entender um código com os padrões X do que com os padrões Y. Mas será possível encontrar(ou talvez já exista) uma medida para medirmos qualquer sistema e encontrarmos o quão fácil ele é de ser alterado?

Diversos requisitos não funcionais como a eficiência podem ser quantificados e medidos, mas o que me deixa mais intrigado é com relação a qualidade interna do sistema.
Por exemplo, no momento da compra de um sistema podemos testar se ele aguenta 10.000 requisições por segundo. Mas não seria interessante se pudêssemos testar a “facilidade” de alteração e customização? Existe algum padrão de mercado para isso?

Para tentar me ajudar a entender usei a norma ISO 9126 (que por sinal já caiu se não me engano) afim de quebrar o meu problema em partes, e esta norma define a manutenabilidade do seguinte modo:

"Manutenibilidade
A capacidade (ou facilidade) do produto de software ser modificado, incluindo tanto as melhorias ou extensões de funcionalidade quanto as correções de defeitos, falhas ou erros.
Suas sub-características são:

Analisabilidade identifica a facilidade em se diagnosticar eventuais problemas e identificar as causas das deficiências ou falhas;

Modificabilidade caracteriza a facilidade com que o comportamento do software pode ser modificado;

Estabilidade avalia a capacidade do software de evitar efeitos colaterais decorrentes de modificações introduzidas;

Testabilidade representa a capacidade de se testar o sistema modificado, tanto quanto as novas funcionalidades quanto as não afetadas diretamente pela modificação;" [copiado dá wikipedia]

Essa quebra me ajudou porque fica claro que podemos medir a estabilidade, por exemplo, pelo número de erros gerados em um BugTracker.

Mas e como medimos a Analisibilidade , Modificabilidade e a Testabilidade?

Obrigado!

Existem varias métricas que são utilizadas para prever o esforço para modificação, e para criar uma ‘base de dados histórica’:

-Linhas de código (acrdite ou não já foi usado)
-Pontos por função (mais comum)
-Complexidade ciclomática (métrica de McCabe)
-Métrica de Halstead
-UML (DIT, NOC, CBO, RFC)

Enfim… Mais adaptados para a manutenibilidade acredito que sejam as 3 últimas…
Já utilizei a ciclomática, que é basicamente o seguinte, você desenha um grafo do código, (os caminhos da execução)… e ai se usa um calculo (que não lembro),mas que conta as arestas e os nós…
Até onde sei, você mede o esforço. Analisabilidade, testabilidade, estabilidade, modificabilidade e conformidade são apenas subcaracterísticas

Esse problema (prever manutenibilidade) é o foco de estudo de muitos pesquisadores. E não temos resposta canônica ainda e acho que está bem longe de ter. Se é que seja possível ter uma resposta.

A proposito, número de linhas de código não necessariamente é uma métrica ruim.

Se dois códigos fazem a mesma coisa, um tem 3 linhas, o outro tem 30. O de 3 linhas terá muitas chances de ser mais fácil de dar manutenção.

É interessante medir o esforço com experiências passadas.
Se quer medir a modificabilidade de seu código deve primeiro obter feedback de pessoas que efetivamente modificam/modificaram o código. depois você analisa o perfil das pessoas que dão/deram os feedbacks e poderá inclusive subdividir modificabilidade em subcategorias como: “iniciante”, “intermediário”, “profissional” e “expert”.

Fica claro que existe uma diferença entre códigos considerados de fácil manutenção por experts e por iniciantes. As informações devem ser analisadas com cuidado para dar o veredito final.