Na minha palestra do TechEd falei bastante de arquitetura, e citei que há um teste para o qual não conseguimos escrever testes unitários. Você adivinha qual?

O teste do tempo.

Não há testes unitários para testar quanto tempo uma aplicação vai sobreviver. Uma das principais responsabilidades de um arquiteto de software é fazer com que a aplicação sobreviva o tempo esperado. E ele tem que fazer isso com as restrições impostas pelos outros requerimentos, como os requerimentos de negócio, e também os técnicos, como escalabilidade, extensibilidade, confiabilidade, e por aí vai. Não é tarefa fácil.

Sobreviver ao teste do tempo significa fazer uma aplicação que é útil ao longo de todo o seu tempo de vida, e que paga seu investimento ao longo de todo seu ciclo de vida, ou seja, que dá ROI. De nada adianta fazer uma aplicação que atende todos os requisitos de negócio, se ela custa mais do que o usuário quer pagar (ou usuários). Temos que conseguir nos equilibrar nesta relação de custo benefício. A palavra chave para isso é produtividade. Temos que ter produtividade durante todo o ciclo de vida da aplicação. Como conseguir isso?

Vamos analizar o que acontece no modelo mais difundido no mercado: o famoso "sair fazendo". Nesse modelo a equipe "sai fazendo" o código, sem se preocupar com boas práticas de desenvolvimento ou arquitetura.

Lembro bem daquelas demos no começo do ASP.Net, em que o palestrante arrastava uma tabela do Server Explorer para a página ASPX, e aparecia o datagrid, com os objetos de acesso a dados, todos já funcionando, paginando o grid, etc. Todo mundo ficava embasbacado, e o palestrante, propositalmente ou não, não contava que aquilo era demoware, ou seja, não era para ser usado em uma aplicação de verdade (e séria, e profissional). E muita gente usou. Qual o resultado? Uma altíssima produtividade, não é verdade? Claro que é, desde que você olhe para o curto prazo. No Teched usei um gráfico para representar essa atitude de trabalhar de qualquer jeito, sem boas práticas. Vamos olhar ele, só que só o seu começo:

Sem boas práticas, só o começo

Ele está cruzando produtividade com tempo. Temos então uma produtividade de 15, logo de início.

Esse é o gráfico com boas práticas:

Com boas práticas, só o começo

Temos uma produtividade de seis, ou seja, menos da metade da produtividade do gráfico anterior, que trabalha sem boas práticas.

Observação: antes que você me pergunte "Seis o quê?", respondo: seis qualquer coisa. Imagine que este número está na sua métrica, ou seja, se você trabalha com pontos de caso de uso, então são 6 dias para um UCP (ou horas, ou sei lá), se você trabalha com análise de ponto de função, então são 6 dias para um ponto de função (ou meses, sei lá), se você trabalha com user stories, então são 6 horas por story point (ou dias, sei lá). Imagine que o número é uma medidade de entrega versus tempo, ok? Na prática não estou exibindo produtividade, mas taxa de entrega, mas a maioria das pessoas prefere o nome produtividade.

Os mais atentos já perceberam a essa altura uma pequena diferença nos gráficos. O primeiro está decrescendo, o segundo está estável. Vamos ver o primeiro gráfico completo:

Sem boas práticas

A produtividade cai devagar por algum tempo. No meio do projeto ela cai vertiginosamente para 3, e fica por lá. E três é menos do que seis, certo? Quem nunca viveu isso? O projeto começa, tudo anda rápido, os prazos do nosso belo cronograma waterfall no MS Project são todos batidos, a previsão de entrega do projeto é até antecipada. Até chegarmos a uns 30% ou 40% do projeto, e tudo se enrola. O gerente do projeto volta o prazo original, de repente o prazo orignal é ultrapassado um pouco, e em pouco tempo o projeto está atrasado vários meses. Acontece o tempo todo, acontece em todo lugar.

Agora vejam o gráfico com boas práticas, completo:

Com boas práticas

Ele se mantém estável ao longo de todo o projeto. Qual a minha entrega? É a área debaixo do gráfico. Basta somar os valores para entender a entrega com uma abordagem e com a outra. 
No primeiro temos:  15+14.5+13.5+12.5+3+3+3+3+3 = 70.5
No segundo temos: 6*9 = 54

A primeira vista, temos uma produtividade maior no primeiro caso. Essa primeira vista é responsável por essa ilusão de que sair fazendo é uma boa idéia, e de que não temos tempo para sermos profissionais e trabalhar como engenheiros de verdade.

Vamos continuar nossos cálculos. Suponhamos que estas sejam semanas de desenvolvimento, e que o projeto se prolongue por 6 meses (24 semanas). Qual o resultado?
No primeiro temos: 15+14.5+13.5+12.5+3*20=115.5
No segundo temos: 24*6=144

A entrega nesse caso é 25% maior. Se o projeto se estender por um ano esse percentual dobra. O que isso significa?

Significa que temos um processo que entrega mais valor que o outro. Após os primeiros quatro períodos, entrega o dobro do valor. Por quanto tempo você quer valor? Por um pequeno e ilusório começo, ou por todo o tempo?

Esses números são apenas exemplos. Os números reais você vai ter que medir na sua equipe. Quando for fazer isso, além de somar o tempo do desenvolvedor fazendo o sistema, some também o tempo gasto em resolução de bugs que ninguém consegue resolver, problemas encontrados em produção, horas das equipes de DBAs, servidores, conectividade, segurança, horas de gestão, e por aí vai. Isso sem nem falar do stress. É possível você encontrar números ainda mais expressívos do que os que estou propondo por aqui. Mediu isso? Volta aqui e me conta, quero saber.

É claro que não é fácil para uma equipe realizar uma taxa de entrega estável. A equipe precisa estar entrosada, precisa ser um time de verdade, comprometido com a entrega final. Precisa ser uma equipe com bons conhecimentos de arquitetura e engenharia, e precisa ser suportada pela gestão da empresa. Poderia dizer que um deles é programar iterações curtas, mas não vou entrar nisso agora. Há muitos requisitos para alcançar essa linha estável, e posso garantir uma coisa: nenhum deles passa por "sair fazendo".

Da próxima vez que pensar em sair fazendo, lembre-se disso. Você está criando o que chamamos de débito técnico. Você está tomando emprestada um produtividade que você vai ter que pagar no futuro. E é você quem vai ter que explicar porque aquele designer mágico do Visual Studio parou de entregar, se antes tudo funcionava. Você está desenvolvendo de maneira não sustentável, e não vai passar no teste do tempo.

Pense nisso.


Postado na(s) categoria(s) Arquitetura pelo giovanni bassi em 2 de setembro de 2009 às 03:47 | Tags:

Comentários


setembro 2. 2009 08:56
Alexandre Valente
Oi Giovanni,

O seu argumento é sólido, porém acho que existe dois aspectos que não foram considerados. Primeiro, para que o primeiro gráfico caia de 12 para 4, temos que ter alterações significativas na funcionalidade. Se ela permanecer com poucas alterações ou com alterações simples, isto não vai acontecer e ela vai permanecer com valores altos. Segundo, temos que considerar também o refactoring. Se algo foi feito de uma maneira para ser rápido e depois percebemos que teremos grandes mudanças ou que está complexo de alterar, porque não reconstruir? Aí teremos o melhor dos dois mundos. IMHO, cada caso é um caso, e pode ser que uma solução que não seja necessarimente a melhor em termos de "boas práticas" (até porque isto muda o tempo todo), pode ser a melhor em determinado contexto.

http://agvalente.wordpress.com/http://agvalente.wordpress.com/


setembro 2. 2009 09:23
Fred Policarpo
Alexandre,

Para complementar o que você disse: "De fazer mais simples e rápido e depois refatorar se necessário", ressalto a importancia dos testes unitário, de preferência testes a priori. Se seu código está com testes automatizados você poderá refatorar sem medo de estragar o que já está funcionando.

http://fredpolicarpo.blogspot.com/http://fredpolicarpo.blogspot.com/


Brazil Rodolfo
setembro 2. 2009 09:48
Rodolfo
Esses valores dos gráficos são inventados como exemplo ou vc conseguiu de uma fonte confiável?! Esse seu post tá mto tendencioso.

no site


Brazil Robson
setembro 2. 2009 11:36
Robson
Acho esse assunto polêmico....

A MS e palestrantes "vendem o peixe" da produtividade, focando nos wizards. Ninguem nunca falou em demoware. Eles explicam, o povo acha "legal" e rápido de se fazer e vão e fazem.

Se os wizards são ruins nem deveriam existir. Se estão aí, devem ter algum uso e criticá-los como "demoware" é ir contra o Visual Studio e a MS (e os palestrantes que ensinam "erradamente" que devemos usá-los).

É como dizer: "Pessoal, parem de trabalhar assim porque tá tudo errado, é um lixo!"

E eles respondem: "mas tá aqui no Visual Studio, pq nao posso usar?". Ou pior: "Mas voces mesmos, palestrantes, que ensinam a fazer assim".

Complicado....

obs. não estou defendendo os wizards, NÃO trabalho com eles. Concordo com vc, mas acho que existe um erro aí por parte da MS/Palestrantes em se posicionar qto a eles.

[]s e parabéns pelo ótimo blog

no site


setembro 2. 2009 12:44
Giovanni Bassi
Alexandre, aí que está. Escolher a solução correta para o cenário correto é uma boa prática. Isso ajudaria a garantir uma produtividade estável. Quando você para para reconstruir uma aplicação porque a arquitetura adotada foi errada, sua taxa de entrega cai. É justamente o que eu estou dizendo que acontece.
Não concordo que temos que ter alterações de funcionalidades para que o gráfico caia. Basta entrar em qualquer departamento de TI que "sai fazendo" e você vai ver como, sem mudar nada no projeto, a taxa de entrega tende a zero já no meio do projeto. O projeto se embola, porque trabalhar de qualquer jeito leva a vários problemas, como espalhamento da regra de negócio, dificuldade de definição de responsabilidades das classes, duplicação de códido, dificuldade de depuração, entre diversas outras. Esse tipo de problema não aparece nos primeiros dias de um projeto, mas aparece assim que você tem um ativo de código de tamanho razoável. Geralmente em algumas semanas ele aparece.

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 2. 2009 12:45
Giovanni Bassi
Fred,
Se você está fazendo uma aplicação testável, já está trabalhando com alguma boa prática. É muito difícil testar aplicações em que o desenvolvedor "sai fazendo". O exemplo que dei, do datagrid na página, arrastado do server explorer, não é testável. Tudo volta para o mesmo ponto...

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 2. 2009 12:46
Giovanni Bassi
Rodolfo, os valores são só exemplos, não puxei de lugar nenhum, são só uma alegoria. Porque está tendencioso? Poderia ser mais explícito?
Mas adianto: já vi isso acontecer diversas vezes.

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 2. 2009 12:51
Giovanni Bassi
Robson,
Não é verdade. Pegue as palestras do TechEd 2009, seja o brasileiro ou o americano. Você verá diversas palestras focadas em boas práticas, explicando como fazer. Conheço diversos palestrantes que avisam que é demoware, dizendo que depois deve-se trabalhar o código gerado, etc...

No caso daquelas primeiras palestras, ocorreu um pouco disso sim. Mas pegue no caso dos datasources do asp.net (que são algo que eu não gosto). Existe o objectdatasource, que permite criar uma segunda camada, e fazer as coisas um pouco melhor. Sempre os palestrantes disseram isso, só que ninguém usava, todo mundo só arrastava tabela, ligava dataset...
O Visual Studio nos permite ir muito longe no código, é uma ferramenta muito boa. Só que cada um usa como quer.

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 2. 2009 13:01
Alexandre Valente
Oi Giovanni,

Concordo que sair fazendo arrastando tabela é ruim (nem por causa da prática, mas pq pra mim as telas geradas são muito simples, quase sempre aquém do minimo necessário! Smile). Mas se vc tem uma estrutura pronta e definida, porque não? No nosso caso a gente consegue colocar uma aplicaçõa nova no ar em poucas horas, com CRUDs básicos, seguindo a estrutura nossa padrão (veja no meu blog, eu estou falando dela). E é muito melhor sair fazendo quado se trabalha em um formato agile, já que o cliente já ve (às vezes no mesmo dia) e já começa a dar feedback. Com refactors constantes, o que não estiver bom é melhorado. Claro que é necessário uma estrutura inicial, mas uma vez existente, eu não vejo problemas....

http://agvalente.wordpress.com/http://agvalente.wordpress.com/


setembro 2. 2009 14:31
Giovanni Bassi
Alexandre, sou a favor de evoluir a arquitetura conforme precisamos dela. Não acho que temos que fazer um Big Design Up Fronte (BDUF). Se você já tem alguma coisa pronta pra te ajudar, melhor ainda. Isso é diferente de "sair fazendo".
É interessante você dizer que fazer uma aplicação com CRUD básicos é simples. No entanto, o usuário nos paga para fazer uma aplicação CRUD básica? Claro que não! Eu nunca vi uma aplicação 100% CRUD básica, se fosse o caso o usuário precisava de um Access não de um sistema feito por TI.

http://unplugged.giggio.net/http://unplugged.giggio.net/


Brazil Rodolfo
setembro 2. 2009 14:43
Rodolfo
Gostei dos argumentos do Robson, e ainda complemento: Se não é pra utilizar, então pq a MS gasta tempo e esforço implementando!?
Só que eu acho q são duas coisas distintas: O design pattern "sair fazendo" e utlizar os wizards. A própria MS fala q esses wz devem ser utilizados para aplicações com baixa escalabilidade...
Aproveitando o momento: O esquema de comentário tá meio quebrado. Nao funciona no FF, e no IE6 de vez em quando..

no site


setembro 2. 2009 14:49
Giovanni Bassi
Oi Rodolfo,
É preciso arrumar o sistema de comentários... Eu já postei no FF numa boa...
Toda empresa faz software para demonstração. Se você assistir uma demo de Ruby on Rails, aquela bem inicial, também será demoware, você não faz software rails daquele jeito.
Com relação aos wizards, há alguns muito úteis. Há outros nem tanto. A questão é que a Microsoft é uma empresa de software, ela atende um anseio do mercado. É você, o profissional, que deve saber o que vai usar ou não.

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 2. 2009 18:54
Alexandre Valente
Oi Giovanni,

Claro que não, na minha experiência, CRUD não chega nem a 10% do esforço da aplicação (com o framework então, muito menos). Mas então não entendi o post. Vc disse que não dá pra sair fazendo, eu disse o contrário. Tendo uma boa infra, no primeiro dia de uma sessão agile vc já poe o site no ar, fecha uma boa parte de cruds... e já pode cair nas telas do negócio em si, de maneira interativa, liberando versões rapidamente para colher feedback logo. Isto não é sair fazendo? Talvez o que vc tenha querido dizer é não sai fazendo da maneira errada... só que, tirando alguns exemplos obvios como o do arrastar a tabela, no resto é dificil saber o que é certo e o que é errado, vai depender realmente de cada time.

http://agvalente.wordpress.com/http://agvalente.wordpress.com/


United States Rodolfo
setembro 2. 2009 20:08
Rodolfo
acho que oq o Alexandre está tentando dizer, de certa forma, é : scafolding.
Ps: Esses post de arquitetura são mto bons, apesar de gerar um pouco de polemica, o resultado é sempre bom.

no site


setembro 2. 2009 20:39
Giovanni Bassi
Alexandre,
Na verdade, eu nunca faço os CRUDs antes quando trabalho ágil. Lembrando que é o ROI do cliente que manda, geralmente não é nos CRUDs que está o maior ROI.
Mesmo quando trabalhamos com agilidade, com TDD, por exemplo, temos que prestar atenção na arquitetura. Não devemos sair fazendo. Mesmo no TDD temos uma fase de refatoração.

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 2. 2009 20:40
Giovanni Bassi
Rodolfo,
Scaffolding é legal, mas como uma base para o resto. Não dá para confiar no Scaffolding para tudo. Mas, em geral, gosto muito da idéia, desde que ela seja entendida como um primeiro passo, e não como a aplicação pronta.

Também gosto das discussões. Fazem a gente crescer.

http://unplugged.giggio.net/http://unplugged.giggio.net/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  setembro 2010  »
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in