Marco Mendes´s Blog

Artigos, Comentários e Opiniões sobre Engenharia de Software, SOA e Tecnologias Java

Arquivo de 8 de Maio de 2008

Carreiras de Desenvolvimento em Java e .NET

O que deve saber um desenvolvedor Java, .NET ou de outra tecnologia para ter sucesso e crescimento no mercado? O senso comum é que nós, enquanto desenvolvedores, devamos saber apenas programar, conhecer algoritmos, estruturas de dados e APIs.

Infelizmente, o mundo real exige muitas outras coisas não ensinadas na graduação. Coloco abaixo alguns pontos que observo como exigências explícitas e implícitas no nosso dia e dia a partir dos desafios de projetos das nossas empresas e de empresas por todo o Brasil.

  • Conhecimentos sólidos de escrita de código. Martin Fowler, autor de renome na nossa área, tem uma frase interessante: “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”. Para termos conhecimento sólidos de desenvolvimento, devemos dominar, obviamente, estruturas de dados e algoritmos e APIs de programação. Além disso, devemos conhecer também “idioms”, testes de unidade e técnicas de refatoração. Um excelente livro, que recomendo fortemente para quem aumentar o seu conhecimento em escrita de código, é o livro Code Complete do autor Steve McConnell. Outro excelente livro nesta área é: Refactoring: Improving the Design of Existing Code, de Martin Fowler.
  • Conhecimento de Padrões. Quase nenhum problema que vivemos no dia a dia é realmente inédito. A chance deste problema ter sido enfretado e resolvido por outra pessoa no mundo é alta. Existe uma chance boa também de uma boa solução para os seus problemas terem sido documentados em padrões. Temos diversos tipos de padrões, tais como padrões de arquitetura, padrões de desenho, padrões de análise, padrões de implementação (idioms) e padrões de testes. Somente os padrões de desenho essenciais do clássico livro do Gamma (Design Patterns: Element of Reusable Object Oriented Software) somam 23. Temos mais de uma centena de padrões de arquitetura apenas nos livros (obrigatórios): Patterns Oriented Software Architecture vol. 4 (Bushman et al.), Enterprise Integration Patterns (Gregor Hohpe) e Enterprise Applications Architectures (Martin Fowler).
  • Conhecimentos de Processo de Software. Você domina algum processo de software? Dominar um processo é conhecer suas nuances, bases filosóficas e aplicá-lo na prática. Ouço com frequência pessoas que dizem usar “processos ágeis” mas desconhecem TDD (Test Driven Development) ou Agile Modeling. Também ouço pessoas que dizer usar o RUP mas ainda confundem elaboração com análise. Em verdade vejo que muitos desenvolvedores, por desconhecimento, usam o famoso processo “conserta e remenda” no seu dia a dia. Como desenvolvedores, devemos aumentar o nosso conhecimento de engenharia de software e de processos de software. Livros chave nesta área incluem: The Rational Unified Process: An Introduction, Philipe Kruchten e XP Explained, Kent Beck.
  • Conhecimentos Laterais. Conhecer profundamente de implementação e de uma linguagem é bom. Entretanto, um bom desenvolvedor deve conhecer e aplicar técnicas laterais de outras disciplinas. Exemplos incluem: requisitos funcionais e não-funcionais, modelagem de casos de uso, modelagem de dados, UML, arquitetura de software, gerência de configuração, testes funcionais, testes não-funcionais, técnicas e métricas de qualidade de software, práticas de gerência de projeto, ferramentas de desenvolvimento, técnicas de integração de sistemas, modelagem de processos de negócio, produtos para verticais tais como ERP, CRM ou HRMS; liderança técnica e práticas de gerência.
  • Pró-atividade. É importante possuir e aplicar um atitude crítica sobre as decisões do projeto. Questionar e debater as escolhas gerenciais e criar acordos ganha ganha com todo o time é a essência do desenvolvimento em time praticado e enfatizado por qualquer metodologia ágil. O papel do desenvolvedor não é apenas escrever código, mas ser uma peça central no sucesso do projeto. Com tal responsabilidade, ele não pode simplesmente reclamar de uma decisão inadequada de sua gerência e fazer as tarefas por que foi comandado para isso. Um desenvolvedor não pode se vitimizar e criar uma espiral descendente de desânimo e apatia com o o seu time. Ao invés, ele deve (junto do time) fazer o trabalho necessário e possível para o sucesso do projeto. Criar sinergia com seus pares, ambientes saudáveis e estratégias ganha ganha é fundamental para qualquer trabalho de time, especialmente o pesado trabalho de desenvolvimento de software. Como aprendi há algum tempo, o problema não são os eventos (positivos ou negativos) que ocorrem no seu projeto. A verdadeira pró-atividade vem de como reagimos e respondemos a estes eventos..
  • Comunicação. A clássica idéia do desenvolvedor que vai para o escritório, senta em sua cadeira, coloca o seu fone de ouvido e fica o dia inteiro escrevendo código como um autista é filme de ficção científica. Desenvolvedores devem se comunicar o tempo todo. Eles devem conversar diariamente com os analistas, com os gerentes e com os testadores. Eles devem conversar diariamente com os seus pares e somente após isso então conversar com a máquina. A maior parte dos problemas de projetos nascem de questões de comunicação e requisitos. Compreender profundamente o ambiente e os requisitos de projeto é papel chave para todo desenvolvedor.
  • Formação Acadêmica. Infelizmente os tempos mudaram. Uma graduação em computação significava muita coisa há 25 anos atrás. Hoje isso é apenas o começo. Um bom desenvolvedor deve investir continuamente na sua formação. Cursos de especialização, pós-graduação lato sensu em engenharia de software, arquitetura de software, redes e outros tópicos bem como mestrados profissionais, mestrados strict sensu e doutorados devem ser perseguidos todo o tempo. Além disso, certificações específicas de Java (SCJP, SCWCD, SCEA) e .NET (MCAD, MCSD, MCTS) devem ser alcançadas. Finalmente, assinar e ler revistas específicas, podcasts, newsletters e webzines bem como participar de eventos específicas e ser membro de comunidades como por exemplo o MGJUG e os .NET Raptors, entre várias outras, é fundamental para manter a empregabilidade.
  • Humildade. A nossa carreira dura em média 35 anos. A ansiedade, entretanto, nos prega peças. Devemos tomar cuidado, portanto, antes de dizermos que somos sêniores em algum assunto ou buscar atalhos profissionais. Para nos tornarmos sênior em alguma coisa, precisamos de anos e talvez décadas de trabalho em um tópico específico. Precisamos de um vasto portfólio de projetos vividos e dezenas de milhares de horas de trabalho em nosso currículo. O nosso aprendizado é lento e somente vem com o tempo, muitos erros e com a experiência acumulada. Devemos saber ter paciência e humildade para criamos uma carreira sólida enquanto desenvolvedores.
  • Foco e persistência. Ser desenvolvedor é uma carreira de longo prazo. Trocá-la por uma carreira de gerente ou analista simplesmente por uma questão monetária ou status é um erro, a não ser que a sua voz esteja em outra carreira. Felizmente, desenvolvedores agora tem a chance de serem bem remunerados por seu trabalho. Cada vez mais as empresas valorizam o desenvolvedor pelo valor agregado que ele produz ao projeto. Isso é fato e observo vários desenvolvedores que ganham mais que gerentes ou analistas. Não existe nada de errado com isso, nem existiria com o contrário. O retorno financeiro deve ser proporcional ao valor agregado trazido por cada membro do time.
  • Ética. Este talvez seja o atributo mais importante. Um desenvolvedor deve ser implacável com qualquer desvio de conduta praticado por qualquer membro de um projeto. Um desvio de conduta não é apenas desviar dinheiro. Ao invés, um desvio de conduta é entregar um produto com qualidade inadequada, mascarar um produto para ganhar tempo, trabalhar com má vontade, manipular pessoas ou simplesmente dizer “mentiras brancas” sobre a situação do projeto para um colega do time ou cliente.

Em resumo, apesar de todas as dificuldades e pressões do dia a dia, a carreira de desenvolvedor é empolgante e pode ser bastante valorosa para os que nela acreditam e investem. Recomendo os livros citados aqui (a maior parte deles traduzidos para o português) como ponto de partida de desenvolvimento técnico e as inúmeras redes sociais na Web sobre Java e .NET para aprendermos continuamente com as pessoas ao nosso redor.

8 comentários »