Tendo um blog com razoável acesso por estudantes, tendo treinado e ajudado diversos estagiários e desenvolvedores juniores, participando ativamente de comunidades como o Stack Overflow em Português e tendo lecionado sobre desenvolvimento de sistemas web em duas faculdades, conheço muito bem as dificuldades enfrentadas por muitos daqueles que estão lutando para dar seus primeiros passos com programação.

Neste artigo, quero lhe dar algumas dicas para seu desenvolvimento profissional, baseando-me em minha própria experiência.

Requisitos para ser um bom programador

Obter a experiência relevante

Um bom programador não nasce do dia para a noite. Algo a ter em mente ao perseguir carreira em desenvolvimento de software é que este é um plano para muitos anos.

Para você ter uma ideia, já citei algumas vezes aqui que um grande mentor que eu tive costumava dizer que um programador sênior precisa ter pelo menos 10 anos de experiência efetiva. Note: 10 anos repetindo o que você aprendeu no primeiro não conta. 😛

Umas das principais razões de existirem muitos programadores seniores que não sabem programar, gerentes que não sabem gerenciar e líderes técnicos que não sabem liderar é porque eles tomaram algum atalho no meio do caminho que não passou pelo mérito de exercerem tal função, portanto a executam de uma perspectiva imatura e ineficiente.

Se você não quer se tornar um destes casos, tenha em mente que a verdadeira recompensa requer esforço.

Aprender o básico

Todo bom programador deve apresentar algumas características. Por exemplo:

  • Dominar uma linguagem de programação e conhecer algumas outras superficialmente.
  • Dominar um paradigma de programação e conhecer alguns outros.
  • Dominar um conjunto de bibliotecas e ferramentas e ter conhecimento da existência de outros.
  • Ser capaz de resolver problemas aplicando os conhecimentos anteriores.

A razão disto é que um bom programador deve:

  • Conseguir resolver bem todos os problemas usando seu arsenal próprio.
  • Ter consciência das limitações do seu conhecimento e do seu "poder de fogo".
  • Identificar tecnologias alternativas que poderiam resolver melhor alguns problemas e decidir se vale a pena aprender alguma coisa nova.

Portanto, da primeira lista podemos extrair alguns passos para se tornar um bom programador, por exemplo:

  1. Estudar a sua linguagem preferida a fundo.
  2. Absorver boas práticas de quem é mais experiente.
  3. Aprender a resolver problemas técnicos comuns nesta linguagem.
  4. Entender como resolver problemas de negócios nesta linguagem.
  5. Conhecer alternativas para o que você já aprendeu.

Vou revisitar cada um desses passos adiante.

Use as ferramentas adequadamente

Livros são ferramenta de aprendizado. Quando eu mencionar, a seguir, alguns livros para estudo, tenha em mente de que não adianta ler tudo de capa-a-capa, rapidamente, em um mês e nem mesmo em um ano.

Primeiro, você nem deve ler a maioria dos livros de capa-a-capa, mas aprender a extrair aquilo que é importante para você, sem ter dó de pular aqueles capítulos que não servem para muita coisa no momento.

Segundo, é importante seguir o seu ritmo de absorção. Algumas pessoas, como eu, são meio lerdas para aprender. Neste caso é melhor ler os livros mais didáticos antes de pular para algo mais avançado. Outras pessoas são excepcionais para aprender. Elas podem apenas “bater o olho” nos materiais mais básicos e depois ir logo para os mais avançados. Entre cada leitura, é precisa aplicar os conceitos, para você não virar aquele cara “sabe tudo” na teoria e pouco ou nada na prática.

Quanto a ferramentas como IDEs, bibliotecas e frameworks, prefira usar aqueles que você tem algum contato no dia-a-dia. Não perca tempo pesquisando se Netbeans é melhor que Eclipse ou vice-versa. Use aquele que você já tem alguma prática.

Bons programadores, uma vez dominando os conceitos básicos, geralmente não tem dificuldade em se adaptar a novas ferramentas. Além do mais, não adianta nada aprender coisas novas se a sua produtividade no trabalho não evoluir.

Dicas práticas

Durante minha caminhada como desenvolvedor, principalmente no que se refere aos primeiros passos, houve algumas coisas que, mesmo não sendo das mais avançadas, representam marcos importantes para mim.

Já escrevi bastante aqui sobre minha pós-graduação (inclusive você pode ler aqui no blog uma série de artigos com a minha monografia), meus experimentos sociais com sites como o Stack Overflow em Português e outras técnicas de aprendizagem.

Neste artigo vou me dedicar aos materiais de leitura e estudo individual que foram e ainda são importantes para mim, os quais você pode aproveitar para se tornam um bom programador. Também incluo os conhecimentos essenciais que identifiquei em cada “nível” conforme minha própria experiência.

Como o conteúdo é baseado em minha experiência, a indicação de material é voltada para a linguagem Java, mas nem tudo. Se você prefere outra linguagem, o conteúdo ainda é interessante, pois descrevo gradualmente como é a evolução de um desenvolvedor. Além disso, você pode trocar os livros específicos por algum equivalente na sua linguagem.

Estudando Java

Se você quer se dizer um programador Java de verdade, há dois livros que você deve conhecer.

Use a Cabeça! Java

use-a-cabeca-java

A série Use a Cabeça! (Head First, em Inglês) tem a proposta de ensinar usando um método que ajuda você a absorver o conteúdo facilmente. Em geral, os livros tem linguagem simples e didática.

O conteúdo é apresentado passo-a-passo, praticamente em câmera lenta, usando estórias, ilustrações, diálogos e piadas, de forma que, se você tem dificuldades com aqueles cursos que já chegam colocando código na sua frente, você realmente vai apreciar a explicação de cada detalhe básico e “óbvio” da linguagem.

Após a leitura de um livro Use a Cabeça! a sua reação em geral vai ser: sou muito burro, como eu não entendia isso antes?! 😛

Mesmo quem já programa um pouco em Java, mas não tem ideia do que significa public static void main(String[] args), este livro é para você.

Algo contra a séria Use a Cabeça! é que os livros estão um tanto defasados em relação às últimas mudanças e práticas, afinal eles já têm alguns anos de estrada. Mas, em minha opinião, ainda acho que vale a pena para quem prefere ir devagar e quer bastante detalhes no começo. Apenas tenha em mente que algumas coisas que você ler ali podem estar diferentes em relação a outros conteúdos mais novos.

Outro problema da série é que em geral o livro apresenta apenas um conteúdo introdutório, deixando de lado ou passando rapidamente por temas mais complexos. Na verdade, isso até faz sentido, já que se a ideia é explicar com calma, não haveria espaço para adentrar em todos os assuntos de livros mais resumidos.

Particularmente eu não li este livro de capa a capa. Já conhecia um pouco da linguagem quando tive contato com ele, portanto passei batido nas partes que eram óbvias.

Java – Como Programar

java_como_programar

Este é outro clássico para aprender a linguagem de forma abrangente. O livro foi atualizado diversas vezes. A capa acima é da oitava edição.

Na edição que eu tive acesso, o conteúdo era bem dividido por capítulos. Portanto, você podia estudar coleções (List, Set, Map, …), Entrada/Saída (I/O), Multi-threading e outros assuntos de forma isolada.

Também não consumi o livro inteiro, particularmente os capítulos que envolviam interface gráfica com Swing. Se você já tiver uma base em Java, poderá passar rápido por uma boa parte do livro.

Estudando para certificação

Certificar-se numa linguagem de programação, antes de tudo, é um exercício de disciplina.

Tenho alguns certificados e a única coisa que ganhei com eles foi o conhecimento agregado e saber que tenho o mérito de ter passado nas provas.

Uma coisa que eu sempre repito: não perca seu tempo nem o seu dinheiro fazendo a certificação usando “cola” ou algum tipo de trapaça. Não vai fazer diferença e pode até ser pior, acredite.

Eu e vários colegas que conheço, se pegamos numa entrevista algum moleque metido a besta que coloca a certificação no currículo e não responde a perguntas relevantes do tema, rejeitamos o candidato na hora! 😛

Por outro lado, acredito que faz bem para você se auto-impor uma rotina de estudos de forma a cobrir uma linguagem ou tecnologia de forma abrangente.

Outra coisa sobre certificação: depois você descobre que, embora o conteúdo seja grande e difícil de estudar completamente, ele não passa da ponta do iceberg do que você precisa saber na prática. É só pensar que as certificações básicas de Java não tratam de nenhum framework. Mesmo a certificação para Java Web apenas fica no básico do protocolo HTTP e na API Servlets e JSPs, que é bem pouco utilizada diretamente no dia-a-dia, embora sirva de fundamento para quase todos os frameworks web.

Não irei recomendar um material específico para certificação porque daria outro artigo. As versões dos livros que usei no passado estão defasadas. E se você entrar pelo caminho da certificação vai ter muito o que pesquisar, encontrar um livro é o mais básico.

Aprendendo boas práticas de programação

No tópico anterior, cobri o básico sobre a linguagem Java.

— Mas como assim?! Já tenho leitura para um ano e quer dizer que era só o primeiro passo?!

Exato!

Depois que você estiver conseguindo codificar sem ficar a todo momento copiando código de outro lugar, você atingiu apenas o primeiro nível.

O segundo nível é escrever código direito e parar com essas gambiarras nojentas que eu sei que você anda fazendo. 😀

Java Efetivo

java-efetivo-2nd

Agora que você conhece as ferramentas, aprenda a usá-las de forma organizada e resolver os problemas propriamente.

Esta é a proposta do livro Java Efetivo. Saber quando e como aplicar os recursos da linguagem sem causar efeitos colaterais indesejados, cair em “pegadinhas do malandro” (design ruim) que os projetistas da linguagem deixam ali para você, tudo de forma eficiente.

Código Limpo

codigo-limpo

Além da linguagem, existem vários aspectos abstratos que influenciam na qualidade do código, que vão desde os nomes das variáveis que você escolhe e a quantidade de espaços que você usa para tabulação até usar técnicas de desenvolvimento orientado a testes para manter o código funcionando sempre.

Livros como este não pretendem ser um conjunto de regras estrito. O importante é que, para ser um programador maduro, em algum momento você precisa refletir sobre cada aspecto da criação de um software e então adotar um conjunto de práticas que você sabe que resultarão num código melhor.

Neste nível você já pode começar a pensar em criticar os códigos dos outros, mas só tome cuidado porque os outros podem ter acesso ao histórico do seu código no repositório. 😛

Aprendendo a resolver problemas técnicos complexos

No segundo nível, abordado no tópico anterior, você deve ser capaz de aplicar corretamente as “ferramentas” da linguagem Java para resolver problemas específicos.

Entretanto, você deve ter notado duas coisas:

  1. Muitos problemas se repetem e, talvez, você resolva eles de forma diferente em cada instância.
  2. Programar apenas usando a API básica do Java (Java SE) não é o que se faz na grande maioria das empresas.

Use a Cabeça! Padrões de Projetos

use-a-cabeca-padroes-de-projetos

Padrões de Projetos são uma forma de comunicar soluções conhecidas para problemas comuns.

Eles não devem ser encarados como dogmas que você deve aplicar sempre exatamente do jeito que foram apresentadas, mas são uma boa maneira de você começar a pensar em mais alto nível.

No começo, o programador tende a pensar em termos de classes e métodos. Com padrões de projetos, você começa a pensar mais em abstrações e como melhorar a interação e a comunicação entre os diversos objetos no seu programa.

Estudar padrões de projetos, mais do que tentar fazer você sair aplicando esses padrões onde você não deveria, significa aprender a pensar sobre certos problemas sob uma nova ótica. É uma experiência enriquecedora, mas principalmente se você entender as razões pelas quais cada padrão de projeto foi "inventado".

Use a Cabeça! Servlets & JSPs

use-a-cabeca-servlets-jsp

Este livro era bastante usado para obter a certificação de Java Web. Não que ele ensine tudo sobre Java Web, mas ele dá a base necessária para você entender os mecanismos básicos que regem virtualmente todas as aplicações Java Web.

Mesmo frameworks avançados como Spring Boot e JSF e APIs como JAX-RS e JAX-WS são baseados na API de Servlets. O uso de JSP tem caído bastante, mas ainda é bastante utilizado nas empresas.

Sair do código exclusivamente local – que executa somente no seu computador – e entrar no mundo web é uma mudança de paradigma que pode dar um nó na sua cabeça no começo, mas certamente vale a pena.

Embora Servlets e JSPs sejam apenas o começo, eles permitem você entender coisas básicas, por exemplo, porque você precisa colocar aquele trecho de código no seu web.xml para configurar tal framework.

Este livro também está um pouco defasado, mas mesmo com as versões novas da API Servlets, os princípios permanecem os mesmos. Algumas funcionalidades avançadas foram adicionadas, tal como servlets assíncronos, server push e configuração por anotações, mas conhecendo o básico, basta complementar os tópicos avançados com alguma leitura adicional, por exemplo lendo alguns artigos na Internet.

Aprender a usar as tecnologias Java Web é um passo fundamental para um programador Java completo e vai permitir você sentir um pouco mais do poder da plataforma Java. Talvez você tenha ouvido críticas com relação à linguagem Java, tal como ter poucas funcionalidades novas, sintaxe verbosa (muito código para pouco resultado), etc. Entretanto, existe uma razão para que a maioria das linguagens sendo criadas hoje executarem justamente na Máquina Virtual Java. O que faz do Java algo “grande” é a plataforma como um todo, o que inclui a JVM e toda a base de código, bibliotecas e frameworks que executam ali dentro.

Resolvendo problemas de negócios

Neste nível, você deve descobrir que ser um excelente programador não é o bastante. Eu sei que pode ser um choque, mas…

ninguém paga você para escrever código, eles querem que você resolva os problemas dos clientes!

Houve uma época em que o número de linhas de código signifiva alguma coisa para um projeto de software. Os desenvolvedores tinham orgulho ao atingir marcas como dez mil, cem mil ou um milhão de linhas de código. Mas isso já faz algumas décadas.

O que importa hoje são as funcionalidades que você entrega e são usadas pelos usuários.

Para lidar com tudo isso, o programador precisa vestir, ainda que um pouco, o chapéu de um analista, entender bem os requisitos e implementar aquilo que é necessário.

Algo que me faz “subir o sangue” é ver um programador olhar para o analista, gerente ou mesmo para o cliente, com um olhar cínico, e dizer “mas foi você quem pediu assim”, mesmo quando ele sabia perfeitamente que estava implementando algo que não era o necessário.

Faça um favor a si mesmo e aos que trabalham com você: aprenda a resolver os problemas e criticar (no bom sentido) quando lhe passam tarefas que não fazem sentido.

Talvez você não faça ideia, mas a maioria dos analistas de negócios e ainda mais os clientes não tem base técnica relevante (ou não atualizada), portanto as ideias e críticas de um bom programador podem fazer toda a diferença entre um projeto de software fadado ao fracasso e um que seja viável.

Head First: Análise

use-a-cabeca-analise-de-projetos

Este livro ajuda você a pensar sobre um problema, começando pela necessidade de alguém, depois o guia pelo caminho de modelar uma solução e melhorá-la incrementalmente na medida em que o “cliente” lhe dá um retorno ou muda de ideia.

Pelo que me recordo, o conteúdo é bem leve e fácil de acompanhar. Além do que valeu muito a pena o exercício mental das histórias fictícias do livro. Eu terminei a leitura querendo projetar uma dúzia de sistemas diferentes. 🙂

Soluções alternativas

Conhecendo os diversos frameworks e bibliotecas

Como já afirmei, Java não é o Java apenas pela linguagem em si, mas pela plataforma e tudo o que a cerca.

Me lembro de ser questionado uma vez sobre como poderíamos fazer o sistema da empresa numa tecnologia mais nova. Só então eu percebi que, por melhor programador que eu fosse, não conhecia as alternativas mais novas e melhores para desenvolver sistemas.

A partir daquele dia, comecei uma jornada analisando todas as APIs, frameworks e bibliotecas que eram bastante usados e conhecidos. Lembro de ter começado por:

E em cada caso, fazia algumas perguntas:

  • Como cada um funciona?
  • Qual o paradigma?
  • Quais as vantagens e desvantagens do ponto de vista técnico e também do ponto de vista do paradigma adotado?
  • Quais os riscos, limitações, restrições, problemas e reclamações comuns?
  • Quão fácil é o ciclo de desenvolvimento, teste e entrega?
  • E o desempenho para grandes volumes de dados?

Para pensar numa nova arquitetura:

  • Como resolver todos os requisitos num novo sistema?
  • Qual tecnologia para gerar relatórios?
  • Como gerar as páginas HTML de forma eficiente e reusável?
  • Como atualizar o sistema de forma confiável?
  • Como testar todos os aspectos do sistema de forma automatizada?
  • Etc.

Depois de pelo menos um ano estudando tudo isso, você deve estar começando a chegar perto de ser um arquiteto Java (júnior, pois um arquiteto ainda precisa de muita prática).

Nesta fase eu não usei livros. Na verdade, a evolução dos diversos frameworks e bibliotecas é mais veloz do que a escrita e a publicação de novos livros. A documentação deve ser suficiente para você pelo menos entender como a biblioteca ou framework funciona e deve conter um guia para uso básico. Se a documentação do produto não for boa, pense duas ou três ou quatro vezes antes de adotá-lo para alguma coisa séria.

Outras linguagens

No nível quatro, apresentado no tópico anterior, você já deve ser um desenvolvedor Java completo, capaz de enfrentar qualquer projeto e ajudar a resolver os problemas do cliente de forma ativa, talvez até melhor que alguns analistas.

Entretanto, você deve ter alguns amigos desenvolvedores que utilizam outras tecnologias que parecem misteriosas e estranhas. Alguns devem ser programadores front-end ou que usem outros stacks de tecnologia envolvendo PHP, Ruby on Rails, Python, Go, .NET e assim por diante.

Pois chegou a hora de você ficar mais amigo deles e ir atrás de conhecimentos mais abrangentes. Como eles resolvem os mesmos problemas que você resolve em Java utilizando-se das tecnologias que eles conhecem bem?

Em alguns casos, você vai se surpreender como é fácil pular de uma linguagem para outra quando você conhece bem as regras de negócio e domina os fundamentos gerais da programação. Há exceções, seja por ter um código ruim ou um paradigma muito diferente de programação que você não está acostumado, mas nunca é impossível.

Algo engraçado, é que às vezes você acha que só a linguagem com que você trabalha tem muitas gambiarras e problemas, principalmente depois de ver aquela palestra de como a linguagem X++ revolucionou a vida do palestrante e da empresa onde ele trabalha. Com o tempo (pergunte aos seus colegas) você descobre que cada linguagem e cada plataforma estão repletas de maus programadores e de código muito ruim, quase impossível de dar manutenção. 🙂

Programando para a Web

Na minha caminhada, o maior diferencial, além de ser um bom programador, foi conhecer tecnologias web.

Se eu tivesse que escolher hoje, novamente, uma coisa para aprender a mais, seria JavaScript e programação web em geral. De longe foi a coisa mais útil para mim e deve ser para um desenvolvedor comum, a menos que você queira se especializar em algo específico e não trabalhar no “mercado” de software.

Entretanto, eu nunca estudei um livro completo de JavaScript. Construí a maior parte do meu conhecimento consultando fontes diversas sobre particularidades da linguagem. Isso foi ruim, em parte, pois levei muitos anos para chegar a um conhecimento sólido na linguagem, mas você pode fazer diferente.

Não irei recomendar um livro, pois não conheço nenhum recente que se destaque, mas recomendo você a procurar algum.

Além disso, desenvolvimento web é algo que muda muito rápido, com todos esses navegadores competindo e novos padrões como os do HMTL5 surgindo a todo momento. Portanto, não basta conhecer a linguagem, você deve estar sempre que possível acompanhando as novidades.

Muita gente escreve sobre o assunto, mas as principais fontes que me vêm à mente agora, que tem artigos bem completos e profundos sobre o assunto, são do site HTML5 Rocks (que mais recentemente foi movido para um site do Google chamado Web Fundamentals – Fundamentos da Web) e do blog do David Walsh. Uma fonte de consulta obrigatória para APIs específicas é o Mozilla Developer Network. Há ainda outras referências interessantes como o caniuse.com – que mostra quais tecnologias são suportadas por cada navegador – e este HTML5 Cheat Sheets – contendo uma referência completa sobre HTML.

Da mesma forma que no estudo de bibliotecas e frameworks Java, existem inúmeras bibliotecas e frameworks JavaScript que são importantes de conhecer. Por exemplo, jQuery é obrigatório pois é largamente usado, ainda que não seja a opção mais moderna. Angular e React estão bastante em evidência, mas seu uso é mais complexo, você precisa ter uma boa base em programação e JavaScript para usá-las direito.

Há um arsenal completo de ferramentas de todo tipo para JavaScript. Vou parar por aqui para não criar um artigo dentro do outro. Só irei mencionar mais uma vantagem de conhecer tudo isto: você pode executar JavaScript no servidor usando Node.js e assim reaproveitar este conhecimento para criar rapidamente serviços web leves.

Para renderizar uma interface gráfica decente sem começar do zero, existem muitos frameworks como Bootstrap, jQuery UI e Foundation, sem falar em inúmeras bibliotecas que fornecem componentes responsivos e padronizados. Conhecer tudo é impossível. Sugiro olhar as demonstrações que cada uma oferece, o conjunto de componentes oferecidos e analisar a atividade do repositório. Dificilmente uma biblioteca gráfica vai atender todas as necessidades de um projeto razoavelmente complexo, então é sempre bom analisar se é possível estender os componentes.

Conhecendo outros paradigmas

Aprender uma linguagem funcional é interessante. Ajuda muito a pensar no código de forma diferente.

Percebo que pessoas que não tiveram contato com o paradigma funcional tendem a criar código menos robusto e mais emaranhado, cheio de ifs e elses. Tal paradigma ajuda você a pensar em um programa menos como uma sequência de passos que vão definindo e lendo valores e mais como um conjunto de operações que transformam certas coisas em coisas diferentes.

Claro que existe o outro lado. Algumas pessoas que tiveram contato com o paradigma funcional escrevem código muito difícil de compreender. Mas este é um mal que se cura puxando a orelha e pedindo pra reescrever a coisa direito! 😀

Scala é uma boa alternativa por ser próxima do Java e fácil de integrar na Máquina Virtual Java. Mas a linguagem em si não importa. Se tiver contato com algum programador com experiência em tal paradigma, não perca a oportunidade.

Não esqueça da lógica!

Por último, mas não menos importante, quero lembrar que lógica – tanto na programação na vida em geral – é algo extremamente necessário.

Em programação, não adianta nada falar em código limpo se você não consegue acompanhar um fluxograma ou algoritmo, isto é, uma sequência de passos para resolver um problema.

Quando estive na faculdade, a professora de algoritmos passou 4 listas de exercícios, cada uma contendo aproximadamente 150 itens, que consistiam em algo como “Faça um programa que imprima os números de 1 a 10” ou “Faça a versão iterativa do algoritmo de fibonacci”.

Ao invés de “dividir” o trabalho como a maioria fazia ou mesmo copiar (dizia a lenda que a professora nem olhava o que era entregue), eu decidi encarar o desafio e fazer todos os exercícios. No começa eu ia devagar, mas quando já estava lá pelos 300 ou 400, escrevia o código tão rápido que muitas vezes eu terminava um exercício e quando percebia já estava terminando o próximo.

Se você tem problemas com lógica, luta com laços e condicionais, minha sugestão é treinar. Algumas pessoas tem mais facilidade, mas em geral programadores precisam escrever muito código para dominar as construções da linguagem com fluidez. Você pode esperar fazer isso ao longo de alguns anos – e assim postergar as promoções – ou pode treinar agora e partir para coisas mais avançadas logo.

Além da programação, a lógica ajuda no dia-a-dia em geral, para tomar decisões, analisar problemas, investigar hipóteses. Se você tem dificuldades analíticas nesse sentido, infelizmente não existe solução mágica. O conselho que eu sempre dou é: desligue a TV e o vídeo-game, descanse a cabeça e leia alguns livros bons – de preferência clássicos, nada de novelas de vampiros ou bruxos, por favor. 😀

Considerações

Este artigo pretende lhe dar alguma base de estudos se você está num caminho similar ao meu, afinal foi bastante baseado em minhas próprias experiências.

Tentei cobrir áreas de estudo desde os níveis mais básicos até os mais avançados. Independentemente do nível em que você se encontra, é importante compreender que o caminho para o “sucesso” profissional, que é diferente de promoção por tempo de carreira, é longo e exige esforço constante.

Caso você não tenha notado, modelei os passos de estudo em 5 níveis diferentes, listados no começo do artigo e então detalhados nos tópicos e subtópicos subsequentes. O tempo mínimo para dar esses grandes passos, em minha opinião, são 5 anos, um para cada nível, mais ou menos. Tempo é necessário porque todo estudo precisa ser digerido e regado com prática e experiência em projetos. Eu me lembro de dedicar alguns meses apenas lendo livros e depois passar resto do ano sem ler muito, tentando implementar (tanto em software quanto na vida real) as coisas que havia aprendido.

Além disso, esse tempo mínimo é apenas uma indicação. Não há vergonha alguma em demorar 10 ou 15 anos para chegar ao último nível como proposto aqui. Nem em mudar de área no meio do caminho, talvez tornando-se um analista funcional, líder ou gerente. Lembre-se: tudo aqui é apenas uma sugestão baseada na experiência de uma pessoa. Adapte-a para a sua situação.

Finalmente, para reforçar, faça tudo no seu ritmo, mas faça!