[youtube]http://www.youtube.com/watch?v=zu9W8AtZy7U[/youtube]
Sobre tudo isso:
[quote=utluiz]Discussão interessante e que foi bem longe. Vou dar o meu pitaco também.
Estamos atrasados em relação aos gringos?
Começando do começo, no geral os “gringos” (incluindo USA, UK, AUS, NZ, mas não limitado a estes) são sim mais avançados em termos de tecnologia do que nós. Claro, essa afirmação exige um contexto.
Primeiro, que em países desenvolvidos o acesso à tecnologia de ponto é muito mais fácil. Só para citar um exemplo básico, aqui no Brasil vai ser muito mais difícil alguém decidir desenvolver para iPhone por causa do custo do equipamento.
Segundo, países como EUA tentem a ter um mercado muito mais competitivo que o nosso. Não quero entrar em discussões políticas, mas para o bem ou para o mau, as empresas, o mercado e o trabalhador no Brasil são muito mais protegidos do que em países onde o empregador pode fazer um contrato específico com o empregado.
Obviamente aqui no Brasil temos pessoas excelentes, que certamente ultrapassam em muito o nível médio mundial do desenvolvedor de Software. Dois exemplos que posso citar estão presentes aqui nesta discussão, o Vini e o Hebert.
Mas no geral, acabamos seguindo muitas coisas de fora porque temos mais dificuldades de chegar à crista da onda. Os gringos tem mais tempo e recursos para investir em novas tecnologias, estudos e projetos. Quantas pessoas aqui tem tempo para, além do trabalho normal, fazer diversos experimentos técnicos ou humanos como os idealizadores de frameworks, metodologias e afins?
Como alguns já sabem em breve estou indo trabalhar na Atlassian, na Austrália. Já havia tentado uma vaga na Amazon em Seattle, WA, mas não consegui. O nível de ambas as entrevistas é incomparável com tudo o que já vi no Brasil. Primeiro, lá você passa, no mínimo por 4 entrevistas técnicas com vários membros da equipe. Os desenvolvedores e gerentes que me entrevistaram, todos demonstraram conhecimentos profundos em aspectos diversos. Mesmo sendo já experiente e bem fundamentado em computação tive dificuldades. E se eles encontrarem qualquer ponto negativo, mesmo que seja um perfil não compatível com a filosofia da empresa, eles vão recusar você. Note que não estou falando das pessoas que escrevem livros ou são conhecidas, são desenvolvedores “comuns”, exceto que de empresas renomadas.
Claro que existem algumas (poucas) empresas de nível mais alto aqui no Brasil, mas na maioria eles nem estão dispostos a investir tanto na entrevista, nem há candidatos o suficiente com um nível muito alto para o salário que pagam e por aí vai.
Não sei de quem é a culpa disso tudo, nem vou arriscar, mas a verdade é que por aqui vejo muita gente boa se acomodando dentro de alguma consultoria e aceitando um salário e uma função ambos medíocres, por vários motivos. Muitos são colocados no mesmo nível de outros desenvolvedores no máximo medianos. As empresas em geral também não fazem questão de diferenciar. As consultorias e fábricas de software, principalmente, estão preocupadas apenas em vender projetos e entregá-los com o menor custo, portanto não faz diferença se você é um programador júnior ou um arquiteto.
Tipos de carreira
Foi mencionado aqui a questão de ter dois tipos de carreira: gerencial e técnica. Na verdade existem muitas outras que podem e fazem parte de empresas de software, por exemplo marketing digital, design de interfaces, usabilidade e experiência do usuário, etc…
De qualquer forma, aqui no Brasil existe quase um tabu de que para crescer na carreira você precisa necessariamente virar um gerente. Muitas tem essa noção de que o bom é quem manda, o resto é ralé e peãozada.
Felizmente estou em uma empresa (GFT) que reconhece em seu plano de carreira oficial os diferentes tipos de competências. Temos 5 planos de carreiras, dentro os quais está o tecnológico, que culmina no papel do arquiteto, assim como o gerencial, o corporativo, de relacionamento com clientes e de negócios. Portanto, existem sim lugares em que você pode crescer no papel técnico sendo uma referência na sua área de expertise.
Claro que isso não é assim tão fácil. Atingir um nível de arquiteto é muito mais difícil do que se tornar um gerente, pois em geral este último depende mais de tempo de experiência e ter um bom de relacionamento interpessoal, enquanto o primeiro precisa se especializar por anos e anos a fio.
Outro problema é que poucas empresas tem um plano de carreira para arquitetos que se equipara com o gerencial. Então os desenvolvedores ficam em segundo plano. Em razão disso, sempre recomendo para quem quer crescer tecnicamente, que escolha uma empresa de tecnologia e não as que vendem homens/hora.
Complexidade vs Complicado
Concordo plenamente com o Vini. Esse conceito é sentido na prática e provado na teoria. Leia o Mythical Man Month do Brooks, de 1975, ele já falava sobre a complexidade inerente do software. Há regras de negócio que são inerentemente complexas e vão resultar em código complexo.
Claro que, se pensarmos em nível de loops e condicionais, nada é realmente complicada, mas se considerarmos o nível de algoritmo, basta ver como existem algoritmos complicados. Você pode ter 50 anos de experiência em programação e conhecer todas as linguagens, mas se alguém lhe pedir para resolver o problema do Caixeiro Viajante, por exemplo, de anda adianta tudo isso. Para um problema complexo, é necessário um algoritmo complexo que, mesmo sendo implementado com um código simples, não é inteligível para a maioria dos programadores.
Porém, mesmo um código extremamente complexo pode ser quebrado em blocos mais simples. Você pode dividir uma implementação muito grande e complexa em diversas módulos, classes e métodos. Cada método por ser ser tão simples quanto um código que alguém no primeiro ano de faculdade pode escrever, porém a complexidade está na forma como os objetos se relacionam, nos padrões arquiteturais adotados e assim por diante.
Especialização em tecnologia
Encontrei várias afirmações muito interessantes neste tópico sobre esse assunto. Eu concordo que quem é bom tecnicamente, possui bom fundamentos e tem experiência na área, não deve e geralmente não fica preso a uma tecnologia. Eu tenho as minhas dúvidas sobre pessoas que só sabem Java, só sabem Ruby ou até só sabem Hasckell. Todos os bons desenvolvedores que conheço sabem se virar com outras tecnologias, mesmo que em geral se especializem mais em uma ou duas.
Ontem mesmo um colega aqui da empresa pegou um projeto pequeno de manutenção de código VBA criado em 1997, em uso até hoje por um setor de uma instituição financeira, e veio me pedir ajuda porque ele não conhecia nada da linguagem. Eu programei em VBA por volta do ano 2000 brincando com o Visual Basic 4/6 fazendo joguinhos. Mesmo assim consegui ajudá-lo a criar um código relativamente complexo, um parser de uma planilha Excel, o qual ficou consideravelmente organizado e flexível, não porque eu lembrasse muito de VBA, mas porque toda a minha carga de programação fez com que não tivesse dificuldade alguma de usar essa linguagem.
Java defasado?
Java não vai virar um Cobol tão cedo porque ele ainda compete com todas as linguagens mais modernas. Eu concordo que a sintaxe da linguagem é verbosa, possui limitações e muitas vezes é desagradável criar certos tipos de estruturas que em outras linguagens você tem abstrações e syntax sugars bem legais.
Porém, a vantagem do Java é que ele é fácil de aprender, justamente pela sintaxe não permitir construções absurdamente complexas como em linguagens funcionais. E mesmo que você queira fazer isso, você pode rodar praticamente qualquer linguagem dentro da JVM (Ruby, Python, JavaScript, Scala, …). O maior acerto, em minha opinião, da arquitetura do Java foi não tentar vencer outras linguagens, mas juntar-se à elas.
Além disso, os frameworks Java como play! e Spring Boot/Roo fazem praticamente tudo o que frameworks mais modernos como Rails fazem. E você consegue ainda trazer todos os recursos do Java também, além da performance que (por enquanto) é bem melhor.
Enquanto as tecnologias Java conseguirem competir de igual para igual com as tecnologias alternativas, não há razão para imaginar que o Java vai virar um gigante legado. Talvez as aplicações feitas com EJB 2, milhares de linhas de XML e similares possam ocupar esse papel, mas ao mesmo tempo é possível utilizar as tecnologias de ponto usando a mesma plataforma. Isso acaba sendo uma grande vantagem!
Além disso, sinceramente não vejo nada de inovador em muitas das tecnologias que alguns xiitas defendem. Um exemplo: não há motivo técnico porque Rails é melhor melhor do que um framework Java como Spring. Pode ser mais legal, escrever um pouco menos de código a princípio, mas no decorrer de meses e anos não creio que a produtividade seria tão diferente. Além disso, Rails resolve um problema muito específico do desenvolvimento de software. A maioria das tecnologias da moda só resolvem um problema muito específico e, a partir do momento em que começam a crescer e a amadurecer, geralmente elas incorrem nos mesmos problemas que as tecnologias existentes.
Só vou acreditar que o Java está realmente ultrapassado quando surgir um paradigma de desenvolvimento largamente usado que não seja atendido bem por esta plataforma.
Dito isto, sugiro fortemente e urgentemente que quem só sabe Java aprenda mais uma ou duas plataformas para sair fora da caixa. :D[/quote]
E parabéns por ir para a Atlassian. Sou fã de carteirinha dos produtos deles.