Borba on Software Desenvolvendo Software com Qualidade.

30Jan/101

SQL ou NoSQL? Essa é a questão

Banco de dados relacionais fazem parte da nossa vida há muito tempo. SQL e abstrações (HQL por exemplo) fazem parte da rotina de qualquer desenvolvedor de sistemas de informação. Agora, será que o domínio dessa tecnologia vai continuar prevalecendo na era da Internet?

Gigantes da Internet como Google, Amazon, Facebook, entre outros, descobriram há um bom tempo que os bancos de dados relacionais não atendem suas necessidades, especialmente as relacionadas com escalabilidade. Essas empresas investiram em outro tipo de tecnologia para armazenamento e recuperação de dados. Hoje essas soluções são conhecida coletivamente como NoSQL.

Agora vem a grande questão, para onde eu vou: SQL ou NoSQL?

Cada opção tem sua aplicabilidade, não seja dogmático (muitos nas duas comunidades são) e aproveite o que cada tecnologia tem de melhor. A única coisa que quero alertar é que a opção por NoSQL é uma realidade viável. Claro que as soluções NoSQL ainda tem que comer muita farinha para chegar a maturidade, mas podemos enxergar nisso uma oportunidade de pioneirismo. Como desenvolvedores de software temos que estar preparados, então arregace as mangas e vá ESTUDAR!

19Jul/090

Um Software de Qualidade

wordpress logoEu vou falar um pouco mais sobre o WordPress porque acho que é um bom exemplo de um software de qualidade.

Vou começar pela instalação. Para instalar o WordPress, só é necessário verificar o "Famous 5-Minute Install". Pronto. Funciona de verdade. Na verdade não é você que instala o WordPress, ele se instala sozinho, você apenas manda ele se instalar. Não dá pra engolir softwares que só para instalar é preciso ler um livro cheio de procedimentos e depois acaba dando tudo errado e você ainda tem que ficar pesquisando na internet para ver ser descobre o que aconteceu.

Um dos procedimentos que ele faz na instalação é criar a estrutura do banco de dados. Hoje em dia não é difícil encontrar um framework que facilite isso (vide Hibernate), por então não fazemos isso sempre?

Outro exemplo que vi de como o WordPress é robusto foi quando eu resolvi mudar a configuração dos permalinks. Após alterar a configuração veja o que apareceu na tela:

wp_permalink

Devido a minha escolha o wordpress precisava criar um arquivo .htaccess para atender minha necessidade, como ele sozinho descobriu que não tinha permissão de escrita no diretório, mostrou na tela as instruções detalhadas do procedimento que eu precisava fazer na mão para que os permalinks pudessem funcionar. Quantas vezes você já se deparou com algum erro desconhecido e teve que fuçar logs para descobrir qual o problema?

É verdade, Software Robusto demanda mais esforço mas devemos abrir mão da preguiça. Não podemos é abrir mão da qualidade dos softwares que escrevemos. Software frágeis acabam por consumir a falsa economia no desenvolvimento porque geram um imenso custo de suporte e manutenção. Siga o exemplo do Worpress.

20Jun/094

O que não ajuda, atrapalha…

Trabalhei esses últimos dias fazendo uma otimização de uma rotina escrita em C# e que usava NHibernate. Uma das mudanças que fiz foi fazer um bulk delete de uma certa entidade. Quis o destino que eu encontrasse um método delete com uma assinatura que recebia uma query. Perfeito!

Fiz a minha parte:

sessao.Delete("FROM Ocorrencia WHERE ...");

Não é que o maldito NHibernate ao invés de simplesmente criar a query de remoção, executa uma query de consulta, monta todos as entidades (no caso, Ocorrencia) e depois dá delete de um por um?

Por que diabos alguém em seu juízo perfeito escreveria um método tão estúpido quanto esse? Se eu já quero apagar esses objetos porque carrega-los na memória, consumindo o meu já escasso tempo de processamento?

Fica a lição: NÃO PROGRAME POR COINCIDÊNCIA. Não é apenas porque um método tem a assinatura perfeita que ele vai ser a solução do seu problema. LEIA A DOCUMENTAÇÃO. Certifique-se que está fazendo a coisa certa, ou caso contrário você vai se dar muito mal.

Tagged as: , 4 Comments
18Nov/082

Aprenda direito!

people studyingCuidado quando precisar aprender uma tecnologia nova. É muito tentador ver um tutorial e achar que já sabe usar a coisa. Já cansei de ver o pessoal cair do cavalo por conta disso (eu mesmo caí várias vezes). Estudar apenas o tutorial não lhe dá a base necessária para entender como aquele treco funciona e muitas vezes você vai fazer besteira por não compreender o que acontece por debaixo dos panos.

Aqui o caso em questão é o wicket. Um de nossos clientes resolveu adotar esse framework em sua arquitetura. Eles mesmo escreveram parte da aplicação utilizando o wicket e nós continuamos o desenvolvimento. A base que eles desenvolveram não era suficiente para atender todas as necessidades do projeto (nunca é), então tivemos que nos aprofundar na solução. Muitos envolvidos cairam na armadilha. Aprendem um pouco e começam a chutar e adivinhar como o negócio funciona através de tentativa e erro. NÃO FAÇA ISSO!

Agora eu mesmo estou aprendendo a trabalhar com wicket. Peguei um livro (Wicket in Action) e estou estudando TUDO. Em geral esse tipo de livro começa com um overview, passando para uma explicação sobre a arquitetura, depois vem o tutorial e depois vem seções que mostram de forma mais detalhadas suas funcionalidades. Normalmente durante o tutorial você já é capaz de implementar coisas mais simples, mas não pare por aí. ESTUDE O LIVRO TODO! Monte uma base SÓLIDA de conhecimentos. Depois de ter essa base, tudo fica mais fácil.

27Sep/087

Aprenda C

tk85
Meu primeiro computador foi um TK85. Nele eu aprendi o BASIC e comecei a programar. Logo eu percebi que o BASIC não era suficiente para fazer tudo o que queria e comecei a estudar Assembly Z80. Nessa época não tinha internet, a gente aprendia muitas coisas nos livros e revistas, mas na maioria do tempo era por tentativa e erro. Todas essas dificuldades e limitações ajudaram a formar uma geração que conhece muito bem como um computador funciona e sabe muito bem como programar. Hoje em dia, o cara que quer começar na área já começa aprendendo uma linguagem como Java, PHP, C#, Ruby, ou sei lá o que e se tornam engenheiros medíocres... Falta uma base sólida! A maioria dos engenheiros hoje em dia não têem a mínima idéia de como as linguagens e os computadores funcionam. Se você está começando, aprenda C (não precisa ser assembly). Aprendendo e usando C, você vai construir a base de conhecimentos necessária para ser tornar um bom engenheiro. Depois de ter essa base, você vai aprender qualquer linguagem com muita facilidade, se tornando um excelente programador.

11Sep/082

DbUnit x Hibernate

testingAqui na empresa, temos clientes que apenas mandam executar um projeto segundo a arquitetura definida por eles. Algumas vezes é frustante trabalhar neste tipo de projeto, afinal, nem sempre conseguimos seguir nossas convicções e utilizar plenamente nossos conhecimentos e experiência na definição da melhor solução para o problema. Em um desses projetos, fui convocado para auxiliar a equipe que estava consumindo muito tempo na implementação dos testes.

O Cenário:

O sistema utiliza EJB 2 e Hibernate 2. O cliente exige implementação de testes dos métodos da fachada utilizando JUnit e DbUnit.

Problemas:

A montagem dos cenários é complexa. O DbUnit entende apenas o modelo relacional, isto significa que o engenheiro tem que fazer um "desmapeamento hibernate" na cabeça dele para montar as tabelas e colunas com os valores necessários. Veja um exemplo:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <employee start_date="2001-01-01"
              first_name="Drew"
              ssn="333-29-9999"
              last_name="Smith" />

    <employee start_date="2002-04-04"
              first_name="Nick"
              ssn="222-90-1111"
              last_name="Marquiss" />

    <employee start_date="2003-06-03"
              first_name="Jose"
              ssn="111-67-2222"
              last_name="Whitson" />
</dataset>

Claro que esse é um modelo relacional simples, agora imagine modelos de classes complexos, com heranças, relacionamentos, etc. Neste caso, dá bastante trabalho.

Além da dificuldade em produzir a massa de dados, existe um problema muito grave. Dentro das classes de teste é necessário fazer validações contra os valores do arquivo xml (por exemplo em métodos de consulta). Neste caso podemos fazer as validações com valores hard coded, como neste exemplo:

assertEquals(employee.getFirstName(), "Jose");

Que é uma péssima idéia, pois viola o princípio DRY (Don't Repeat Yourself). Outra saída é obter os valores do xml através da API do DbUnit, que vai dar uma trabalheira danada, ainda mais se você quiser montar o objeto para fazer comparações deste tipo:

assertEquals(employeeActual, employeeExpected);

Já imaginou? Vai ter que construir outro hibernate só para pegar cada valor das tabelas e colunas do arquivo XML e remontar os objetos novamente.

Como Resolver?

O grande problema dessa abordagem é o fato do DbUnit entender apenas de tabelas e colunas. E se existisse um HibernateUnit? No hipotético HibernateUnit eu poderia especificar meus dados na forma de objetos. Além disso, poderia utilizar um formato mais legível e que pudesse ser transformado diretamente para objetos dentro do seu código. Esse formato pode ser o YAML. Veja como ficaria:

departaments:
    - &engineering
      id          : 1
      name        : Engineering
      employees:
    - id          : 1
      startDate   : 2001-01-01
      firstName   : Drew
      lastName    : Smith
      ssn         : 333-29-9999
      departament : *engineering
    - id          : 2
      startDate   : 2002-04-04
      firstName   : Nick
      lastName    : Marquiss
      ssn         : 222-90-1111
      departament : *engineering
    - id          : 3
      startDate   : 2003-06-03
      firstName   : Jose
      lastName    : Whitson
      ssn         : 111-67-2222
      departament : *engineering

Inclui um relacionamento para employee só para ficar um pouco mais rico. A vantagem dessa abordagem é que além de ficar mais legível, existem frameworks que serializam e deserializam esse formato para objetos. Com esse recurso, seria possível obter os objetos diretamente do arquivo e em seguida fazer comparações com objetos obtidos no banco. Legal, hein?

Acho que uma solução deste tipo poderia trazer muitos benefícios para o nosso problema. Estou fazendo uma pesquisa e se não existir nada semelhante, devo implementar essa solução como um projeto open source.

Pena que nosso cliente EXIGE que usemos o DbUnit.