Até mais, e obrigado pelos peixes!

16/05/2012 11:31

Clique na imagem abaixo para ler o texto completo. Agradecimento especial ao @mantov (e sua invejável habilidade na escrita de textos!).

CriticaComunidadeNET

Reverberando



Code metrics (parte 9) - Ferramentas

10/05/2012 13:15

Novamente nessa série, não falarei mais do mesmo. Sério, a Wikipedia tem uma lista de ferramentas para análise de código estático muito boa. Apenas gostaria de destacar 2 ferramentas com alguns comentários adicionais.


NDepend


É a melhor ferramenta para análise de código estático em .NET, na minha opinião, principalmente pela Code Query Language (CQL) que permite um sem fim de possibilidades de consulta sobre o código e suas métricas.

Embora não citada na lista da Wikipedia, existe uma versão do NDepend para Java (JArchitect, antigamente conhecimento como XDepend) e outra para C++ (CppDepend).


FluentCodeMetrics


Outra opção interessante é a ferramenta que está sendo desenvolvida pelo @elemarjr, o FluentCodeMetrics.

A ferramenta está em fase de desenvolvimento, isso significa que você pode participar de sua construção, contribuindo para criar algo de valor para a comunidade. Ok, filantropia não é o melhor motivo para dar um fork e ajudar. Mas você terá a oportunidade de brincar com SpecFlow, BDD, Mono.Cecil, NUnit e outras libraries transudas. 

O Elemar é um dos poucos camaradas que podemos dizer que programam pra c#$%¨&*! Então "parear" com ele em um OSS já é motivo suficiente para tornar o FluentCodeMetrics algo cool!

Bora fazer um fork e contribuir lá!

Arquitetura



Architect's roles (parte 3): Um pé no "as is" e outro no "to be"

17/04/2012 10:29

Uma das grandes virtudes do arquiteto de TI é conseguir controlar a dissonância entre o agora e sua visão de futuro. Esses dois "momentos", por assim dizer, devem ser levados em consideração em qualquer decisão relacionada a arquitetura. Chamamos a visão do agora de "as is" e a visão de futuro de "to be" (ou ainda "AS-IS" e "TO-BE").

Isso posto, espera-se que o arquiteto, a todo momento, compreenda a execução e estado da arquitetura em termos de "AS-IS" e "TO-BE". Dessa forma será possível:

  • Compreender o cenário atual contra a visão pretendida;
  • Garantir que a execução esteja alinhada com a estratégia;
  • Avaliar qual o melhor caminho a seguir à partir do "AS-IS" para chegar no "TO-BE";
  • Exercitar as possibilidades de implementação com base em arquiteturas de referência;
  • Averiguar se a visão de "TO-BE" continua válida ou precisa ser revista (arquitetura emergente)


Invariavelmente, as visões de "AS-IS" e "TO-BE" são correlatas com a percepção do que é estratégico ou tático.


Estratégico ou tático?


Para responder essa pergunta com mais profundidade, vamos antes entender o conceito de cada item.

Objetivos estratégicos são os objetivos globais e amplos da organização, definidos no longo prazo, isto é, entre dois a cinco ou mais anos pela frente.
Ex.: aumento do retorno sobre o investimento organizacional.

Além desse, temos os chamados objetivos táticos.

Objetivos táticos são os de médio prazo e que abrangem cada unidade específica da organização. São geralmente objetivos divisionais ou departamentais relacionados com as áreas de produção, finanças, marketing e de recursos humanos da organização.
Ex.: Incentivar a responsabilidade social.

E para finalizar, temos ainda os objetivos operacionais.

Objetivos operacionais são os específicos e de curto prazo voltados para a execução das operações cotidianas da organização referem-se geralmente a cada tarefa ou operação especificamente.
Ex.: Admitir dez pessoas deficientes ao ano e incentivar o consumo consciente.

Fonte:
http://www.cidademarketing.com.br/2009/ar/33/objetivos-estratgicos-tticos-e-operacionais-.html

Distinguir ações e objetivos estratégicos dos táticos advém da necessidade de termos previsibilidade, controle e referência(s). Como alinhar a execução com a estratégia se não sabemos qual é a estratégia, não é verdade?

Colocando em termos mais práticos, imagine um cenário de fusão entre duas empresas. Certamente alguns sistemas serão absorvidos, outros substituídos, possivelmente podem surgir novos sistemas. O time de arquitetura, certamente, terá um grande desafio em mãos. A coisa ficará sensivelmente complexa se adicionarmos às preocupações dos arquitetos questões como:

  • Quais processos de negócio serão afetados dentro da (nova) empresa após a fusão?
  • Quais serão os novos padrões tecnológicos adotados?
  • Como lidar com o turn-over de pessoas de forma a preservar a continuidade do negócio?
  • Como ficará o portfólio de serviços da empresa?
  • Como os atuais contratos com fornecedores serão afetados?
  • Qual o impacto geral sobre a governança de TI?
  • Quais tipos de interoperabilidades serão necessárias?

 

Você consegue perceber como o pensamento do que é estratégico/tático permeia múltiplos níveis? Note que nenhuma das questões acima considera apenas o viés técnico.

Vamos observar, dentro do cenário citado, como ficaria a distinção entre o que é estratégico/tático para cada tipo de arquiteto (papel ou cargo, não importa). Claro, o que veremos a seguir é apenas a ponta do iceberg. ;)


Para o arquiteto corporativo (papel ou cargo)


Um arquiteto corporativo pode iniciar sua definição de "AS-IS" e "TO-BE" observando como os seus building blocks serão afetados.

Building block para o TOGAF:

É qualquer potencial reusável dentro da organização, podendo ser um sistema, um processo de negócio, ativos ou até mesmo pessoas. Além disso deve ser substituível e bem especificado. Pode ser visto como um pacote de funcionalidade definida para atender às necessidades do negócio em toda a organização. Um building block pode interoperar com outros, com ou sem relações de interdependência.

Uma arquitetura é, portanto, um conjunto de building blocks retratado em um modelo e uma especificação de como esses blocos estão conectados para satisfazer os requisitos gerais do negócio. 


O rabisco abaixo ilustra (de maneira minimalista, evidentemente) a diferença entre a visão de "AS-IS" e "TO-BE" no exemplo da fusão entre empresas. Note que dentro das preocupações do arquiteto corporativo, estão, além dos sistemas, os processos de negócio.


Para o arquiteto de soluções (papel ou cargo)


Alinhado com o arquiteto corporativo, o arquiteto de soluções se preocupará em "dar a melhor solução" para as integrações entre os sistemas.

"Que tipo de tecnologias serão elencadas para resolver as integrações?" ou "Como prover a estrutura necessária para o novo portfólio de serviços?": Essas são perguntas comuns a esse papel/cargo.


Para o arquiteto de software (papel ou cargo)


Uma vez definida a solução - que estará alinhada com as definições "empresariais" - o arquiteto de software implementará os componentes, frameworks e outros itens necessários para a materialização da arquitetura.


Resumidamente, era isso!


Embora sejam parcos, os exemplos acima ilustram a importância do "AS-IS" e "TO-BE" para composição de modelos de arquitetura. Essa abordagem é tipicamente utilizada para estudos iniciais de viabilidade de implementação de uma determinada arquitetura, além de servir para realização do architecture continuum. Mas isso, é história para outro post. ;)

Arquitetura, Carreira



Code metrics (parte 8) - Relação entre testes, design e métricas

12/04/2012 13:36

Continuando a série de posts sobre Code Metrics, essa semana gostaria de trazer o resultado de uma discussão promovida via Gist.

Em suma, eu queria discutir com alguns amigos sobre a relação existente entre testes, design e métricas. Para promover o debate, elaborei um cenário para servir como background, baseado em um post que li onde o autor aplicava, na visão dele, as recomendações do Uncle Bob descritas no livro Clean Code.

Como ferramenta para a nossa discussão, criei um Gist, assim todos poderiam comentar, escrever outros códigos ou até mesmo forkar, se desejassem. Participaram da discussão (por ordem de chegada): @giggio, @vquaiato, @juanplopes, @mauricioaniche, @felipero, @ElemarJR, @tucaz e @marcioalthmann.

Fiquei muito feliz e honrado com o quórum reunido. Foi uma discussão muito boa, de alto nível (como era de se esperar dos participantes).
Smile


Vamos ao cenário


No exemplo que propus, um desenvolvedor codificou em C# uma classe que realizava cálculo de salários (veja a classe aqui). Aplicando refactoring nessa classe, ele acabou por quebrá-la em 3, extraiu e separou alguns métodos e deu outra abordagem para resolver o mesmo problema (veja o resultado aqui).

Algumas métricas foram coletadas antes e depois do refactoring. Veja os resultados abaixo.

Após apresentar esse cenário, fiz uma série de questionamentos e convidei, via Twitter, alguns amigos para colaborarem com suas percepções. Os tópicos a seguir descrevem as questões com as participações da galera. Perceba a riqueza das participações.


Questão 1 - Qual a relação entre Testes x CC?


De modo geral, podemos ter como prática que o set de testes deve, no mínimo, ter o mesmo número de testes que o resultado do indicador CC (cyclomatic complexity)? Por exemplo, se um método tem 5 de CC, ele deve ter no mínimo 5 testes escritos para ele.  

A saber:

  • estou considerando apenas um assert por método de test;
  • não considerando a eficácia do teste escrito.


Confira as respostas:

@vquaiato
5 testes talvez seja o mínimo pelos cenários de saída do método, mas existem outras combinações e outras formas de testar.

@juanplopes
Sim, no mínimo. Entretanto existem outros pontos que aumentam a complexidade ciclomática sem ela aparecer nas métricas. Um Math.Max, é um exemplo.

@mauricioaniche
Sim, concordo que CC = N, então N é o número mínimo de testes que vc deve ter. Só não testaria métodos com CC=1 e cujo código apenas repassa a invocação de método pra alguma outra classe, ou cujo método seja um getter/setter. Nesses casos, não testaria.

@felipero
Se tem 5 CC, devem ter mais testes (considerando 1 assert por teste) porque precisa testar o comportamente no sucesso e na falha, então seriam no mínimo 10 testes. Eu uso o acrônimo do Right B I C E P S para validar os casos de teste que escrevo. Veja aqui e aqui.

@giggio
Vou na do Aniche, mas acrescento que não testaria nada muito óbvio. Tentar buscar 100% de cobertura não faz sentido.

@marcioalthmann
Sim, no mínimo, quando preciso testar códigos assim geralmente verifico a cobertura de código para garantir que passei por todo lugar.


Questão 2 - Qual a relação entre Cobertura de testes x Métricas?


Membros privados podem ser ignorados nos testes? Devemos garantir os testes pelos membros públicos observando a cobertura de código dos testes. Isso é suficiente? (sem entrar no mérito da necessidade ou não de 100% de cobertura. A intenção aqui é  deduzir uma relação entre métricas - total de membros privados/públicos, por exemplo - e testes.

Respostas:

@vquaiato
sobre os testes de métodos privados, como já discuti muito no DNA, existem cenários onde são aplicáveis, principalmente se sua interface pública é muito simples e seus métodos privados englobam algoritmos mais complexos. Honestamente hoje não me preocupo com isso se minha API não é pública e é apenas de consumo dentro do próprio projeto.

@juanplopes
Membros privados, numa classe coesa devem ser sempre utilizados pelo conjunto de testes. Isto é, se um método público não utiliza um membro privado, há um problema de coesão ai, não? E se o membro privado faz operações suficientes para precisar ser testado, provavelmente você precise isolá-lo.

@mauricioaniche
Sim. Em uma classe coesa, os métodos privados no fundo servem pra diminuir a CC e aumentar a legibilidade dos métodos públicos. Eu não quero testar COMO uma classe faz, mas sim O QUE ela faz. Não vejo pq então testar um método privado diretamente.

@felipero
Precisa usar o bom senso. Não gosto de mudar a estrutura de encapsulamento somente para poder testar algo. Mas isso provavelmente será necessário para casos de testes complexos. Nesse caso há alguns frameworks que "burlam" essa proteção quando em teste, mas acho isso perigoso. Eu me conformo com isso e testo via métodos públicos mesmo, apesar de não gostar. Pode usar a cobertura de testes para aferir se tudo está testado. Mas não deve haver cobrança e nem usar isso como lei.

@giggio
Essa discussão é velha. Depende. Métodos privados são detalhes de implementação, e podem mudar. Isso não significa que eu, que implementei, não quero saber se funcionam. Então eu diria que você tem que testar no mínimo o método publico que chama o privado, e se a complexidade do privado demandar um teste, faça, oras. Esse negócio de extrair uma classe pra poder testar o método privado é bonito e tudo, mas nem sempre isso faz sentido.

@marcioalthmann
Essa depende mesmo, testo métodos privados mas ai tenho que concordar com o @juanplopes talvez tenha um probleminha em precisar testar esses caras :)


Questão 3 - Qual a relação entre Métricas x Design?


Quando, através de métricas, chegamos a conclusão que o código ficou mais complexo, é uma boa estratégia considerar LoC (lines of code) como indicador para comparar "antes" e "depois"? Que outras métricas vocês considerariam?

Respostas:

@vquaiato
e a complexidade extra adicionada para decidir quais classes filhas serão usadas? Qual métrica te revela isso? Pois a resolução de qual classe filha usar vai ter que estar em algum lugar: um componente extra, um SL, uma decisão a mais em alguma camada, etc, etc. sobre o código mais complexo, através das métricas, é complicado dizer. depende bastante do feeling de quem está lendo/escrevendo. Para alguns o código refatorado é melhor, mais extensível, manutenível, testável, etc, etc, etc. Mas ler o primeiro código é way better que o segundo. Depende então do que as métricas significam para quem trabalha nesse projeto.

@juanplopes
Não utilizo métricas somente para verificar se um código ficou ou não mais complexo. As métricas ajudam, mas isso é um fator muito subjetivo. O LOC é um dos fatores que mais enganam nesse sentido, que geralmente levam a um código menor, porém geralmente mais complexo.

@mauricioaniche
Vc tem que considerar LOC, Fan Out, CC, LCOM, Instability, # de métodos, # de atributos, e assim por diante. Não é fácil; cada uma das métricas atua em um nível diferente. Gosto muito da ideia do Erik Doenerburg (não sei escrever bem). Ele tem o Toxicity Chart, onde ele tem juntar todas as métricas em um gráfico só, e achar em uma métrica maior. Nos meus estudos de mineração de repositório de dados, uma coisa que me agrada é fazer estatísticas descritivas simples, e ver quem fica fora da média/mediana + desvio padrão, por exemplo. Acho essa uma boa maneira de analisar uma métrica.

@felipero
LoC não é diretamente proporcional à complexidade. Se considerarmos complexidade de entendimento e leitura do código, que afeta diretamente a manutenção, TCO e produtividade dos desenvolvedores, podemos concluir que isso:

return algo ? outra_coisa : null

é mais complexo para se entender do que isso:

if(algo == true) {
   return outra_coisa
} else {
   return null
}

@ElemarJR
O problema, como eu vejo é que as classes foram criadas para atender apenas um comportamento. Ao meu ver, esse "desvio" dos indicadores ficará diluído na medida em que esses objetos "ganharem corpo".. o que deverá ocorrer naturalmente.

@giggio
Sendo bem sincero, eu acho que nenhuma métrica resolveria. Trabalhar orientado a um número não garante sucesso. Estamos medindo produtos intermediários? Porque?

@marcioalthmann
Cara não sei, acho que LoC não vai ajudar a dizer que ficou mais complexo, muita linha de código simples é melhor que pouca linha de código complexo :D. E ai depende do "feeling" que o @vquaiato disse. Agora pensando... e se além de LoC considerar número de testes? Acho que nesse exemplo o número de testes para o código refatorado acabaria maior do que com o código sem refatorar.


Questão 4 - Qual a melhor "unidade" para os testes unitários?


Qual a melhor "unidade" para orientarmos a escrita de testes (de unidade, claro): método, classe, assembly, assunto de negócio ou outra? (estou falando aqui de "Testes de Unidade": qual unidade você comumente utiliza?)

Respostas:

@vquaiato
Mesmo testando "unidade" hoje eu costumo utilizar unidades de negócio e não de "engenharia". Claro que acabam existindo ambos no projeto, mas tenho procurado seguir na linha de negócio.

@juanplopes
Classe. Se você tem métodos distintos na classe que precisam ser testados isoladamente, provavelmente eles deveriam ser outra classe para manter a responsabilidade única.

@mauricioaniche
IMHO, a unidade em um sistema OO é uma classe. São classes que vc passa de um lado para o outro. CancelUpdate Comment.

@felipero
Não gosto da ideia de testes de unidade focarem em negócio. Acho que precisam testar o comportamento técnico de uma unidade de código. Eu utilizo "objetos" (classes, traits, structures, enums) como unidade. Testo cada um de seus métodos públicos. Então, tenho uma classe de teste unitário para cada classe da app (com exceção de controllers em aplicações MVC). Isso me dá satisfação suficiente em casos mais triviais.

Acho porém fundamental que esses testes de unidade que faço sejam menos prioritários em relação a testes que verifiquem as "operações de negócio". São testes que asseguram o comportamento de uma ou mais classes, de forma não isolada, para que eu saiba quando uma determinada operação, ação ou funcionalidade do sistema está funcionando. Eu faço isso independente da interface de usuário normalmente. (É aqui que testo os controllers, de forma integrada). Em paralelo, utilizo testes de selenium para verificar se a interface de usuário está se comportando de acordo. Mas para interfaces, eu gosto muito de testes manuais.

@giggio
Eu tenho uma regra pessoal: considero que um teste é de unidade se ele não acessa nada de infraestrutura, e se não cruza fronteiras lógicas de componentes, o que em .NET significa o Assembly. Eu não isolo classes de domínio umas das outras. E considero isolar classes e métodos em linguagens estáticas insano, porque dá muito trabalho.

@marcioalthmann
Classe


Se você quiser ver o Gist completo...


Basta acessá-lo aqui e ler todos os comentários. Fique à vontade para comentar também. ;)


Conclusão?


Nos próximos posts da série abordarei vários pontos oriundos do debate acima. ;)

Arquitetura



Void Podcast: episódios #017 ao #020 disponíveis!

07/04/2012 22:30

Void Podcast #017 – Strawberry Brownfields Forever
Dessa vez, vamos atolar no Brownfield! Contando com o apoio do, sempre herói dos usuários de tecnologias legadas, o mago das mazelas corporativas, o gênio do VB (em toda sua plenitude), Emanuel Gomes Brandão (@egomesbrandao), nos perdemos em um imenso campo de .. bem .. dejetos marrons indesejáveis. Nesta edição, contamos com a participação parcial do (a cada dia mais) gerente Vinícius Quaiato (@vquaiato). Que até apareceu, mas sumiu, sem despedidas e sem ressentimentos, nas (des)conexões que apenas noites de trabalho e boas conexões de internet conseguem propiciar. Há boatos que esteja perdido em algum brownfield (quem souber notícias, favor avisar). Ouça o esforço sincero do (diabético, quase atleta, Most Void Person) Elemar Jr (@elemarjr) em se solidarizar com a condição marrom dos amigos de mesa. Em um dia estranhamente bem-humorado, feliz por ser pobre e limpinho, faz piadas com quase alguma graça. Para não ficar excluído, confessou criar seus próprios brownfields.  Com a edição honrosa, digna em resgatar do atoleiro o void nosso de cada dia, do Leandro Daniel (@leandronet) – mestre também em definições insistentemente contestadas e viciado em justificativas corporativas. Descanse um pouco e relaxe ouvindo as lições de (pseudo) vida dos nossos lamuriosos heróis.

Void Podcast #018 – Guia falado de como NÃO vender ideias
Dessa vez, o tema é: “Como convencer seus colegas a adotar boas práticas”, ou ainda, “Como fazer amigos e influenciar (ou manipular) pessoas”. Tudo começa com o desabafo melancólico do Elemar Jr (@elemarjr) sobre uma dificuldade (aparentemente, só dele!!) para a adoção de boas práticas: colegas de trabalho! Em uma atitude rara, ele confessa sua ignorância e recorre a sabedoria (quase) lendária de seus amigos mais classudos e vividos. Perceba o “poder da experiência” do (reconhecidamente sábio) Leandro Daniel (@leandronet) narrando algumas de suas experiências (IMPORTANTE: algumas foram consideradas impróprias e já estão no Void proibido). Com sensibilidade digna de um “arquiteto de gente”, ele resiste as tentativas do (pragmático?) Elemar em criar receitas de bolo (furadas!) para a dinâmica das relações de poder. Também nesse void, temos a consistência intermitente do (lider natural!?) arrobinha (vulgo Vinícius Quaiato [@vquaiato]). Ele compartilha sua preocupação (quem diria!?) com a empatia e, agora gerente, dá evidências de que é mais que o rostinho bonito desse podcast.

Void Podcast #019 – Be social and be happy!
Após um inesperado hiato – envolvendo gripe, cidades alemãs, softwares de edição de áudio e dúzias de protestos via Twitter – nossos abjetos heróis retornam! E com novidades! Elemar Jr, nosso Fowler tupiniquim, assume a edição do Void Podcast! Leandro Daniel, assume os textos (tentando manter o alto nível deixado pelo seu antecessor). Descubra nesse episódio um mundo de diversão e colaboração nas redes sociais dedicadas a nerds desenvolvedores! Sim, elas existem! Ouça o novo editor do Void (@elemarjr) tirando sarro dos amigos com efeitos sonoros jocosos,  e entenda como que codificar uma engine de xadrez pode resultar em grandes amizades. Descubra como o barbudo Leandro Daniel (@leandronet) se diverte no carnaval e ainda obtém achievements raros. Divirta-se com um psicoterapêutico Arrobinha (@vquaiato), aplicando técnicas fajutas de terapia e discorrendo sobre assuntos de cunho duvidoso.

Void Podcast #020 – Literatura de banheiro e afins.
Nesse episódio nossos heróis elucubram sobre suas experiências com livros, alternando momentos de insanidade juvenil com opiniões pitorescas que lembram uma legítima senilidade. Ouça o homem dos mil livros, Elemar Jr. (@elemarjr), divagando sobre a melhor forma de gastar o seu primeiro salário. Surpreenda-se com os devaneios do barbudo Leandro Daniel (@leandronet) tentando relacionar Quentin Tarantino com Martin Fowler (ou seria Sergio Leone?). Descubra os transtornos obsessivos compulsivos que Arrobinha (@vquaiato, vulgo Vinicius Quaiato) desenvolveu em sua relação com os livros.

É possível ouvir o podcast diretamente do post (usando o player), além disso, o Void Podcast está disponível também no iTunes.

Não deixe de comentar suas opiniões.
(por que insisto nisso??? =P)

Podcasts , , ,