Category Archives: Design Patterns

Retrabalho e prejuízo

Em todos os projetos que trabalhei até hoje no mercado local [Ceará] existem profissionais mais ou menos qualificados a partir de uma base mínima de qualidade que um profissional tem que possuir dentro do modelo “Enterprisey” – que estamos acostumados e que responde pela quase totalidade dos projetos de software.

Essa base mínima eu proponho que seja – dentro do modelo exposto –  raciocínio lógico. O resto ele pode aprender.

Raciocínio lógico está ligado diretamente a noção de avaliar a situação, encontrar um padrão, investigar soluções existentes e implementar a solução, além claro de bom senso.

Não adianta pregarmos que os profissionais deveriam ser melhor escolhidos assim ou assado porque a realidade é que as empresas não tem como medir satisfatoriamente quem é ou não competente e mais cedo ou mais tarde você se deparará com indivíduos em sua equipe vindos por diversas nuances administrativas, seja aquele superqualificado cheio de títulos ou o primo do diretor da empresa.

Aonde quero chegar com essa história?

Precisamos avaliar os riscos necessários com bastante antecedência para que toda a equipe e consequentemente o projeto não sejam lesados e paguem o preço da incompetência às vezes de um único elemento. Parece óbvio? Acredite, não é!

Temos um projeto em um cliente – uma Alfândega – que precisamos refatorar todo o código criado por um determinado profissional com apenas dois ou três meses pronto. O projeto ainda está no início e já temos que refazer código.

Convenhamos, tudo bem que o código de meia hora atrás já é legado, mas código tão recente não deveria já ser refatorado sem mudança na lógica de negócio ou arquitetural. Algo muito errado aconteceu.

Mudanças não funcionais acontecem, surge um novo paradigma ou framework que reduz o tempo de desenvolvimento e convenientemente é adequado sua mudança, isso é comum durante a manutenção de um software já em produção com um meio século de uso – que em informática dura cerca de 4 ou 5 anos.

O nosso em questão não há motivos. Projeto novo, sem restrição ou adequação à “Arquitetura de Referência”, Frameworks de última milha na plataforma Java como JSF, Spring e Hibernate. Testes unitários – mas não TDD.

Como dito, separei um exemplo em código para demonstrar aonde quero chegar. Tem uma lógica bastante simples, existe um processo de apreensão de mercadorias na alfândega e liberação dessa mercadoria.

Há 3 tabelas que representam isso no modelo E/R: TB_DEVOLUCAO, TB_ITEM_APREENSAO, TB_ITEM_DEVOLUCAO. Segundo a lógica relacional, a TB_ITEM_DEVOLUCAO é uma tabela de junção entre a devolução e os itens apreendidos para indicar que item será devolvido.

Seguindo minha definição, um profissional com raciocínio lógico encontraria fácil a solução do mapeamento entre essas entidades apenas lendo a documentação, ele saberia que o Hibernate tem um mapeamento de OneToMany com Join Table Uni ou Bidirecional.

Mas não, ele criou essa bizarrice:

@Entity
@Table(name="TB_DEVOLUCAO")
public class Devolucao {

	@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinColumn(name="SEQ_ITEM_DEVOLUCAO")
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	private List itensDevolucao = 
		new ArrayList();
	
}

@Entity
@Table(name="TB_ITEM_DEVOLUCAO")
public class ItemDevolucao { //Para que essa entidade?

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="SEQ_ITEM_DEVOLUCAO", columnDefinition="NUMERIC")
	private Integer codigo;

	@OneToOne
	@JoinColumn(name="SEQ_ITEM_APREENSAO")
	private ItemApreensao itemApreensao;
	
}

Esse profissional em questão é graduado em computação, tem mestrado em uma federal, certificação como arquiteto Java e diversas outras certificações e pasme, anos de experiência em projetos. Mas não tem o básico, raciocínio lógico. Não investiga e não sabe desenvolver software de qualidade.

O código em questão pode parecer bobagem até mas isso se repete em todo o código criado por esse profissional.

Um profissional responsável em refatorar o código com apenas curso técnico e uma mísera certificação de programador java refatorou assim [como deve ser]:

@Entity
@Table(name="TB_DEVOLUCAO")
public class Devolucao {
	
	@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinTable(name="TB_ITEM_DEVOLUCAO",
		joinColumns = @JoinColumn(name="SEQ_ITEM_DEVOLUCAO"),
		inverseJoinColumns = 
				@JoinColumn(name="SEQ_ITEM_APREENSAO")
	)
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	private List itensDevolvidos = 
				new ArrayList();
	
}

Ad Hominem da minha parte? Tomar uma exceção pela regra? nada disso, eles são legião! Isso é meu cotidiano.

O prejuízo que esse profissional acarreta a todos os envolvidos é enorme e até difícil de ser mensurado porque envolve custos e humor da equipe que impacta em outros custos imperceptíveis na conta final que é a “fodisse” dos caras que tiveram que refatorar, ou seja, fizeram o seu e o trabalho alheio.

Ah, mas XP não prega o código coletivo? ir lá e consertar? Mas quebra o principal valor que é “Respeito”. Além do mais o projeto em questão seque o velho Cascata – mas culpa do cliente que exigiu ser assim, exigiu não, obriga.

Pela minha experiência de nada adianta você jogar um Clean Code nas mãos dele e pedir para estudar, ele vai continuar escrevendo nmDesc em uma propriedade ou IRepository em uma Interface. Ele foi treinado assim e sem raciocínio lógico no máximo que voce vão conseguir é retreiná-lo para conseguir comer a banana por outro túnel.

Um projeto sem um líder técnico responsável com aptidão e experiência necessária aliado a método baseado em BDUF sem um processo restritivo [como TDD] com modelagem ultrapassada com papéis de analista de sistemas “UMLizados” deixa esse tipo de profissional cometer esses pecados e prejudicar a todos os envolvidos retrabalho desnecessário.

É fácil resolver isso? É! O problema maior é que não podemos simplesmente aceitar que “o cliente quer assim”, temos um dever ético com nossa profissão de não permitir que o paciente escolha como ele quer ser operado e ceder médicos que não tenham capacidade de operá-lo.

SCEA com design patterns errados

Once upon a time

… A comunidade em volta da JCP adotou a aberração proposta pela SUN chamada EJB e o mecanismo de persistência seria uma JSR especialista chamada JDO. JDO seria a solução deifnitiva onde não importaria se você usa um txt, um xml ou um Banco de dados parrudo.

Com esse modelo de desenvolvimento foi criado um catálogo de Design Patterns[?] que serviria de “tábua dos 10 mandamentos” para a comunidade. Nasceu a prova de certificação em Arquiteto java com base nessa arquitetura.

Por fora da JCP uma turma se dedicou a criar uma forma de persistência específica para bancos de dados relacionais [Hibernate] onde não estavam preocupados se você guardava seus dados em um xml, queriam apenas resolver os problemas clássicos do mapeamento objeto-relacional. Outro pessoal jogava fora o modelo EJB e criava sua própria JEE [Spring] com técnicas e abordagens que surgiam como IoC, DI, Aspect Programming.

Com esse modelo de desenvolvimento, baseado sobretudo no conjunto de Design Patterns [PoEAA] da turma do Fowler, aposentaram o modelo da SUN apreciado pelos membros da JCP e redirecionaram o comitê para a aprovação de especificações copiadas desse outro modelo.

and they lived happily ever after.

Opa, faltaram atualizar a prova de Arquiteto Enterprisey para adequar aos Patterns corretos. Ainda leio na ementa da prova no capítulo sobre Patterns:

  • From a list, select the most appropriate pattern for a given scenario. Patterns are limited to those documented in the book – Alur, Crupi and Malks (2003). Core J2EE Patterns: Best Practices and Design Strategies 2nd Edition and named using the names given in that book.
  • From a list, select the most appropriate pattern for a given scenario. Patterns are limited to those documented in the book – Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software and are named using the names given in that book.
  • From a list, select the benefits and drawbacks of a pattern drawn from the book – Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software.
  • From a list, select the benefits and drawbacks of a specified Core J2EE pattern drawn from the book – Alur, Crupi and Malks (2003). Core J2EE Patterns: Best Practices and Design Strategies 2nd Edition.
Aonde se lê: “Core J2EE Patterns”, troquem para Patterns of Enterprise Application Architecture (A.K.A PofEAA). Sabemos que foi somente por desatenção do estagiário que ficou de atualizar a página, perdoamos esse erro primário, agora sim:
🙂

Typically chemist’s shop can sale to you with discreet treatments for various heartiness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very much complicated question. Matters, like “coupons for viagra“, are coupled numerous types of health problems. If you need to take prescription medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an hard-on. Keep in mind web-site which is ready to sell erectile malfunction drugs like Viagra without a recipe is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

Estudar para que se eu já sei o que fazer

Tenho severas críticas ao modelo educacional, principalmente o superior. Vou e volto para a faculdade de tempos em tempos, minha escola real está nos livros, a faculdade é pelo diploma porque a falta dele as vezes fecha portas que não tem como serem abertas e em determinados momentos precisam serem ultrapassadas.

Minhas críticas derivam principalmente da falácia e do sofismo, as pessoas acreditam que possuir um nível superior as credita para a qualificação necessária a uma determinada tarefa simplesmente. Quantos alunos estão se formando esse ano em Ciência da Computação sem a necessária qualificação? A maioria? Todos? Nenhum? Como saber se não existe um mecanismo eficiente de provar isso?

Na ausência de um mecanismo eficiente, o mercado sempre adota pontos factuais para basear suas contratações, e uma delas é o porte de um diploma de curso superior.

Fiz quase todas as cadeiras que envolvem desenvolvimento de software: Estrutura de dados, laboratório 1 e 2, técnicas de programação 1 e 2, lógica matemática, teoria da computação, entre outras que não lembro no momento. Em todas essas cadeiras nunca ouvi o professor(a) sequer mencionar coisas como: Closure, Currying, Continuation, Design By Contract, Actor model, Lazy evaluation, Tail recursion, Quine, Engine, Liskov substitution principle, … mais algumas coisas que não lembrei no momento …

O básico de orientação a objetos é ensinado, o aluno consegue até responder o que é herança e encapsulamento, mas eu nunca vi sequer mencionarem Orientação a Objetos Prototype-based, aí tenho que me deparar com gente dizendo que Javascript ou Lua fede porque simplesmente não entende como funciona os conceitos e acha estranho a sintaxe das linguagens.

Eu mesmo passei a faculdade inteira sem discutir design patterns, com exceção de DAO, que eventualmente pula na frente dos alunos em alguma cadeira obscura de "desenvolvimento web" (sic). Hoje um amigo estava impressionado com as recomendações que o pessoal da SUN passou sobre o GoF na caravana de ontem, e eu falei para ele que isso é naftalina, sério, se em 2007, o GoF é novidade para você, algo de muito sério aconteceu com sua formação.

Tive um professor muito bom, Hélio Moura, que usava na época a primeira edição do livro "Applying UML and Patterns"(que é de 1997 e faz portanto 10 anos) do Craig Larman, referência na época para RUP, e passou alguns princípios legais como GRASP, Law of Demeter, Open/closed principle, entre mais algumas coisas legais que não lembro agora. Mas isso foi uma exceção, e esse professor não ministra mais aulas na faculdade onde estudo. Isso era coisa de 99 ou 2000, início do milênio, vi que os professores de lá ainda usam a mesma versão do livro do Craig. Detalhe, já estamos na terceira edição e com mudanças significativas.

Agora PoEAA do Martin Fowler que é bom, voce vai passar batido, nem tenha esperança de discutir isso em sala de aula.

Domain Model? isso é anos-luz da academia brasiliana, vá estudar que é melhor. Domain Driven Design também é assunto inexistente, procure outra freguesia.

Metodologias ágeis, enquanto a academia está descobrindo XP (timidamente claro), o mercado já discute a fusão entre XP, Scrum, FDD, Crystal, DSDM. Até a Microsoft tem métodos ágeis enquanto a academia consolida UPs como novidade.

A maioria sai da faculdade monoglota, com apenas o conhecimento específico de uma linguagem de programação, enquanto deveriam estudar princípios, estão estudando linguagem. Programação funcional até pode ser vista, talves raramente em uma cadeira de calculo, ou IA (com LISP) se der tempo, alguns confundem sentenças com paradigmas, tinha um professor que falava que por a linguagem ter sentença condicional como um "IF", ela não poderia ser considerada 100% Orientada a objetos, entre outras sandices bizarras. DSL? bah!

Conversando com um amigo dia desses lá na faculdade, entramos no assunto banco de dados, sem querer surgiu no meio da discussão sobre formas normais, para minha surpresa ele disse que não sabia do que eu estava falando, achei estranho porque o professor de banco de dados 1, cadeira responsável por esse conteúdo, é um excelente professor, Fernando Siqueira, e conhecendo ele eu sabia que não passaria ninguém sem ensinar formas normais. Depois esse meu amigo voltou e falou que deu uma "olhada" no livro e "lembrou". Ora, isso me causa apreensão, mesmo eu sabendo que o professor tem a competência sobre uma matéria e tenho certeza que a aplicou, porque um aluno simplesmente esquece o principal conteúdo de uma determinada matéria?

São mistérios, mas mistério mesmo é uma menina que se forma esse ano e não sabe ainda para que serve um banco de dados, mesmo evidentemente ter cursado todas as cadeiras de banco de dados. Isso sim merece estudo, tese, trabalhos científicos e tudo que nós pudessemos descobrir.

Livros

A minha escola real são os livros, tive e tenho alguns bons professores, uns poucos excelentes, mas os autores clássicos são os mestres dos meus mestres. Não procure livro específico, procure autor, e toda a cultura por volta desse autor.

Posso indicar alguns que são a base da carreira de qualquer desenvolvedor que se preze: Alan S. Koch, Alistair Cockburn, Bertrand Meyer, Craig Larman, Eric Evans, Joshua Kerievsky, Kent Beck, Martin Fowler, Rod Johnson, Ron Jeffries, Steve McConnell, Robert C. Martin, … isso só dando uma olhadela aqui na minha "biblioteca". Sei que esqueci nomes importantes, mas se você seguir essa lista, vai acabar caindo neles.

O pior disso tudo é que o pessoal fica empolgado com título aqui, o cara virou doutor já se acha semi-deus, são praticamente inacessíveis, é muito mais facil você falar com Martin Fowler do que falar com um Doutor brasileiro.

Então voce tem duas alternativas, estudar ou frequentar a faculdade, dá para conciliar as duas, mas a preferência será sempre para o estudo, ele que pagará o leite de cada dia, aliás… leite não que esse está matando ultimamente, e ei que pensei que era a cerveja 🙂

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very much complicated matter. Matters, like “coupons for viagra“, are coupled numerous types of health problems. If you need to take prescription medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may turn on erectile malfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile disfunction drugs like Viagra without a formula is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.