A curva do aprendizado ainda é o grande vilão sobre o aprendizado e a utilização da tecnologias Java. Muitos empresas acabam selecionando erradamente outras tecnologias devido a este fato, como se aprendizado e produtividade fossem requisitos funcionais da aplicação. Não existem dúvidas de que ter uma equipe capacitada e produtiva são fatores fundamentais para o sucesso do projeto, mas goste ou não, não fazem parte de nenhum tipo de requisito. O sistema final deve ser entregue para o cliente na tecnologia que suporte seus “requisitos funcionais e não- funcionais” estabelecido pelo escopo, independentemente da capacidade ou produtividade de uma equipe de TI. Neste post eu gostaria de apontar um dos fatores de peso que cooperam diretamente para essa grande curva de aprendizado:
A tecnologia Java que foi completamente concebida em cima de conceitos e técnicas da Engenharia de Sofware e atualmente tem evoluído o cooperado para o seu desenvolvimento.
O que acontece na maioria dos casos é que o candidato a aprender Java acaba de deparando com um mundo totalmente novo e complexo, devido à falta de uma base sólida de conhecimento sobre o assunto. Ou seja, poderíamos afirmar inversamente que se uma pessoa tem conhecimentos básicos sobre assuntos relacionados com a ENGENHARIA DE SOFTWARE, com certeza não teria muitas dificuldades para aprender as implementações que as tecnologias Java faz da mesma. Fiz uma pesquisa e coloquei abaixo uma lista de 26 conceitos atuais e necessários sobre tópicos da engenharia de software que diretamente ou indiretamente estão intrínsecos em todas as plataformas de desenvolvimento das tecnologias Java:
1. Conceitos e Programação Orientado a Objetos – OOP
2. Programação Concorrentes – Multithread.
3. Análise e Projeto Orientado a Objetos – OOAD
4. Banco de dados Relacionais – SGDB
5. Banco de dados Orientados e Objetos – SGBDOO
6. Programação Transacional Local e Distribuída – ACID
7. Linguagem de Modelagem Unificada – UML
8. Frameworks (Intrusivo/Não-Instrusivos)
9. Mapeamento Objeto/Relacional – ORM
10. Arquitetura de Software – Estilos Arquiteturais: Camadas Lógicas Distribuídas
11. Padrões de Projeto
12. Desenvolvimento Baseado em Componentes
13. Injeção de Dependência – IOC
14. Programação Orientada a Aspectos – AOP
15. Programação Baseada em POJOS
16. Domain Models
17. Domain Drive Design
18. XML
19. AJAX
20. Web Services – WS
21. Simple Object Access Protocol – SOAP
22. Arquitetura Orientadas as Serviços – SOA
23. Web 2.0
24. Rich Internet Applications – RIA
25. Remote Procedure Call – RPC
26. Representational State Transfer – REST
A dica seria a seguinte: antes de entrar em detalhes específicos da determinada tecnologia em si, o candidato pode identificar os conceitos relacionados no contexto e procurar entendê-los de forma prévia e separada antes de entrar na programação pesada em si. Este caminho tem se mostrado muito interessante e a galera em geral tem conseguido bons resultados com isso. Bom, turma, não é necessário arrancar os cabelos achando que temos que saber tudo… acho que o ideal seria ir aprendendo conforme a necessidade aparece. Gostaria de deixar uma ótima frase do Steven John Metsker do livro PADRÕES DE PROJETO EM JAVA:
O desenvolvedor Java de sucesso é aquele que passa mais tempo lendo do que escrevendo código.
Me coloco à disposição para ajudar qualquer um que precise de dica sobre livros, materiais e links relacionados com os tópicos de engenharia de software descrito. E o post fica aberto para complementos e opiniões. Aquele abraço e até a próxima!