Um especialista precisa saber um pouco de cada coisa

Ótimo texto para se refletir e pensar nos profissionais que conheçemos na área de tecnologia, sejam eles “especialistas” ou não. Retirado do Blog do Urubatan.

Para quem acha que o título deste post esta contraditório, lamento informar, mas você esta completamente equivocado.
Você conhece algum especialista? De preferência algum que esteja ai pertinho de você.
Se conhece por exemplo um especialista em Java ou .NET, chega pra ele e pergunta se ele conhece algum dos seguintes assuntos:

  • XML
  • Expressões Regulares
  • HTML
  • XHTML
  • Javascript
  • Modelos de Threading
  • Como funciona uma CPU
  • Para que serve um sistema operacional
  • O que é e para que serve uma “Maquina Virtual”
  • Flash
  • XSD
  • XPath
  • SQL
  • Estrutura de bancos de dados
  • TCP/IP
  • Sockets

Acredito que a resposta vai ser sim para todos, ou pelo menos a grande maior parte destes itens. E isto são só coisas genéricas, imagina se começarmos a detalhar a sopa de letrinhas existente no mundo Java EE ou no .NET.
Pois é mais ou menos isto que estou querendo dizer, um especialista precisa saber um monte de coisas para se tornar um especialista em uma delas.
A forma mais fácil que eu conheço para melhorar muito e muito rápido a qualidade do código que você escreve em uma linguagem é aprendendo outra linguagem de programação.
Tem gente que diz que o ideal é aprender uma linguagem nova por ano, e com certeza, o período da minha vida profissional que eu mais melhorei foi quando aprendi várias linguagens em um período curto de tempo.
Quando eu era mais novo (coisa de velho escrever isto :D ) o meu chefe na época disse que um especialista é alguem que sabe cada vez mais sobre cada vez menos, e que um super especialista é alguem que sabe absolutamente tudo sobre absolutamente nada …
Ach oque este conceito esta um pouco desatualizado, até por que por este conceito, um super especialista é o cara que sabe absolutamente tudo sobre absolutamente nada.

Pelo menos na minha opinião, eu espero que um especialista em Java por exemplo, consiga criar um pacote EAR padrão Java EE para uma aplicação composta por dois módulos web e três módulos EJB além de algumas bibliotecas utilizadas por todos os módulos.
Para fazer isto, o cara vai ter que conhecer no mínimo muito XML, vai ter que saber o que são meta dados, vai ter que saber quais meta dados foram definidos via anotações no código e quais ele vai querer sobre escrever com XML. Vai ter que conhecer a estrutura de um arquivo EAR, a estrutura de um arquivo WAR e qual a diferença entre um arquivo jar de uma biblioteca e de um módulo EJB.
Para entender direito o que ele ta fazendo, ele vai ter que conhecer o protocolo HTTP, por conseqüência o protocolo TCP e o IP. Além de precisar entender de RMI que é utilizado para chamada dos EJBs, RMI também funciona sobre TCP.
Se o servidor for rodar em cluster, é necessário saber como este cluster esta configurado, a maior parte dos servidores Java EE utiliza o protocolo IIOP/IP, o mesmo do corba, já que pela especificação Java EE todo EJB pode ser chamado utilizando CORBA também, e que o IIOP/IP permite roteamento muito mais fácil do que o RMI direto.
E isto tudo só para começar.
Se o especialista em java precisar também configurar o servidor de aplicações também ai aumenta bastante a quantidade de coisas que ele vai ter que saber só para poder ser chamado de especialista em Java e nem chegamos na parte de desenvolvimento ainda …
Claro que isto ainda é só a minha opinião, mas para ser um especialista em java, o cara tem que saber muito bem Orientação a Objetos, Reflexão, Refactoring e mais Refactoring, AOP, a diferença entre excessões checadas e não checadas, para que serve cada tipo de collection, todas as classes no mínimo dos pacotes java.lang e java.util e mais um monte de outras coisas.

Só para finalizar.
Vocês não vão conseguir se tornar especialistas em nada da noite para o dia. Isto vai demorar bastante, e mesmo que você queira ser especialista em .NET por exemplo, você vai ter que estudar muitas outras coisas.
A pior coisa que tem é programador bitolado que acha que a única linguagem/ferramenta/time/religião que presta é a que ele conhece agora …
(isto foi um misto de dicas com desabafo :D )

Java vs .NET – Parte 2

Achei esta discussão pertinente de ser publicada aqui no blog. Para quem acompanhou a parte 1, aí vai a parte 2. Paulo Krieser mais uma vez expõe os fatos de forma clara, e dá explicações, complementando os comentários presentes no primeiro post, feito por leitores. Abaixo o texto na íntegra e retirado do Java Free. Boa leitura!

Acalorados comentaristas: esta coluna é para vocês, que contribuem para que nosso espaço fique melhor e possa nos fornecer cada vez mais informações preciosas. A idéia da coluna é justamente essa: participação.

Em um primeiro momento quero esclarecer que a idéia desta série de artigos é realizar comparações entre tecnologias da forma mais imparcial possível, para que o tomador de decisão possa escolher quais tecnologias utilizar em seus projetos.

Não existe uma tecnologia que seja melhor do que as outras: devemos sempre ter os objetivos em mente. Algumas se sobressaem em um fator, outras em outros fatores. Por isso a escolha de diversos itens de avaliação, como explicado na minha coluna Fatores para a Escolha de uma Linguagem de Programação.

Respondendo ao comentário do Vanderlei, que solicita o estudo realizado para a formulação dos gráficos que aparecem nas colunas. Conforme explicado em minha coluna Escolhendo a Linguagem: Java vs PHP, as notas atribuídas no gráfico são aproximações realizadas através de conhecimentos empíricos, da experiência que temos com projetos e através de pesquisas na internet.

A idéia não é se ter uma nota exata, e sim apenas um parâmetro de comparação indicando qual a melhor linguagem para determinado fator. Caso a informação contida no gráfico não lhe seja útil desta maneira empírica, fique à vontade para não utilizá-la.

Agora respondendo ao André Luiz Lehmann e ao Daniel: a idéia é comparar tecnologias. Talvez o melhor título para a coluna seja Escolhendo Tecnologias, mas eu não quis me deter a este preciosismo. A comparação é totalmente cabível sim, pois em muitos projetos que realizamos surgiu a dúvida: devemos fazer em Java ou .NET?

É a esta pergunta que queremos responder. Agora, mesmo sendo tecnicamente correto utilizar JEE vs .NET, ASP .NET vs Java ou JSP vs ASP, isto não desqualifica o artigo, devido ao propósito comparativo dele. Eu posso não ter utilizado as siglas com a precisão máxima, mas a comparação entre as tecnologias é totalmente cabível para um gestor tomar a decisão.

Jair: boa colocação, porém discordo em um ponto: o que percebemos no mercado é que o .NET acaba sendo mais rápido para desenvolver, mesmo o Java possuindo estas IDEs que você mencionou. Em uma grande parte dos casos, quem trabalha com .NET trabalha com o Visual Studio (versão paga), aproveitando suas funcionalidades RAD ao máximo. Já quem trabalha com Java normalmente não usa o IntelliJ, por exemplo.

Gabriel: não esqueci o Mono, ele está citado no terceiro parágrafo.

Agradeço ao Rogério Moraes de Carvalho pelo grande post, que demonstra uma certa consistência, embora apresente parcialidade. Concordo plenamente que a defesa não pode ser por paixão por determinada tecnologia, e sim por métodos objetivos.

Conforme comentei ao André Luiz Lehmann e ao Daniel, e vou comentar novamente, a idéia não é se conter aos preciosismos e discussões filosóficas se ASP é uma linguagem de programação ou se é apenas uma tecnologia, e sim realizar a comparação entre as possíveis tecnologias (ou plataformas) que podemos utilizar em um projeto.

Em um ponto Rogério, concordo com você: fui tendencioso em apenas este ponto, onde digo que nada na Microsoft é open source. Este ponto está enfático demais, porém não deixa de salientar a iniciativa monopolística da Microsoft. Todos sabemos que a Microsoft já sofreu processos em relação a isto.

Além disto, cometi um erro ao escrever Win32: eu quis dizer “plataforma Microsoft”. Obrigado Rogério pela correção.

Suportar diversas linguagens diferentes realmente pode causar mais caos e diminuir o quesito manutenabilidade. Por que temos padrões de projeto, melhores práticas e restringimos os desenvolvedores a utilizar o framework do projeto? Isto enrijece a estrutura, porém traz ordem. Este é o objetivo de se utilizar um padrão.

Claro que podemos utilizar apenas uma linguagem na plataforma .NET, porém ela permite utilizar várias, o que aumenta o RISCO de se aumentar a entropia do sistema. Utilizando um padrão fechado, com apenas uma linguagem e um framework, restringimos esta hipótese e diminuimos o risco de causar caos.

Em relação ao comentário do Rogério sobre conteúdo disponível, o que acontece é o seguinte: a plataforma JEE (às vezes a chamo simplesmente Java para fins de simplificação) possui muito mais tempo de mercado do que o .NET e mais programadores utilizando.

É mais utilizada em universidades, e devido a estes fatores o conteúdo na internet é maior do que o conteúdo disponível sobre as tecnologias Microsoft, o que facilita a curva de aprendizado. E veja que coloquei “a principal fonte de conteúdo é o MSDN”, e não a única fonte de conteúdo.

Conforme comentei em todas as colunas desta série, não sou apaixonado por nenhuma tecnologia específica. Minha intenção é fazer uma análise imparcial e objetiva, sem tendências, o que me faz discordar com a opinião do Rogério, que diz que fui “extremamente tendencioso”. Esta é uma opinião pessoal dele, que respeito, mas discordo impreterivelmente. O artigo possui embasamento técnico, teórico e empírico através da experiência que temos com o desenvolvimento de projetos. Queremos ser produtivos e atender ao máximo as demandas dos clientes, independente da tecnologia utilizada. O objetivo não é provar que algo é melhor, e sim atender bem aos clientes de acordo com os requisitos levantados.

Espero que esta série de artigos esteja ajudando a desenvolvedores, arquitetos e tomadores de decisão a conhecerem outras tecnologias e a fazerem suas melhores escolhas, pois este é o intuito do artigo.

Java vs .NET

Uma “eterna” discussão. Mais uma vez prevalece a máxima: qual a melhor? A que melhor se adequa a sua realidade. Um post bem escrito e esclarecedor. Merece leitura. Retirado do site JavaFree.org.

Escrito por Paulo Krieser:

Prosseguindo com a sequência de colunas sobre as comparações entre linguagens de programação, neste artigo vamos comparar o Java ao .NET.

Antes que sigam as críticas, cabe esclarecer que o .NET não é uma linguagem, e sim uma plataforma da Microsoft que permite a utilização de diversas linguagens, como C#, Visual Basic, J# e ASP. Vamos focar então a comparação na construção de aplicações web, utilizando J2EE e o framework ASP NET da Microsoft, que é onde as duas linguagens mais competem.

Comecemos pela questão das licenças de uso, que influenciam diretamente no TCO (para referência aos fatores sendo comparados, consultar na minha coluna Fatores para Escolha da Linguagem de Programação). Apesar da Sun deter a marca Java, a mesma tornou a linguagem open source, permitindo aos usuários efetuar alterações convenientes. Para a plataforma .NET, existem algumas iniciativas free, como os projetos Mono e DotGNU. Porém, para se aproveitar todo o potencial da plataforma, é praticamente necessário se adquirir o servidor Microsoft juntamente com o ambiente de desenvolvimento Visual Studio. Sem estas ferramentas, além de não se aproveitar tudo o que se tem, a velocidade de desenvolvimento fica fortemente prejudicada. Além disto, nada na Microsoft é open source.

No item escalabilidade, as implementações das duas plataformas provêem mecanismos de balanceamento de carga, permitindo habilitar um cluster de máquinas para servir às cargas dos usuários que forem aumentando ao longo do tempo. A grande diferença entre o J2EE e o .NET é que desde que o .NET suporta apenas Win32, um número maior de máquinas se faz necessário, comparando ao J2EE, devido às limitações dos processadores.

Em um fator de extrema importância, como velocidade de desenvolvimento, o .NET leva grande vantagem. A sua IDE proprietária, o Visual Studio, é baseado em RAD (Rapid Application Development), aumentando a agilidade na construção de aplicações. O Visual Studio .NET inclui várias ferramentas interessantes em termos de produtividade, como por exemplo o Web Forms. Estima-se que um projeto criado do zero, leve-se de 10% a 20% menos tempo para entrar em produção quando desenvolvido em .NET.

O Microsoft .NET oferece independência de linguagem, permitindo os componentes serem escritos em VB.NET, C# e J#, por exemplo. Para fazer isto funcionar, o código-fonte nestas diferentes linguagens é traduzido para um código intermediário (análogo aos bytecodes do Java) chamado Microsoft Intermediate Language, abreviado IL. O Common Language Runtime (CLR), análogo ao JRE (Java Runtime Enviroment) do Java, interpreta o IL e traduz em código de máquina.

Com um conjunto de linguagens rodando sobre a plataforma .NET, os desenvolvedores diminuem a habilidade de compartilhar as melhores práticas, diminuindo a assertividade do compartilhamento de informações. Assim, especula-se que um conjunto de linguagens rodando em CLR pode levar a uma combinação de código espaguete que fica difícil de manter. Com a liberdade para se utilizar diversas linguagens, a aplicação torna-se mais complexa, necessitando de experts em diferentes linguagens, o que também faz aumentar o TCO e a entropia do sistema.

As duas tecnologias apresentam uma curva de aprendizado parecida, com a diferença de que o Java possui mais material para aprendizado na internet do que o .NET, que é proprietário e a principal fonte de conteúdo é o MSDN.

Analisando o último quesito, portabilidade, praticamente não há o que comparar. Como já dito na coluna anterior, o Java segue o princípio write once, run anywhere, permitindo executar as aplicações na virtual machine em praticamente qualquer ambiente. O .NET roda apenas no Windows, no seu hardware suportado, e no ambiente .NET. Há algumas implementações adicionais do .NET que rodam em outras plataformas, porém que não permitem o uso de todo o potencial do framework.

Concluindo a análise, a plataforma J2EE, possuindo uma interoperabilidade melhor, permite mais facilmente integrações com o legado através de web services e JCA (Java Connector Architecture) e uma maior facilidade de portabilidade, podendo rodar em qualquer sistema operacional. A grande vantagem do .NET é a sua incrível ferramenta de desenvolvimento, que incrementa bastante a velocidade na construção de aplicações. Porém, esta vantagem apresenta o custo das licenças de uso e de se ter uma plataforma proprietária e fechada, seguindo a iniciativa monopolística da Microsoft.

Para a escolha de qual tecnologia utilizar, deve-se analisar o que já se tem de legado e os skills da equipe que irá trabalhar no projeto, aproveitando os conhecimentos já existentes nas linguagens.